Можно ли использовать 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. Некоторые варианты могут не работать с более ранними версиями.