4

我编写了一个 OpenMPI 应用程序,它由分别启动的服务器和客户端部分组成:

me@server1:~> mpirun server

me@server2:~> mpirun client

server使用 . 创建一个端口MPI_Open_port。问题是:OpenMPI 是否有机制将端口通信client?我想这在这里不起作用,因为MPI_Publish_name不知道应该将信息发送到哪台其他计算机。MPI_Lookup_nameserver

对我来说,看起来只有使用单个启动的进程mpirun才能与MPI_Publish_name.

我还找到了 ompi-server,但是文档太简单了,我无法理解。有谁知道这是如何使用的?

相关:MPICH:如何发布名称以便客户端应用程序可以查找名称?https://stackoverflow.com/questions/9263458/client-server-example-using-ompi-does-not-work

4

1 回答 1

9

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_scopekey 设置为 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 测试了以上所有内容。某些变体可能不适用于早期版本。

于 2013-02-21T17:35:22.670 回答