MPI_Init只能由一个线程调用

时间:2015-08-05 13:16:06

标签: c mpi cluster-computing distributed-computing mpich

MPI_Init的ref,声明:

  

此例程必须仅由一个线程调用。该线程称为主线程,必须是调用MPI_Finalize的线程。

怎么做?我的意思是我看到的每个例子看起来都像this,在我的代码中,我试过了:

MPI_Comm_rank(MPI_COMM_WORLD, &mpirank);
bool mpiroot = (mpirank == 0);
if(mpiroot)
  MPI_Init(&argc, &argv);

但我得到了:

Attempting to use an MPI routine before initializing MPICH

但是,请注意,这样可以正常工作,如果我在示例中保留它,我只需要重新检查,因为我的代码失败here

我在想,因为我们调用了mpiexec -n 4 ./test,所以会产生4个进程,因此所有进程都会调用MPI_Init。我只是在main()的第一行打印了一些内容,它们的打印次数与进程数一样多。

1 个答案:

答案 0 :(得分:5)

MPI_Init必须是MPI程序调用的第一个MPI函数。它必须由每个进程调用。请注意,进程与线程不同!如果继续从进程生成线程,那些线程不能再次调用MPI_Init

所以你的程序应该是这样的:

 int main(int argc, char **argv) 
 {
     MPI_Init(&argc, &argv);
     int mpirank;
     MPI_Comm_rank(MPI_COMM_WORLD, &mpirank);
     // No more calls to MPI_Init in here
     ...
     MPI_Finalize();
 }