我有一组需要在集群中执行的计算操作(可能像 512 MPI 进程)。现在,我让集群上的根节点打开一个套接字并在计算操作之间将数据传输到我的本地计算机,但我想知道是否可以只创建两个 MPI 组,其中一个是我的本地机器和另一个远程集群,并使用 MPI 命令在它们之间发送数据。
这可能吗?
我有一组需要在集群中执行的计算操作(可能像 512 MPI 进程)。现在,我让集群上的根节点打开一个套接字并在计算操作之间将数据传输到我的本地计算机,但我想知道是否可以只创建两个 MPI 组,其中一个是我的本地机器和另一个远程集群,并使用 MPI 命令在它们之间发送数据。
这可能吗?
是的,这是可能的,只要集群节点和您的机器之间有网络路径即可。MPI 标准提供了执行此操作的抽象机制,而 Open MPI 提供了一种非常简单的方法来使事情正常工作。您必须查看标准的流程创建和管理部分(MPI-2.2 的第 10 章),特别是建立通信小节(MPI-2.2 的第 10.4 节)。基本上步骤是:
MPI_Open_port()
. 此 MPI 调用返回一个唯一的端口名称,然后必须使用MPI_Publish_name()
. 一旦端口打开,就可以通过调用阻塞例程来接受客户端连接MPI_Comm_accept()
。该作业现在已成为服务器作业。MPI_Lookup_name()
. 一旦有了端口名称,它就可以调用MPI_Comm_connect()
以连接到远程服务器。MPI_Comm_connect()
与各自的 配对MPI_Comm_accept()
,两个作业将在它们之间建立一个互通器,然后可以来回发送消息。一个复杂的细节是客户端作业如何在给定服务名称的情况下查找端口名称?这是 Open MPI 中文档较少的部分,但它非常简单:您必须提供mpiexec
用于启动客户端作业的命令以及mpiexec
服务器作业的 URI,它充当一种目录服务。为此,您应该使用--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
。mpiexec
现在您必须使用以下选项将此 URI 提供给客户端--ompi-server uri
:
$ 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 - ...
另请参阅我对类似问题给出的答案。
是的,如果有可用的 TCP/IP 连接,它应该开箱即用(MPI 在随机的高 TCP 端口上通信 - 如果 TCP 用作传输层)。尝试将您的机器添加到您提供的主机文件中mpirun
。如果这不起作用,您可以使用不需要mpirun
.