是开放的MPI';s减少同步化?

是开放的MPI';s减少同步化?,mpi,reduce,Mpi,Reduce,我在这里看代码,这是我为了练习而做的 我对这里显示的部分感到困惑 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) <

我在这里看代码,这是我为了练习而做的

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

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::COMM\u WORLD.Reduce(&mypi,&pi,1,MPI::DOUBLE,MPI::SUM,0);
如果(秩==0)

cout所有集体通信呼叫(减少、聚集、分散等)都被阻塞。

所有集体通信呼叫(减少、聚集、分散等)都被阻塞。

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

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

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


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

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

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

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


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

All do,这意味着所有进程都将阻塞,直到指定组中的所有其他进程都达到匹配调用。虽然这在实践中通常是正确的,但MPI标准。请参阅“给用户的建议”下的评论。集合保证在返回时产生所需的结果,但不一定是同步的。例如,设想一个广播将其结果缓存在某个地方,然后允许根用户继续。仅仅因为根目录上返回的MPI_Bcast并不意味着其他进程达到了相应的MPI_Bcast调用。如果有人感兴趣,我发现OpenMPI(1.6 linux x64)中的
Bcast()
并非如此。广播方不会阻止,但所有接收器都会阻止,直到广播方发送消息为止。我假设Gather的情况也一样(发送方不会阻止,但接收方会阻止)。All都会阻止,这意味着所有进程都会阻止,直到指定组中的所有其他进程都达到匹配的调用。虽然这在实践中通常是正确的,但MPI标准。请参阅“给用户的建议”下的评论。集合保证在返回时产生所需的结果,但不一定是同步的。例如,设想一个广播将其结果缓存在某个地方,然后允许根用户继续。仅仅因为根目录上返回的MPI_Bcast并不意味着其他进程达到了相应的MPI_Bcast调用。如果有人感兴趣,我发现OpenMPI(1.6 linux x64)中的
Bcast()
并非如此。广播方不会阻止,但所有接收器都会阻止,直到广播方发送消息为止。我假设对Gather也是一样的(发送方不会阻止,但接收方会阻止)。