是的,这是可能的,只要集群节点和您的机器之间存在网络路径即可。 MPI 标准提供了执行此操作的抽象机制,而 Open MPI 则提供了一种非常简单的方法来使事情正常运行。你必须调查流程创建和管理标准部分(MPI-2.2 第 10 章),特别是建立沟通小节(MPI-2.2 §10.4)。基本上步骤是:
- 您分别启动两个 MPI 作业。显然这就是您所做的,所以这里没有什么新内容。
- 其中一项作业使用以下命令创建一个网络端口
MPI_Open_port()
。此 MPI 调用返回一个唯一的端口名称,然后必须使用该名称将其发布为众所周知的服务名称MPI_Publish_name()
。一旦端口打开,就可以通过调用阻塞例程来接受客户端连接MPI_Comm_accept()
。该作业现已成为服务器作业。
- 另一个 MPI 作业(称为客户端作业)首先使用以下命令从服务名称中解析端口名称:
MPI_Lookup_name()
。一旦获得端口名称,就可以调用MPI_Comm_connect()
以连接到远程服务器。
- Once
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
option:
$ mpiexec --ompi-server 1221656576.0;tcp://10.1.13.164:36351... ./client ...
请注意,URI 包含节点上所有已配置和启用的网络接口的地址,其中服务器的mpiexec
已开始。您应该确保客户至少能够联系其中之一。还要确保启用的 BTL 组件列表中包含 TCP BTL 组件,否则任何消息都无法流动。 TCP BTL 通常默认启用,但在某些 InfiniBand 安装上,通过设置环境变量的相应值来明确禁用它OMPI_MCA_btl
或在默认的 Open MPI MCA 配置文件中。 MCA 参数可以被覆盖--mca
选项,例如:
$ mpiexec --mca btl self,sm,openib,tcp --report-uri - ...
另请参阅答案 https://stackoverflow.com/a/15008715/1374437我回答过类似的问题。