我有一组计算操作需要执行一个集群(可能像512 MPI进程)。现在,我有集群上的根节点打开套接字并在计算操作之间将数据传输到本地计算机,但是我想知道是否可以创建两个MPI组,并且其中一个组是我的本地机器,另一个是远程集群,并使用MPI命令在它们之间发送数据。是否可以在本地计算机和远程集群上运行OpenMPI?
这可能吗?
我有一组计算操作需要执行一个集群(可能像512 MPI进程)。现在,我有集群上的根节点打开套接字并在计算操作之间将数据传输到本地计算机,但是我想知道是否可以创建两个MPI组,并且其中一个组是我的本地机器,另一个是远程集群,并使用MPI命令在它们之间发送数据。是否可以在本地计算机和远程集群上运行OpenMPI?
这可能吗?
是的,只要群集节点和您的机器之间存在网络路径,就有可能。 MPI标准提供了抽象机制来完成它,而Open MPI提供了一种非常简单的方法来实现这些工作。您必须查看该标准(MPI-2.2的第10章)的过程创建和管理部分,并且具体涉及建立通信012.小节(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 ...
它会给你的形式1221656576.0;tcp://10.1.13.164:36351;tcp://192.168.221.41:36351
长URI。现在你有这个URI与--ompi-server uri
选项提供给客户mpiexec
:
$ 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
选项覆盖,例如:
$ mpiexec --mca btl self,sm,openib,tcp --report-uri - ...
也看到the answer,我给了一个类似的问题。
很好的答案!谢谢! – Nick 2013-04-11 14:19:07
是的,如果存在可用的TCP/IP连接(MPI在随机的高TCP端口 - 如果TCP用作传输层进行通信),它应该只是开箱即用。尝试将您的机器添加到您提供给mpirun
的hostfile。如果这不起作用,您可以使用MPI_Open_port直接连接到您的机器,这不需要mpirun
。
我看不出有任何理由为什么不呢,除了实用的配置问题,具有NAT,代理服务器,安全,密码短语,加密,防火墙,打开/关闭的端口等等......如果你是在同一个本地网络(和真的一样,就像你的机器和集群之间只有交换机,没有路由器),应该没问题。您的下一个问题是配置mpi启动系统和本地计算机上的节点,以便mpi启动器识别。 (您需要在群集的conf文件上进行root访问)。但是,是的MPI是为不同种类的公园制作的,所以... – 2013-04-11 03:09:22