我在看这里的代码,我正在为练习做.
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函数是否知道?
所有集体通信调用(Reduce,Gather,Scatter等)都是阻塞的.
@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 除外)的观点是正确的。