MPI_Publish_name
提供了一个 MPI 信息对象,它可能有一个 Open MPI 特定的布尔键ompi_global_scope
。如果此键设置为 true,则名称将发布到全局范围,即发布到已运行的ompi-server
. MPI_Lookup_name
默认情况下,如果提供了 URI,则首先进行全局名称查找ompi-server
。
使用专用的 Open MPI 服务器
该过程涉及几个步骤:
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 info 对象并将ompi_global_scope
key 设置为 true:
MPI_Info info;
MPI_Info_create(&info);
MPI_Info_set(info, "ompi_global_scope", "true");
然后将信息对象传递给MPI_Publish_name
:
MPI_Publish_name("server", info, port_name);
3)在客户端,调用MPI_Lookup_name
将首先在全局上下文中自动进行查找(这可以通过在 MPI 信息对象中提供正确的键来更改,但在您的情况下,默认行为就足够了)。
为了让客户端和服务器代码都知道它的ompi-server
位置,您必须将其 URI 提供给带有选项的两个mpirun
命令。--ompi-server 1221656576.0;tcp://10.1.13.164:36351;tcp://192.168.221.41:36351
另一种选择是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
where12345
应该替换为服务器的真实 PID mpirun
。
您还可以让服务器mpirun
打印其 URI 并将该 URI 传递给客户端mpirun
:
$ mpirun --report-uri + server
[ note the URI ]
...
$ mpirun --ompi-server URI client
/path/to/file
如果您指定(注意:file:
此处没有前缀)而不是+
在--report-uri
选项之后,您也可以将 URI 写入文件:
$ mpirun --report-uri /path/to/urifile server
...
$ mpirun --ompi-server file:/path/to/urifile client
请注意,返回的 URImpirun
的格式与 an 的格式相同ompi-server
,即它包含主机 IP 地址,因此如果第二个mpirun
节点在不同的节点上执行,它也可以工作,该节点能够通过 TCP/IP 与第一个节点通信(并且/path/to/urifile
存在于共享文件系统上)。
我使用 Open MPI 1.6.1 测试了以上所有内容。某些变体可能不适用于早期版本。