MPI 2 中 MPI_Barrier 的非阻塞版本

计算科学 mpi
2021-11-25 09:19:13

我有一堆 MPI 进程来回交换请求消息。进程不知道哪些其他进程会向它们发送消息,或者发送多少消息。鉴于这种情况,我想要一种有效的方法来了解所有其他进程是否认为自己已完成发送消息。

这将通过以下 MPI_Barrier 的非阻塞版本完美完成,我们将其称为 MPI_Ibarrier:

int MPI_Ibarrier(MPI_Comm comm, MPI_Request* request);

MPI_Ibarrier会立即返回,并且对请求对象的标准操作会在每个人都达到障碍时让我们知道。

有没有办法在 MPI 2 中有效地模拟这种行为(即,没有官方的非阻塞集合)?

2个回答

值得注意的是,MPI_Ibarrier这是一个非常有用的例程。例如,您可以通过发送MPI_Issend(是的,同步发送很少使用),然后进入交替循环MPI_Testall(查看发送是否完成)将非结构化消息传递给不知道要接收多少消息的队列MPI_Iprobe(处理传入的消息)。发送完成后,您发布MPI_Ibarrier并替代测试屏障以探测传入消息。Torsten Hoefler 对此有一篇论文,他证明了通信的最优性,请参见算法 2:http ://unixer.de/publications/img/hoefler-dsde-protocols.pdf

请注意,屏障不能确保在屏障之前发布的点对点消息或其他非阻塞集合已完成。如果您希望它们完成,您必须确保它们在发布障碍之前已完成。正如比尔所说,(阻塞)MPI_Barrier在大多数情况下是不正确/不必要的。一个例外是通过诸如文件系统之类的侧通道进行通信。

尽管使用 MPI-2 进行仿真没有类似的高性能方式MPI_Ibarrier,但 MPICH2MPIX_Ibarrier在 1.5 分支(当前)中提供。供应商网络通常支持这些操作,因此供应商实现(通常源自 MPICH2)只需要一个接口。一旦他们的补丁升级到 1.5,就MPI_Ibarrier应该支持其他非阻塞集合。Open MPI 开发分支有一个MPI_Ibarrier基于 libNBC 的实现。

请参阅http://www.unixer.de/research/nbcoll/,尤其是http://www.unixer.de/research/nbcoll/libnbc/,它是位于 MPI-1 之上的参考实现。正如 Jed 所说,MPICH2 1.5 已经有 NBC 并且实现类似于 Torsten 的(尽管由于开销较低几乎可以肯定更快)。