在mpi.h中,我正在尝试使用MPI_Barrier,但它运行不正常。 这是一个例子:
int main(int argc, char **argv)
{
MPI_Init(&argc,&argv);
int i,j,rank,np;
MPI_Comm_size(MPI_COMM_WORLD,&np);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
for(i=0;i<np;i++)
{
if(rank==i)
{
printf("\n(%d)\n",rank);
for(j=0;j<5;j++)
{
printf("%d\t",j);
if((j%10)==0)
printf("\n");
}
}
MPI_Barrier(MPI_COMM_WORLD);
}
MPI_Finalize();
return 0;
}
输出结果为:
(0)
0
(1)
0
(2)
0
(3)
0
1 2 3 4 1 2 3 4 1 2 3 4
1 2 3 4
(用4个处理器执行) 因此,即使存在障碍,所有处理器也会同时开始打印值。 为什么呢?
答案 0 :(得分:3)
printf
到stdout
被缓冲,默认情况下会刷新每个\n
的缓冲区。因此,每个处理器依次打印其等级并使用\n
刷新缓冲区,然后打印0并刷新缓冲区。然后,每个处理器使用printf
将“1 2 3 4”加载到输出缓冲区中,但不会刷新。刷新发生在程序结束时,所以最后一行都出现了。
要按顺序查看您的IO,请在屏障前添加fflush(stdout)
。为了完全控制I / O排序,专用一个处理器来执行I / O,因为MPI不提供任何I / O排序保证。