MPI Barrier无法在循环中工作

时间:2018-05-14 14:27:27

标签: c mpi

我目前正在使用MPI C库,但编码c ++,我知道MPI_Barrier(MPI_COMM_WORLD)函数阻止调用者,直到通信器中的所有进程都调用它,如{{ 3}}。这是我的代码,运行在4个进程上。

int WORLD_SIZE = 0;
int WORLD_RANK = 0;
{
    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &WORLD_SIZE);
    MPI_Comm_rank(MPI_COMM_WORLD, &WORLD_RANK);
    MPI_Barrier(MPI_COMM_WORLD);
}
// everything works up till here
// WORLD_SIZE is 4, WORLD_RANK is the current process rank
{
    int j = 1;
    while (j <= log2(WORLD_SIZE)) {
        printf("rank%d at iteration %d\n", WORLD_RANK, j);
        MPI_Barrier(MPI_COMM_WORLD);
        j++;
    }
}
{
    MPI_Finalize();
}

该程序为我提供输出。

rank0 at iteration 1
rank0 at iteration 2
rank1 at iteration 1
rank1 at iteration 2
rank2 at iteration 1
rank2 at iteration 2
rank3 at iteration 1
rank3 at iteration 2

由于障碍,我期待以下情况。

rank0 at iteration 1
rank1 at iteration 1
rank2 at iteration 1
rank3 at iteration 1
rank0 at iteration 2
rank1 at iteration 2
rank2 at iteration 2
rank3 at iteration 2

任何帮助表示赞赏。如果需要,我可以发布更多代码。

当前的程序执行顺序是否与当前的std输出完全相同?如果没有,我怎么告诉真正的执行顺序?如果是,那我该如何正确使用障碍?

1 个答案:

答案 0 :(得分:0)

默认情况下,MPI不会正确排序您的输出。 Barrier语句可能正常工作,打印只是针对每个进程排序,但不是针对所有进程。