Можно ли использовать MPI_Publish_name для двух отдельно запущенных приложений?

Я пишу приложение OpenMPI, которое состоит из серверной и клиентской частей, которые запускаются отдельно:

me@server1:~> mpirun server

а также

me@server2:~> mpirun client

server создает порт, используя MPI_Open_port, Вопрос в том, есть ли у OpenMPI механизм для связи порта с client? Я предполагаю, что MPI_Publish_name а также MPI_Lookup_name здесь не работает, потому что server не знал бы, на какой другой компьютер информация должна быть отправлена.

Для меня это похоже только на процессы, которые были запущены с использованием одного mpirun может общаться с MPI_Publish_name,

Я также нашел ompi-сервер, но документация слишком минималистична, чтобы я мог это понять. Кто-нибудь знает, как это используется?

Связанный: MPICH: Как опубликовать_имя, чтобы клиентское приложение могло его искать? и https://stackru.com/questions/9263458/client-server-example-using-ompi-does-not-work

1 ответ

Решение

MPI_Publish_name поставляется с информационным объектом MPI, который может иметь специальный логический ключ Open MPI ompi_global_scope, Если для этого ключа установлено значение true, то имя будет опубликовано в глобальной области, т. Е. Уже запущенном экземпляре ompi-server, MPI_Lookup_name по умолчанию сначала выполняется поиск глобального имени, если URI ompi-server был предоставлен.

С выделенным Open MPI-сервером

Процесс включает в себя несколько этапов:

1) Запустите ompi-server где-то в кластере, где он может быть доступен со всех узлов. В целях отладки вы можете передать его --no-daemonize -r + аргумент. Он запустится и выведет на стандартный вывод URI, похожий на этот:

$ ompi-server --no-daemonize -r +
1221656576.0;tcp://10.1.13.164:36351;tcp://192.168.221.41:36351

2) На сервере создайте информационный объект MPI и установите ompi_global_scope ключ к истине:

MPI_Info info;

MPI_Info_create(&info);
MPI_Info_set(info, "ompi_global_scope", "true");

Затем передайте информационный объект MPI_Publish_name:

MPI_Publish_name("server", info, port_name);

3) В клиенте звонок на MPI_Lookup_name сначала автоматически выполнит поиск в глобальном контексте (это можно изменить, указав правильный ключ в информационном объекте MPI, но в вашем случае поведения по умолчанию должно быть достаточно).

Чтобы код клиента и сервера знал, где находится ompi-server расположен, вы должны дать его URI обоим mpirun Команды с --ompi-server 1221656576.0;tcp://10.1.13.164:36351;tcp://192.168.221.41:36351 вариант.

Другой вариант - иметь ompi-server записать URI в файл, который затем можно прочитать на узле (ах), где mpirun должен быть запущен. Например, если вы запускаете сервер на том же узле, где оба mpirun команды выполняются, то вы можете использовать файл в /tmp, Если вы начнете ompi-server на другом узле, тогда подойдет общая файловая система (NFS, Lustre и т. д.). В любом случае, набор команд будет:

$ ompi-server [--no-daemonize] -r file:/path/to/urifile
...
$ mpirun --ompi-server file:/path/to/urifile server
...
$ mpirun --ompi-server file:/path/to/urifile client

Безсерверный метод

Если запустить оба mpirunнаходится на том же узле, --ompi-server также можно указать PID уже запущенного mpirun экземпляр, который будет использоваться в качестве сервера имен. Он позволяет вам использовать локальную публикацию имен на сервере (т.е. пропустить части "запустить омпи-сервер" и "создать информационный объект"). Последовательность команд будет такой:

head-node$ mpirun --report-pid server
[ note the PID of this mpirun instance ]
...
head-node$ mpirun --ompi-server pid:12345 client

где 12345 должен быть заменен реальным PID сервера mpirun,

Вы также можете иметь сервер mpirun распечатать его URI и передать этот URI клиенту mpirun:

$ mpirun --report-uri + server
[ note the URI ]
...
$ mpirun --ompi-server URI client

Вы также можете записать URI в файл, если указать /path/to/file (примечание: нет file: префикс здесь) вместо + после --report-uri опция:

$ mpirun --report-uri /path/to/urifile server
...
$ mpirun --ompi-server file:/path/to/urifile client

Обратите внимание, что URI возвращается mpirun имеет тот же формат, что и ompi-serverт.е. он включает в себя IP-адрес хоста, поэтому он также работает, если второй mpirun выполняется на другом узле, который может общаться с первым узлом через TCP/IP (и /path/to/urifile живет в общей файловой системе).

Я протестировал все вышеперечисленное с помощью Open MPI 1.6.1. Некоторые варианты могут не работать с более ранними версиями.

Другие вопросы по тегам