C中的MPI_Barrier

时间:2013-12-30 17:21:55

标签: mpi openmpi

我正在尝试使用MPI实现一个程序,为此我需要在特定处理器中执行一段代码,直到执行完成,其他处理器必须等待。我认为可以使用MPI_Barrier实现(虽然我不清楚其实际功能)并尝试了以下程序。

#include<mpi.h>
#include<stdio.h>
int main(int argc, char **argv) {
    int rank=0,size;
    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    MPI_Comm_size(MPI_COMM_WORLD,&size);
    if(rank == 0){                             //Block 1
        printf("\nRank 0 Before Barrier");
    }
        MPI_Barrier(MPI_COMM_WORLD);
    if(rank==1){
        printf("\nRank 1 After Barrier");
        printf("\nRank 1 After Barrier");
    }
    if(rank==2){
        printf("\nRank 2 After Barrier");
    }
    MPI_Finalize();
}

当我用np执行3

时,我得到了以下输出
Rank 1 After Barrier

Rank 0 Before BarrierRank 2 After BarrierRank 1 After Barrier

我怎么可能让其他处理器等到Block 1在Rank 0的处理器中完成执行?

预期输出

Rank 0 Before Barrier
Rank 1 After Barrier //After this, it might be interchanged
Rank 1 After Barrier
Rank 2 After Barrier

1 个答案:

答案 0 :(得分:0)

除了eduffy在评论中指出的并发写入stdout的问题之外,您使用的障碍只是确保订购所需要做的一部分。一旦所有3个或更多等级通过你插入的一个障碍,就允许所有可能的等级1和2的交错:

Rank 1 After Barrier
Rank 1 After Barrier
Rank 2 After Barrier

或:

Rank 1 After Barrier
Rank 2 After Barrier
Rank 1 After Barrier

或:

Rank 2 After Barrier
Rank 1 After Barrier
Rank 1 After Barrier

你需要在你现在拥有的障碍之后在等级1和2之间进行某种同步,以确保等级1在等级2可以继续之前完成其第一次打印。这可能是另一个障碍,如果您不想强制其他等级等待,则包含等级1和2的较小通信器的障碍,阻止MPI_Ssend / MPI_Recv对与虚拟数据或类似物。