MPI_Barrier无法正常工作

时间:2011-10-27 20:19:54

标签: c

在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个处理器执行) 因此,即使存在障碍,所有处理器也会同时开始打印值。 为什么呢?

1 个答案:

答案 0 :(得分:3)

printfstdout被缓冲,默认情况下会刷新每个\n的缓冲区。因此,每个处理器依次打印其等级并使用\n刷新缓冲区,然后打印0并刷新缓冲区。然后,每个处理器使用printf将“1 2 3 4”加载到输出缓冲区中,但不会刷新。刷新发生在程序结束时,所以最后一行都出现了。

要按顺序查看您的IO,请在屏障前添加fflush(stdout)。为了完全控制I / O排序,专用一个处理器来执行I / O,因为MPI不提供任何I / O排序保证。