MPI,通过其中一个过程生成一个孩子

MPI, spawning a child by one of the processes

本文关键字:一个 过程 孩子 MPI      更新时间:2023-10-16

我正在用Open MPI进行并行编程。我试图实现的是启动一个具有两个进程的应用程序(这可以通过 mpirun -n 2 实现...),并使这两个进程的第一个进程生成自身的另一个实例。下面是 c++ 中的草图:

// mpi_spawn_cpp2.cc
#include "mpi.h"
#include <iostream>
using namespace std;
int main( int argc, char *argv[] )
{
    int rank, size;
    int errcode;
    MPI::Intercomm intercomm;
    MPI::Init( argc, argv );
    rank = MPI::COMM_WORLD.Get_rank();
    size = MPI::COMM_WORLD.Get_size();
    cout << "world size: " << size << endl;
    if (rank == 0) {
        intercomm = MPI::COMM_WORLD.Spawn("./mpi_spawn_cpp2", MPI::ARGV_NULL, 1, MPI::INFO_NULL, 0, &errcode);
        cout << "intercomm size: " << intercomm.Get_size() << endl;
    }
    MPI::Finalize();
    return 0;
}

尽管它编译完美,但上述代码的问题在于它似乎没有从 Spawn 函数返回,这意味着该过程实际上没有生成。上面的代码有什么问题,应该纠正什么才能使其工作?

非常感谢您的帮助。

MPI_Comm_spawn

内部通信器上是集体的,但你只从等级 0 调用它,这就是它挂起的原因。试试这个:

intercomm = MPI::COMM_WORLD.Spawn("./mpi_spawn_cpp2", MPI::ARGV_NULL, 1, MPI::INFO_NULL, 0, &errcode);
if (rank == 0) {
    cout << "intercomm size: " << intercomm.Get_size() << endl;
}

一句忠告。由于这是您在 MPI 中的第一步,因此我建议您改为学习 C 绑定。C++绑定在当前的 MPI 标准版本 2.2 中已弃用,并将从即将发布的版本 3.0 中完全删除。