MPI集体运营和流程生命周期(C / C ++)

时间:2016-03-02 19:15:55

标签: c mpi

对于我想讨论的问题,我们以MPI_Barrier为例。 MPI3标准声明

  

如果comm是一个interracommunicator,MPI_BARRIER阻止调用者,直到   所有小组成员都打电话给它。该调用仅在任何进程中返回   在所有小组成员进入通话后。

所以我想知道 - 同样基本上适用于所有集体操作 - 如果在执行MPI_Barrier之前通信上下文的某些进程刚刚退出(成功),则必须如何解释此断言:例如,假设我们有两个进程A和B,并使用MPI_COMM_WORLD作为通信器,使用commMPI_Barrier。在A和B之后拨打MPI_Init,如果B立即拨打MPI_Finalize并退出,如果在致电MPI_Barrier之前只有A呼叫MPI_Finalize,A是否会被永久阻止?或者是“所有群组成员”的集合被定义为尚未退出的所有原始群组成员的集合?我很确定A会被永久封锁,但也许MPI标准对此有更多的说法?

备注:这不是关于MPI_Barrier的同步属性的问题,对MPI_Barrier的引用仅仅是一个具体的例子。如果执行集体操作,这是关于MPI程序正确性的问题。见评论。

1 个答案:

答案 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通信。

请注意最后一句话如何要求您在问题中完成障碍。

标准说,你的程序不正确。在实践中,它很可能会死锁/挂起。