Да, это возможно, если между узлом кластера и вашей машиной есть сетевой путь. Стандарт MPI предоставляет абстрактные механизмы для этого, в то время как Open MPI предоставляет действительно простой способ заставить все работать. Вы должны изучить раздел стандарта Process Creation and Management (глава 10 MPI-2.2) и, в частности, подраздел Установление связи (§10.4 MPI- 2.2). В основном шаги таковы:
- Вы запускаете оба задания MPI по отдельности. Это, очевидно, то, что вы делаете, так что здесь ничего нового.
- Одно из заданий создает сетевой порт, используя
MPI_Open_port()
. Этот вызов MPI возвращает уникальное имя порта, которое затем должно быть опубликовано как общеизвестное имя службы с использованием MPI_Publish_name()
. Когда порт открыт, его можно использовать для приема клиентских подключений, вызвав процедуру блокировки MPI_Comm_accept()
. Работа теперь стала работой сервера.
- Другое задание MPI, называемое клиентским заданием, сначала разрешает имя порта из имени службы, используя
MPI_Lookup_name()
. Получив имя порта, он может вызвать MPI_Comm_connect()
для подключения к удаленному серверу.
- После того, как
MPI_Comm_connect()
соединится с соответствующим MPI_Comm_accept()
, оба задания установят интеркоммуникатор между ними, и сообщения можно будет отправлять туда и обратно.
Одна сложная деталь заключается в том, как клиентское задание может искать имя порта по имени службы? Это менее документированная часть Open MPI, но она довольно проста: вы должны предоставить команду mpiexec
, которую вы используете для запуска клиентского задания, с URI mpiexec
задания сервера, которое действует как своего рода служба каталогов. . Для этого вы должны запустить серверное задание с аргументом --report-uri -
, чтобы оно вывело свой URI на стандартный вывод:
$ mpiexec --report-uri - <other arguments like -np> ./server ...
Это даст вам длинный URI вида 1221656576.0;tcp://10.1.13.164:36351;tcp://192.168.221.41:36351
. Теперь вы должны предоставить этот URI клиенту mpiexec
с опцией --ompi-server uri
:
$ mpiexec --ompi-server 1221656576.0;tcp://10.1.13.164:36351... ./client ...
Обратите внимание, что URI содержит адреса всех настроенных и включенных сетевых интерфейсов, присутствующих на узле, где запущен сервер mpiexec
. Вы должны убедиться, что клиент может связаться хотя бы с одним из них. Также убедитесь, что у вас есть компонент TCP BTL в списке включенных компонентов BTL, в противном случае никакие сообщения не будут передаваться. TCP BTL обычно включен по умолчанию, но в некоторых установках InfiniBand он явно отключен либо путем установки соответствующего значения переменной среды OMPI_MCA_btl
, либо в файле конфигурации Open MPI MCA по умолчанию. Параметры MCA можно переопределить с помощью опции --mca
, например:
$ mpiexec --mca btl self,sm,openib,tcp --report-uri - ...
Также см. ответ, который я дал на аналогичный вопрос.
person
Hristo Iliev
schedule
11.04.2013