【问题标题】:MPI_Barrier in CC中的MPI_Barrier
【发布时间】:2014-01-17 14:54:36
【问题描述】:

我正在尝试使用 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 as 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

【问题讨论】:

  • MPI_Barrier() 阻塞所有进程,直到所有进程都到达屏障。
  • 尝试在每个printf 语句后添加fflush(stdout);
  • 那个或者做 fprintf(stderr...)。 stderr 默认是无缓冲的。

标签: mpi openmpi


【解决方案1】:

除了 eduffy 在评论中指出的并发写入标准输出的问题之外,您使用的障碍只是确保排序所需要做的一部分。一旦所有 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

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

【讨论】:

    猜你喜欢
    • 2011-01-04
    • 2013-07-08
    • 2011-06-21
    • 2011-07-08
    • 1970-01-01
    • 2016-10-31
    • 2016-09-20
    • 2011-10-14
    • 2013-11-08
    相关资源
    最近更新 更多