MPI_Publish_name可以用于两个单独启动的应用程序吗?

时间:2013-02-21 16:18:55

标签: mpi openmpi

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

me@server1:~> mpirun server

me@server2:~> mpirun client

server使用MPI_Open_port创建一个端口。问题是:OpenMPI是否有机制将端口传递给client?我认为MPI_Publish_nameMPI_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

1 个答案:

答案 0 :(得分:7)

MPI_Publish_name提供了一个MPI信息对象,该对象可能具有Open MPI特定的布尔键ompi_global_scope。如果此键设置为true,则该名称将发布到全局范围,即发布到已运行的ompi-server实例。 MPI_Lookup_name默认情况下,如果提供了ompi-server的URI,则首先进行全局名称查找。

使用专用的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信息对象并将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测试了上述所有内容。某些变体可能不适用于早期版本。