MPI_Bcast() 阻塞了吗?

Is MPI_Bcast() blocking?

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

不,这种阻塞(等待其他进程完成他们的工作)对性​​能非常不利。每个进程在拥有所需的一切后立即继续——这意味着它要接收的数据在那里,或者要发送的数据至少被复制到某个缓冲区。

如果您需要确保所有进程都已完成,您可以使用 MPI_Barrier 来同步进程。如前所述,它会显着降低程序速度。在初始化我的代码时,我只将它用于某些诊断日志记录。不是在实际集成期间。

您需要注意这里的术语,因为 MPI "blocking" 的含义可能与您在其他情况下看到的不同。

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

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

但是,我发帖的原因是,在几乎所有使用标准 Send/Recv 调用(与单边 Put/Get 相对)编写的 MPI 程序中,您 不关心 障碍后是否有同步。每个进程所关心的只是它已经收到了它需要的数据——为什么其他进程在做什么很重要?如果您随后想要与任何其他进程通信,那么 MPI 例程被设计为自动发生所需的同步。如果你发出一个接收而另一个进程很慢,你等待;如果你发出一个发送而另一个进程没有发出一个接收,一切仍然会正常工作(这是假设你不调用 Rsend - 你应该 永远不会 调用 Rsend!)。同步与否对性能有影响,但很少影响程序是否正确。

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

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