对于我想讨论的问题,我们以MPI_Barrier
为例。 MPI3标准声明
如果comm是一个interracommunicator,MPI_BARRIER阻止调用者,直到 所有小组成员都打电话给它。该调用仅在任何进程中返回 在所有小组成员进入通话后。
所以我想知道 - 同样基本上适用于所有集体操作 - 如果在执行MPI_Barrier
之前通信上下文的某些进程刚刚退出(成功),则必须如何解释此断言:例如,假设我们有两个进程A和B,并使用MPI_COMM_WORLD
作为通信器,使用comm
到MPI_Barrier
。在A和B之后拨打MPI_Init
,如果B立即拨打MPI_Finalize
并退出,如果在致电MPI_Barrier
之前只有A呼叫MPI_Finalize
,A是否会被永久阻止?或者是“所有群组成员”的集合被定义为尚未退出的所有原始群组成员的集合?我很确定A会被永久封锁,但也许MPI标准对此有更多的说法?
备注:这不是关于MPI_Barrier
的同步属性的问题,对MPI_Barrier
的引用仅仅是一个具体的例子。如果执行集体操作,这是关于MPI程序正确性的问题。见评论。
答案 0 :(得分:4)
如果B在程序启动时退出并且只有A调用MPI_Barrier,A是否会被永久阻止?
基本上是的。但实际上,你不允许这样做。
简单来说,在退出之前,您必须在所有进程上调用MPI_Finalize
。并且MPI_Finalize
的行为类似于集体(在MPI_COMM_WORLD
上),因此在每个流程调用MPI_Finalize
之前通常不会完成。所以在你的例子中,进程B没有退出(至少没有正确)。
但我认为8.7的MPI 3.1标准更清楚地解释了它:
MPI_Finalize
[...]此例程清除所有MPI状态。如果是MPI 程序正常终止(即,不是由于呼叫MPI_ABORT
或 一个不可恢复的错误)然后每个进程必须调用MPI_FINALIZE
在它退出之前。在MPI进程调用MPI_FINALIZE
之前, 进程必须执行完成其参与所需的所有MPI调用 在MPI通信中:它必须在本地完成所有MPI操作 它启动并必须执行完成所需的匹配调用 由其他进程发起的MPI通信。
请注意最后一句话如何要求您在问题中完成障碍。
标准说,你的程序不正确。在实践中,它很可能会死锁/挂起。