Openmp是否同步减少?

时间:2011-12-21 21:42:33

标签: mpi reduce

我正在查看我正在为练习做的代码。

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; 

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

2 个答案:

答案 0 :(得分:6)

所有集体通讯电话(减少,聚集,分散等)都在阻塞。

答案 1 :(得分:4)

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

但是,请注意,如上所述,在一个进程中从集合操作(​​如MPI_REDUCE)返回与对等进程中相同集合操作的返回无关。此规则的唯一例外是MPI_BARRIER,因为barrier定义为显式同步,而所有其他MPI-2.2集合操作不一定需要显式同步。

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

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