MPI_Bcast()是否阻止?

时间:2016-09-17 19:03:09

标签: parallel-processing mpi

MPI_Bcast()是阻止还是非阻止?换句话说,当根发送数据时,所有处理器是否都会阻塞,直到每个处理器都收到这些数据?如果没有,如何同步(阻止)所有这些,以便没有人继续进行,直到所有人都收到相同的数据。

2 个答案:

答案 0 :(得分:15)

你需要对这里的术语有点小心,因为MPI对“阻塞”的意思可能不是你在其他环境中看到它的方式。

在MPI术语中,Bcast 阻止。阻塞意味着,当函数返回时,它已经完成了它本来要做的操作。在这种情况下,这意味着从Bcast返回时,保证每个进程中的接收缓冲区都包含您要广播的数据。非阻塞版本是Ibcast。

在MPI术语中,您要问的是操作是否是同步,即意味着进程之间的同步。对于诸如发送之类的点对点操作,这指的是发送方是否在从发送呼叫返回之前等待接收发送。对于集体行动,问题是是否存在障碍(正如@Vladimir所指出的那样)。 Bcast并不一定意味着障碍。

然而,我发布的原因是,在几乎所有使用标准发送/接收电话编写的MPI程序中(与单面Put / Get相反),你不关心是屏障后的同步。所有每个流程都关心的是它已经收到了所需的数据 - 为什么其他流程正在做什么呢?如果您随后想要与任何其他进程通信,则MPI例程的设计将使所需的同步自动发生。如果您发出接收而另一个过程很慢,则等待;如果你发出一个发送而另一个进程没有发出一个接收,那么一切都会正常工作(假设你没有调用Rsend - 你应该从不调用Rsend!)。是否存在同步会影响性能,但很少会影响程序是否正确。

除非进程通过某种其他机制进行交互(例如,所有访问同一文件),否则很难想出一个真实的例子,你关心Bcast是否同步。当然你总是可以构建一些边缘情况,但在MPI的实际应用中它几乎不重要。

许多MPI计划都充满了障碍,根据我的经验,他们几乎从不需要正确性;唯一的常见用例是确保有效的性能测量时间。

答案 1 :(得分:4)

不,这种阻塞(等待其他进程完成他们的部分工作)对性​​能来说非常糟糕。只要满足所有需要,每个进程都会继续 - 这意味着它将接收到的数据,或者要发送的数据至少被复制到某个缓冲区。

如果您需要确保所有流程都已完成,则可以使用MPI_Barrier来同步流程。如前所述,它可以显着减缓程序。我在初始化代码时仅将它用于某些诊断日志记录。不是在实际整合期间。