检查相邻的从属进程是否在MPI中结束

时间:2016-01-10 13:42:29

标签: c++ parallel-processing synchronization mpi

在我的MPI程序中,我想向相邻进程发送和接收信息。但如果一个过程结束并且没有发送任何东西,它的邻居将永远等待。我该如何解决这个问题?这是我想要做的:

if (rank == 0) {
    // don't do anything until all slaves are done
} else {
    while (condition) {
        // send info to rank-1 and rank+1
        // if can receive info from rank-1, receive it, store received info locally
        // if cannot receive info from rank-1, use locally stored info
        // do the same for process rank+1
        // MPI_Barrier(slaves); (wait for other slaves to finish this iteration)
    }
}

我将检查当然的界限。当进程号为1时,我不会检查rank-1,当进程是最后一个时,我不会检查rank + 1。但是我怎样才能做到这一点?我应该用另一个包装吗?我很困惑。

1 个答案:

答案 0 :(得分:1)

我首先要说的是MPI最初的设计并非考虑到您的使用案例。一般来说,MPI应用程序都是一起开始的,所有这些应用程但并非所有应用程序都适用于此模型,因此不要失去希望!

有两种相对简单的方法可以做到这一点,可能还有数千种难以实现的方法:

  1. 使用RMA在邻居上设置标记。
  2. 正如评论中指出的那样,您可以设置一个微小的RMA窗口,向每个邻居公开一个值。当流程完成后,它可以对每个邻居执行MPI_Put以表明它已完成,然后MPI_Finalize。在向/从邻居发送/接收数据之前,请检查标志是否已设置。

    1. 检测到停机时使用特殊标签。
    2. 发送和接收消息时,标记值经常被忽略,但现在是使用它的好时机。您的应用程序中可以有两个标志。第一个(我们称之为DATA)只是表明此消息包含数据,您可以正常处理它。第二个(DONE)表示该过程已完成并正在离开应用程序。接收邮件时,您必须将tag的值从您使用的任何内容更改为MPI_ANY_TAG。然后,当收到消息时,检查它是哪个标记。如果是DONE,则停止与该流程进行通信。

      然而,您发布的伪代码存在另一个问题。如果您希望在每次迭代结束时执行MPI_Barrier,则无法提前离开流程。发生这种情况时,MPI_Barrier将会挂起。不幸的是,你无法避免这种情况。但是,考虑到您发布的代码,我不确定障碍是否真的有必要。在我看来,唯一的循环间依赖是在相邻进程之间。如果是这种情况,那么发送和接收将完成所有必要的同步。

      如果您仍需要一种方法来跟踪所有排名何时完成,您可以让每个进程在离开时提醒单个排名(比如排名0)。当排名0检测到每个人都已完成时,它可以退出。或者,如果你想在完成其他一些进程后离开,你可以让等级0使用上面的特殊标记向所有其他等级发送消息(但添加MPI_ANY_SOURCE以便你可以从等级0接收)。