MPI_Publish_名称能否用于两个单独启动的应用程序?
我编写了一个OpenMPI应用程序,它由单独启动的服务器和客户端组成:MPI_Publish_名称能否用于两个单独启动的应用程序?,mpi,openmpi,Mpi,Openmpi,我编写了一个OpenMPI应用程序,它由单独启动的服务器和客户端组成: me@server1:~> mpirun server 及 服务器使用MPI\u Open\u端口创建端口。问题是:OpenMPI是否具有将端口与客户端进行通信的机制?我认为MPI\u Publish\u name和MPI\u Lookup\u name在这里不起作用,因为server不知道信息应该发送到哪个其他计算机 在我看来,似乎只有使用单个mpirun启动的进程才能与MPI\u Publish\u name通信
me@server1:~> mpirun server
及
服务器
使用MPI\u Open\u端口
创建端口。问题是:OpenMPI是否具有将端口与客户端进行通信的机制?我认为MPI\u Publish\u name
和MPI\u Lookup\u name
在这里不起作用,因为server
不知道信息应该发送到哪个其他计算机
在我看来,似乎只有使用单个mpirun
启动的进程才能与MPI\u Publish\u name
通信
我也发现了,但是文档太简单了,我无法理解这一点。有人知道这是怎么用的吗
相关:并且MPI\u Publish\u name
随MPI info对象一起提供,该对象可能具有打开的MPI特定布尔键ompi\u global\u scope
。如果此键设置为true,则名称将发布到全局范围,即发布到已运行的ompi服务器的实例<如果提供了ompi服务器
的URI,则默认情况下,code>MPI\u Lookup\u name
首先执行全局名称查找
使用专用的开放式MPI服务器
该过程包括几个步骤:
1) 在集群中可以从所有节点访问ompi服务器的某个位置启动该服务器。出于调试目的,您可以将--no daemonize-r+
参数传递给它。它将启动并向标准输出打印一个类似于以下内容的URI:
$ompi服务器--无守护进程-r+
1221656576.0;tcp://10.1.13.164:36351;tcp://192.168.221.41:36351
2) 在服务器中,构建一个MPI info对象,并将ompi\u global\u scope
键设置为true:
MPI\u信息;
MPI\u信息\u创建(&Info);
MPI_信息集(信息,“ompi_全局范围”、“真”);
然后将info对象传递给MPI\u Publish\u name
:
MPI\u发布名称(“服务器”、信息、端口名称);
3) 在客户端中,对MPI\u Lookup\u name
的调用将首先在全局上下文中自动执行查找(这可以通过在MPI info对象中提供适当的键来更改,但在您的情况下,默认行为应该足够了)
为了让客户端和服务器代码都知道ompi服务器
的位置,您必须使用--ompi服务器1221656576.0为mpirun
命令提供其URI;tcp://10.1.13.164:36351;tcp://192.168.221.41:36351
选项
另一个选项是让ompi服务器
将URI写入文件,然后可以在要运行mpirun
的节点上读取该文件。例如,如果在执行两个mpirun
命令的同一节点上启动服务器,则可以使用/tmp
中的文件。如果在不同的节点上启动ompi服务器
,则可以使用共享文件系统(NFS、Lustre等)。无论哪种方式,命令集都是:
$ompi服务器[--no daemonize]-r文件:/path/to/urifile
...
$mpirun--ompi服务器文件:/path/to/urifile服务器
...
$mpirun--ompi服务器文件:/path/to/urifile客户端
无服务器方法
如果在同一节点上同时运行两个mpirun
,则--ompi服务器
还可以指定已经运行的mpirun
实例的PID作为名称服务器。它允许您在服务器中使用本地名称发布(即跳过“运行ompi服务器”和“生成信息对象”部分)。命令的顺序是:
head节点$mpirun——报表pid服务器
[请注意此mpirun实例的PID]
...
头节点$mpirun--ompi服务器pid:12345客户端
其中,12345
应替换为服务器的mpirun
的实际PID
您还可以让服务器的mpirun
打印其URI,并将该URI传递给客户端的mpirun
:
$mpirun--报表uri+服务器
[注意URI]
...
$mpirun--ompi服务器URI客户端
如果在--report URI
选项后指定/path/to/file
(注意:此处没有文件:
前缀),而不是+
,则也可以将URI写入文件:
$mpirun--报告uri/path/to/urifile服务器
...
$mpirun--ompi服务器文件:/path/to/urifile客户端
请注意,mpirun
返回的URI的格式与ompi服务器的格式相同,即它包含主机IP地址,因此,如果第二个mpirun
在另一个节点上执行,该节点可以通过TCP/IP与第一个节点通信,则该URI也可以工作(并且/path/to/urifile
存在于共享文件系统中)
我使用Open MPI 1.6.1测试了以上所有内容。一些变体可能无法与早期版本一起使用。感谢您提供了这一出色的答案。您是否也知道URI/port_名称开头的浮点数是如何产生的?我只发现了,但也不是很有帮助。如果您将该数字转换为十六进制,则四位数字都是零…里面没有太多信息。端口名是特定于实现的,URI是特定于开放MPI的。OpenRTE的rml
MCA组件源代码中的注释表明URI以“进程名”开头。进一步挖掘ORTE的名称可以看出,进程名称是两个无符号长字符串的串联,格式为
。我也做了一些挖掘,但没有达到您的要求。我将“左”无符号长字符串与进程id进行了比较-它们不匹配,但很接近(例如12551和13225)。这很奇怪。初始作业ID是在PLM(流程生命周期管理)框架的base
组件中计算的。显然,该值基于启动器的PID和哈希主机名。@Z0lenDer,DeinoMPI基于MPICH an
me@server2:~> mpirun client