让奴隶在MPI中互相等待

Make slaves wait for each other in MPI

我的MPI程序中有一个主从模型。我想让奴隶在进入下一次迭代之前互相等待。

if (rank == 0) {
    // master process
} else {
    // slave process
    for (int i = 0; i < 10; i++) {
        // do stuff
        // wait for all slaves to end iteration i
    }
}

基本上,我不希望任何处理器在所有其他从处理器未完成当前迭代的情况下进入下一次迭代。我怎样才能做到这一点?用 MPI_Barrier?

您可以创建一个包含所有从属进程的通信器并在 MPI_Barrier() 上使用它。 创建此通信器时,最简单/最安全的方法是这样使用 MPI_Comm_split()

MPI_Comm slaves;
MPI_Comm_split( MPI_COMM_WORLD, ( rank == 0 ), rank, &slaves );

这实际上会在全局创建 2 个通信器:一个只包含主进程,一个包含除主进程之外的所有进程。

实际使用时,可以这样操作:

if (rank == 0) {
    // master process
} else {
    // slave process
    for (int i = 0; i < 10; i++) {
        // do stuff
        // wait for all slaves to end iteration i
        MPI_Barrier( slaves );
    }
}