如何在 MPICH 中使用 MPI_Info_set 和 MPI_Comm_spawn

Posted

技术标签:

【中文标题】如何在 MPICH 中使用 MPI_Info_set 和 MPI_Comm_spawn【英文标题】:How to use MPI_Info_set with MPI_Comm_spawn in MPICH 【发布时间】:2019-06-28 19:08:51 【问题描述】:

我需要在集群上使用 MPI spawn。为此,我知道我需要使用 MPI_Info_set 来指定节点将运行生成的进程。我试过MPI_Info_set(info, "add-host","node1,node2"),但它不起作用。

下面,我提供一个生成代码的小例子:

MPI_Info info;
MPI_Info_create(&info);
MPI_Info_set(info,"add-host","node1,node2");
MPI_Comm_spawn("./mpiworker", MPI_ARGV_NULL,
               dynamic_procs,
               info, 0, MPI_COMM_WORLD,
               &intercomm,
               MPI_ERRCODES_IGNORE);

还有什么我可以用的吗?

【问题讨论】:

【参考方案1】:

参数add-host可能来自OpenMPI(man page),MPICH不支持。

对于 MPICH,请尝试以下方法之一:

host - 为我工作, hosts - 应该可以工作,但是,它似乎在我当前使用的版本中被破坏了,MPI 在作为参数值传递的第一个节点处生成所有进程;如果您的情况也发生这种情况,我建议使用 MPI_Comm_spawn_multiple 为每个进程手动分配主机。

另外,我不知道如何找到所有受支持参数的列表 - 我认为 MPICH 人不太注意保持文档的完整性。

【讨论】:

【参考方案2】:

这对我有用,而不仅仅是MPI_Comm_spawn。以下代码将为每个节点生成 1 个进程。通过扩展下面输入的维度,我可以为每个节点生成更多进程。

MPI_Info info[2];

MPI_Info_create(&info[0]);
MPI_Info_set(info[0],"host","node1");

MPI_Info_create(&info[1]);
MPI_Info_set(info[1],"host","node2");

char *cmds[2] =  "./mpiworker", "./mpiworker" ;
int np[2] =  1, 1 ;
int errcodes[2];

MPI_Comm_spawn_multiple( 2, cmds, MPI_ARGVS_NULL, np, info, 0, MPI_COMM_WORLD, &intercomm, errcodes );

//Below parallel code follows
...

以上内容是在 Ubuntu-bionic 上使用 MPICH 版本:3.3a2 进行测试的。

我的示例基于以下page。如果我找到更优雅的方式,我会重新发布。

【讨论】:

以上是关于如何在 MPICH 中使用 MPI_Info_set 和 MPI_Comm_spawn的主要内容,如果未能解决你的问题,请参考以下文章

MPICH:如何publish_name 以便客户端应用程序可以lookup_name 呢?

在 MPICH 中执行混合 OpenMP/MPI 作业

我是用 OpenMPI 还是 MPICH 编译的?

设置代码块以运行 MPICH2

使用mpich搭建MPI集群

使用 CMake 编译后无法从 mpich2 使用 mpirun