让奴隶在MPI中等待对方

时间:2016-01-10 12:09:35

标签: c++ parallel-processing synchronization 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

1 个答案:

答案 0 :(得分:3)

您可以创建包含所有从属进程的通信器,并在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 );
    }
}