我编写了一个OpenMPI应用程序,它由一个服务器和一个客户端部分组成,它们分别启动:
me@server1:~> mpirun server
和
me@server2:~> mpirun client
server
使用MPI_Open_port
创建一个端口。问题是:OpenMPI是否有机制将端口传递给client
?我认为MPI_Publish_name
和MPI_Lookup_name
在这里不起作用,因为server
不知道应该向哪台计算机发送信息。
对我来说,看起来只有使用单个mpirun
启动的流程才能与MPI_Publish_name
进行通信。
我还发现ompi-server,但文档太简约了,我无法理解这一点。有谁知道如何使用它?
相关:MPICH: How to publish_name such that a client application can lookup_name it?和https://stackoverflow.com/questions/9263458/client-server-example-using-ompi-does-not-work
答案 0 :(得分:7)
MPI_Publish_name
提供了一个MPI信息对象,该对象可能具有Open MPI特定的布尔键ompi_global_scope
。如果此键设置为true,则该名称将发布到全局范围,即发布到已运行的ompi-server
实例。 MPI_Lookup_name
默认情况下,如果提供了ompi-server
的URI,则首先进行全局名称查找。
该过程包括几个步骤:
1)在群集中的某个位置启动ompi-server
,可以从所有节点访问它。出于调试目的,您可以传递--no-daemonize -r +
参数。它将启动并打印到标准输出的URI类似于这个:
$ ompi-server --no-daemonize -r +
1221656576.0;tcp://10.1.13.164:36351;tcp://192.168.221.41:36351
2)在服务器中,构建一个MPI信息对象并将ompi_global_scope
键设置为true:
MPI_Info info;
MPI_Info_create(&info);
MPI_Info_set(info, "ompi_global_scope", "true");
然后将info对象传递给MPI_Publish_name
:
MPI_Publish_name("server", info, port_name);
3)在客户端中,对MPI_Lookup_name
的调用将首先在全局上下文中自动执行查找(这可以通过在MPI信息对象中提供正确的密钥来更改,但在您的情况下是默认行为应该就够了。)
为了使客户端和服务器代码都知道ompi-server
所在的位置,您必须使用mpirun
选项为--ompi-server 1221656576.0;tcp://10.1.13.164:36351;tcp://192.168.221.41:36351
命令提供URI。
另一种选择是让ompi-server
将URI写入文件,然后可以在要运行mpirun
的节点上读取该文件。例如,如果在执行两个mpirun
命令的同一节点上启动服务器,则可以使用/tmp
中的文件。如果您在另一个节点上启动ompi-server
,那么共享文件系统(NFS,Lustre等)就可以。无论哪种方式,命令集都是:
$ ompi-server [--no-daemonize] -r file:/path/to/urifile
...
$ mpirun --ompi-server file:/path/to/urifile server
...
$ mpirun --ompi-server file:/path/to/urifile client
如果在同一节点上同时运行mpirun
,则--ompi-server
也可以指定要用作名称服务器的已运行mpirun
实例的PID。它允许您在服务器中使用本地名称发布(即跳过“运行ompi-server”和“创建信息对象”部分)。命令序列如下:
head-node$ mpirun --report-pid server
[ note the PID of this mpirun instance ]
...
head-node$ mpirun --ompi-server pid:12345 client
其中12345
应替换为服务器mpirun
的实际PID。
您还可以让服务器的mpirun
打印其URI并将该URI传递给客户端的mpirun
:
$ mpirun --report-uri + server
[ note the URI ]
...
$ mpirun --ompi-server URI client
如果您在/path/to/file
选项后指定file:
(注意:此处没有+
前缀)而不是--report-uri
,您也可以将URI写入文件:< / p>
$ mpirun --report-uri /path/to/urifile server
...
$ mpirun --ompi-server file:/path/to/urifile client
请注意,mpirun
返回的URI格式与ompi-server
格式相同,即包含主机IP地址,因此如果执行第二个mpirun
,它也可以正常工作在另一个节点上,该节点能够通过TCP / IP与第一个节点通信(并且/path/to/urifile
存在于共享文件系统上。)
我使用Open MPI 1.6.1测试了上述所有内容。某些变体可能不适用于早期版本。