MPI_Bcast()是阻塞函数吗?

6

MPI_Bcast()是阻塞还是非阻塞的?换句话说,当根进程发送数据时,所有进程是否都会阻塞直到每个进程都接收到此数据?如果不是,如何同步(阻塞)它们,以便在所有人接收相同数据之前没有人继续执行。


唯一保证同步的MPI集合通信调用是MPI_Barrier - Hristo Iliev
2个回答

24
在MPI术语中,“阻塞”可能与您在其他上下文中看到的用法不同,因此需要注意术语的准确性。
在MPI术语中,Bcast是阻塞的。阻塞意味着函数返回时,它已完成了其预定操作。在这种情况下,这意味着从Bcast返回后,在每个进程中接收缓冲区都包含您要广播的数据。非阻塞版本是Ibcast。
在MPI术语中,您所问的是操作是否同步,即是否涉及进程间同步。对于像Send这样的点对点操作,这指的是发送方是否在发送调用返回之前等待接收方发布接收。对于集体操作,问题是是否存在障碍(正如@Vladimir所指出的)。 Bcast并不一定意味着有一个障碍。
然而,我发布帖子的原因是,在使用标准的Send / Recv调用编写的几乎所有MPI程序中(而不是单边Put / Get),您并不关心障碍后是否同步。每个进程都只关心它是否接收到所需的数据 - 为什么其他进程正在做什么会很重要呢?如果您随后想要与任何其他进程通信,则MPI例程被设计为自动发生所需的同步。如果您发出接收并且另一个进程很慢,您会等待;如果您发出发送并且其他进程没有发出接收,则一切仍将正确工作(这假定您不调用Rsend-您应该永远不要调用Rsend!)。是否同步对性能有影响,但很少影响程序是否正确。
除非进程通过某种其他机制进行交互(例如全部访问相同的文件),否则很难举出真正需要关心Bcast是否同步的实际示例。当然,您始终可以构造一些边缘情况,但在MPI的实际应用中几乎从未有影响。

许多MPI程序中都存在屏障,但在我的经验中,它们几乎从未是必要的。唯一常见的用例是为性能测量确保有意义的时间。


3
“...这意味着从Bcast返回时,保证每个进程的接收缓冲区都包含您要广播的数据。” - 这对于根进程来说并不是真的。阻塞操作在本地部分完成并且用户提供的缓冲区可以被重用后才会返回。在广播的情况下,操作可能在根节点完成,而仍有消息正在传输中。我完全同意您答案的其余部分,特别是最后一段。 - Hristo Iliev
2
好的 - 你说得对,我的回答并不够清晰。我本意是说,“这意味着当一个进程从Bcast返回时,保证该进程的接收缓冲区包含了你想要广播的数据”。你说得对,我的原始文本错误地暗示了这一点在全局范围内是正确的,而不仅仅是在本地范围内。 - David Henty
MPI_Barriers也很有用,可以确保初始化中的某个步骤已完全完成,以便您可以信任所编写的诊断日志。快速确定问题发生的位置。它只执行一次,因此减慢速度并不太重要。 - Vladimir F Героям слава
另一个案例。我们刚刚被一个特定的HPC MPI实现中的一个错误所困扰,即MPI_Scatter或类似的集体操作在等待10-15分钟后将停止工作。MPI_Barrier可以解决这个问题。仅仅因为MPI_Barrier不是严格必要的而删除它,在实际的大型计算中可能会产生非常不可预测的结果。 - Vladimir F Героям слава

7
不,这种阻塞(等待其他进程完成其工作)对性能非常不利。每个进程只要有了它所需的一切,就会立即继续进行——也就是说,需要接收的数据已经到位,或者至少将要发送的数据已经复制到某些缓冲区中。
如果需要确保所有进程都已完成,则可以使用MPI_Barrier来同步进程。正如之前所说,这可能会显著减慢程序的运行速度。我仅在初始化代码时进行某些诊断记录时才使用它,而不是在实际集成过程中使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接