我正在尝试使用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发布于 2013-12-31 05:51:05
除了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继续之前完成它的第一个printf。这可能是另一个障碍,在一个较小的通信器上,如果你不想强迫其他级别等待,一个只包含级别1和2的障碍,一个带有虚拟数据或类似的阻塞MPI_Ssend/MPI_Recv对。
https://stackoverflow.com/questions/20844327
复制相似问题