在 MPI_Send 或 MPI_Ssend 之后立即调用 MPI_Finalize 是否安全?

Is it safe to call MPI_Finalize immediately after MPI_Send or MPI_Ssend?

假设我有 3 个节点,等级为 01212正在做一些计算,然后将结果传输给0。调用MPI_Send或MPI_Ssend是否安全,然后立即MPI_Finalize然后立即return 来自主要?

考虑这个例子:2 捕鱼速度更快,将结果发送到 0 并完成。之后,一旦 1 完成,01 仍然需要通信。这是允许的 MPI“状态”吗?该标准反复声明在调用 MPI_Finalize 后可能不会通过 MPI 进行通信。但是,如果这对所有节点都有效,而不仅仅是已完成的节点,这似乎有点不切实际。

此外,我不清楚 MPI_Send 和 MPI_Ssend 调用是否安全,因为至少对于 MPI_Send,调用可能 return 在 0 发帖收到。如果 MPI_Finalize 在那之后立即调用,如果某些内部缓冲区中仍有数据,会发生什么情况?帽子是否也适用于 MPI_Ssend?

MPI_FINALIZE 是所有连接等级的集体,但与除 MPI_BARRIER 之外的所有其他集体一样,它可能 return 早。当您调用它时,MPI 库会自行清理,如果可能,return 会将控制权交还给您。尽管该标准并不要求这种行为 - 等待所有其他等级调用 MPI_FINALIZE 或根本不调用 returns(MPI_COMM_WORLD 的等级 0 除外)的实现仍然是合规的。

只要其余 MPI rank 不尝试与调用 MPI_FINALIZE 的 rank 通信,它们就可以自由地继续相互通信。这排除了任何集体呼叫,除非那些在退出等级不是其成员的通信器上。您所描述的场景是对 MPI 的完全有效使用。

关于调用MPI_FINALIZE时发生的情况,标准要求您采取措施完成通信操作的可见部分,例如wait/test任何非阻塞调用。至于缓冲操作,the standard 说(第 8.7 节启动,第 359 页):

Advice to implementors. Even though a process has executed all MPI calls needed to complete the communications it is involved with, such communication may not yet be completed from the viewpoint of the underlying MPI system. For example, a blocking send may have returned, even though the data is still buffered at the sender in an MPI buffer; an MPI process may receive a cancel request for a message it has completed receiving. The MPI implementation must ensure that a process has completed any involvement in MPI communication before MPI_FINALIZE returns. Thus, if a process exits after the call to MPI_FINALIZE, this will not cause an ongoing communication to fail. The MPI implementation should also complete freeing all objects marked for deletion by MPI calls that freed them. (End of advice to implementors.)

(粗体强调是我的)