Open MPI的缩减同步化吗?

Jas*_*Zhu 1 reduce mpi

我在看这里的代码,我正在为练习做.

http://www.mcs.anl.gov/research/projects/mpi/usingmpi/examples/simplempi/main.html

我对这里显示的部分感到困惑.

MPI::COMM_WORLD.Reduce(&mypi, &pi, 1, MPI::DOUBLE, MPI::SUM, 0); 
if (rank == 0) 
    cout << "pi is approximately " << pi 
         << ", Error is " << fabs(pi - PI25DT) 
         << endl; 
Run Code Online (Sandbox Code Playgroud)

我的问题是当所有其他进程(在这种情况下是1-3级的程序)完成并且结果完成后,mpi reduce函数是否知道?

sus*_*att 6

所有集体通信调用(Reduce,Gather,Scatter等)都是阻塞的.

  • 虽然这在实践中通常是正确的,但MPI标准[不鼓励依赖隐式同步](http://www.mcs.anl.gov/research/projects/mpi/mpi-standard/mpi-report-1.1/node64.htm #Node64).请参阅"对用户的建议"下的评论.集合体保证在返回时产生所需的结果,但不一定是同步的.想象一下,例如广播将其结果缓存到某处,然后允许root继续.仅仅因为在根上返回MPI_Bcast并不意味着其他进程到达了相应的MPI_Bcast调用. (3认同)
  • 万一有人感兴趣,我发现在OpenMPI(1.6 linux x64)中`Bcast()`不是这种情况.广播公司不阻止,但所有接收器都会阻塞,直到广播公司发送消息为止.我认为对于Gather来说会是一样的(发送者不会阻止,但接收者会阻止). (2认同)

Jef*_*res 5

@g.inozemtsev 是正确的。MPI 集体调用(包括 Open MPI 中的调用)在 MPI 意义上是“阻塞”的,这意味着您可以在调用返回时使用缓冲区。在像 MPI_REDUCE 这样的操作中,这意味着根进程返回时将在其缓冲区中找到答案。此外,这意味着当 MPI_REDUCE 返回时,MPI_REDUCE 中的非根进程可以安全地覆盖其缓冲区(这通常意味着它们在缩减中的部分已完成)。

但是,请注意,如上所述,一个进程中的 MPI_REDUCE 等集体操作的返回与对等进程中相同集体操作的返回没有影响。此规则的唯一例外是 MPI_BARRIER,因为屏障被定义为显式同步,而所有其他 MPI-2.2 集体操作不一定需要显式同步。

作为一个具体的例子,假设所有非根进程在时间 X 调用 MPI_REDUCE。根进程最终在时间 X+N 调用 MPI_REDUCE(对于本例,假设 N 很大)。根据实现的不同,非根进程可能会比 X+N 早返回,或者它们可能会阻塞直到 X+N(+M)。MPI 标准在这一点上故意模糊,以允许 MPI 实现做他们想要/需要的事情(这也可能由资源消耗/可用性决定)。

因此,@g.inozemtsev 的“不能依赖同步”(MPI_BARRIER 除外)的观点是正确的。