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

时间:2012-05-13 08:18:25

标签: c++ mpi

我正在使用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函数返回,这意味着该进程实际上并未生成。上面的代码有什么问题,应该纠正什么才能使它起作用?

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

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版本中完全删除。