Her*_*ton 1 parallel-processing ipc mpi openmpi
假设我有 3 个节点,其等级为0、1和2。1并2正在做一些计算,然后将结果传输到0. 调用 MPI_Send 或 MPI_Ssend,然后立即调用 MPI_Finalize,然后立即调用是否安全从 main 返回是否安全?
考虑这个例子:2钓鱼速度更快,将结果发送到0并最终确定。之后,0仍然1需要沟通,一旦1完成这是允许的 MPI“状态”吗?该标准反复声明,调用 MPI_Finalize 后,不得通过 MPI 进行通信。然而,如果这对所有节点都有效,而不仅仅是那些已经最终确定的节点,则似乎有点不切实际。
此外,我不清楚 MPI_Send 和 MPI_Ssend 调用是否安全,因为至少对于 MPI_Send 来说,调用可能会在0发布接收之前返回。如果此后立即调用 MPI_Finalize,并且某些内部缓冲区中仍有数据,会发生什么情况?这是否也适用于 MPI_Ssend?
MPI_FINALIZE是所有相连等级的集体,但与除 之外的所有其他集体一样MPI_BARRIER,它可能会提前返回。当您调用它时,MPI 库会自行清理,并在可能的情况下将控制权返回给您。不过,该标准并不要求这种行为 - 等待所有其他等级调用 的实现MPI_FINALIZE,或者根本不返回(除了 的等级 0 之外MPI_COMM_WORLD)的实现仍然是合规的。
只要 MPI 级别的其余成员不尝试与已调用 的级别进行通信MPI_FINALIZE,他们就可以自由地继续相互通信。这会排除任何集体呼叫,除非这些呼叫是在退出级别不属于其成员的通信器上进行的。您所描述的场景是 MPI 的完全有效的使用。
关于调用时发生的情况MPI_FINALIZE,该标准要求您采取措施来完成通信操作的可见部分,例如等待/测试任何非阻塞调用。至于缓冲操作,标准规定(第 8.7 节启动,第 359 页):
给实施者的建议。即使进程已执行完成其所涉及的通信所需的所有 MPI 调用,但从底层 MPI 系统的角度来看,此类通信可能尚未完成。例如,即使数据仍在发送方的 MPI 缓冲区中缓冲,阻塞发送也可能已返回;MPI 进程可能会收到对其已完成接收的消息的取消请求。MPI 实现必须确保进程在 MPI_FINALIZE 返回之前完成所有 MPI 通信的参与。因此,如果进程在调用 MPI_FINALIZE 之后退出,则不会导致正在进行的通信失败。MPI 实现还应该完成释放由释放它们的 MPI 调用标记为删除的所有对象。(对实施者的建议结束。)
(粗体字是我的)