1

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

非常感谢您的帮助。

4

1 回答 1

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

于 2012-05-13T08:48:54.973 回答