MPI_Init必须仅由一个线程调用

gsa*_*ras 3 c distributed-computing cluster-computing mpi mpich

MPI_Init 的引用指出:

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

这该怎么做?我的意思是,我看到的每个示例都是这样,并且在我的代码中,我尝试过:

MPI_Comm_rank(MPI_COMM_WORLD, &mpirank);
bool mpiroot = (mpirank == 0);
if(mpiroot)
  MPI_Init(&argc, &argv);
Run Code Online (Sandbox Code Playgroud)

但是我得到了:

Attempting to use an MPI routine before initializing MPICH
Run Code Online (Sandbox Code Playgroud)

但是,请注意,如果我将其保留为示例中的代码,则可以正常工作,因为我的代码在此处失败,因此只需重新检查即可。


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

mor*_*ort 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();
 }
Run Code Online (Sandbox Code Playgroud)