Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MPI_Publish_名称能否用于两个单独启动的应用程序?_Mpi_Openmpi - Fatal编程技术网

MPI_Publish_名称能否用于两个单独启动的应用程序?

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通信

我编写了一个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
通信

我也发现了,但是文档太简单了,我无法理解这一点。有人知道这是怎么用的吗


相关:并且

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