我有一组需要执行集群的计算操作(可能像512 MPI进程)。现在,我让群集上的根节点打开一个套接字并在计算操作之间将数据传输到我的本地计算机,但我想知道是否可以创建两个MPI组,其中一个组是我的本地组机器,另一个是远程集群,并使用MPI命令在它们之间发送数据。
这可能吗?
答案 0 :(得分:4)
是的,只要群集节点和您的计算机之间存在网络路径,就有可能。 MPI标准提供了抽象机制,而Open MPI提供了一种非常简单的方法来使事情发挥作用。您必须查看标准的流程创建和管理部分(MPI-2.2的第10章),特别是建立通信小节(MPI的第10.4节) 2.2)。基本上步骤是:
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 ...
它将为您提供1221656576.0;tcp://10.1.13.164:36351;tcp://192.168.221.41:36351
形式的长URI。现在,您必须使用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 - ...
另请参阅the answer我给出的类似问题。
答案 1 :(得分:0)
是的,如果有可用的TCP / IP连接,它应该只是开箱即用(MPI在随机的高TCP端口进行通信 - 如果TCP用作传输层)。尝试将您的计算机添加到您提供给mpirun
的主机文件中。如果这不起作用,您可以使用不需要mpirun
的{{3}}直接连接到您的计算机。