我正在使用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函数返回,这意味着该进程实际上并未生成。上面的代码有什么问题,应该纠正什么才能使它起作用?
非常感谢您的帮助。
答案 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版本中完全删除。