C语言中的MPI_势垒

C语言中的MPI_势垒,mpi,openmpi,Mpi,Openmpi,我正在尝试使用MPI实现一个程序,我需要在特定的处理器中执行一段代码,直到执行完成,其他处理器必须等待。我认为可以使用MPI_屏障实现(尽管我不清楚它的实际功能),并尝试了以下程序 #include<mpi.h> #include<stdio.h> int main(int argc, char **argv) { int rank=0,size; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_C

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

#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();
}
我怎么可能让其他处理器等待块1在秩为0的处理器中完成执行

预期产量

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

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

Rank 1 After Barrier
Rank 1 After Barrier
Rank 2 After Barrier
或:

或:

你需要在等级1和等级2之间进行某种同步,在等级2可以继续之前,确保等级1完成了它的第一个printf。这可能是另一个屏障,一个仅包含列组1和列组2的小型通信器上的屏障(如果您不想强制其他列组等待),一个带有虚拟数据或类似数据的阻塞MPI_Ssend/MPI_Recv对

MPI_Barrier()会阻止所有进程,直到所有进程都到达Barrier。请尝试添加
fflush(stdout)在每个
printf
语句之后。这或做fprintf(stderr…)。默认情况下,stderr是无缓冲的。
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