MPI是否丢弃或延迟消息

Does MPI drop or delay messages?

本文关键字:延迟 消息 是否 MPI      更新时间:2023-10-16

我在这里问了同样的问题,但我认为它太长了,所以我将以更短的方式再试一次:

我有一个c++程序,使用最新的OpenMPI在一个Rocks集群下的主/从设置。从服务器执行一个任务,然后使用阻塞MPI_SEND/MPI_RECV调用(通过Boost MPI)向主服务器报告数据,主服务器将数据写入数据库。目前,主服务器的运行速度明显慢于从服务器。我在这个程序中遇到了麻烦,因为大约一半的奴隶在第一个任务上卡住了,从不报告他们的数据;使用strace/ltrace,它们似乎在MPI_SEND中轮询,并且它们的消息从未被接收。

我写了一个程序来测试这个理论(再次,在这里列出了全部),我可以引起一个类似的问题-从通信明显变慢,所以他们做的任务比他们应该做的少-通过操纵从和主使用睡眠的速度。当速度(主)>速度(从)时,一切都很好。当速度(主)<速度(从机),每次对某些从机来说消息都会明显延迟。>

知道为什么会这样吗?

据我所知,这是由主节点中while循环中的recv引起的。

 ...
 while (1) {
 // Receive results from slave.
      stat = world.recv(MPI_ANY_SOURCE,MPI_ANY_TAG);
 ...

当有来自一个从属节点的消息时,主节点不能获得任何消息,直到while循环内的代码完成(这需要一些时间,因为有一个睡眠),因为主节点不是并行运行。因此,在第一个奴隶完成发送消息之前,所有其他奴隶都不能开始发送消息。然后下一个slave可以开始发送消息,但随后所有其他slave都停止,直到while循环内的代码执行完毕。

这会导致您看到的行为,从机通信非常慢。为了避免这个问题,你需要实现点对点通信非阻塞或使用全局通信。

更新1:

让我们假设主服务器分发了他的数据。现在他等奴隶们回来。当第一个slave返回报告时,它将首先发送REPORTTAG,然后发送DONETAG。现在,如果

 currentTask < numtasks

现在奴隶们又开始计算了。现在的情况可能是,在主人完成任务之前,他只能处理另一个奴隶。因此,开始的奴隶现在再次发送他的REPORTTAG,然后发送DONETAG,并获得一份新工作。当这种情况持续下去时,最终只有2个奴隶得到了新的工作,其余的人无法完成他们的工作。所以在某一点上这是真的:

 currentTask >= numtasks

现在你停止所有的工作,即使不是所有的奴隶都报告了他们的数据,并完成了多个任务。

当不同节点的网络连接差异很大时,最容易出现此问题。原因是发送和接收在调用之后没有处理,相反,如果这两个函数中的两个能够进行某种握手,则通信就会发生。

作为解决方案,我建议:

  • 确保在杀死所有作业之前所有slave都已完成
  • 使用gather和scatter代替message,然后所有slave在每个任务后同步。
  • 如果消息不太大,则使用缓冲或非缓冲的发送和接收操作。确保在主
  • 上没有内存溢出。
  • 将主/从工作模式更改为更并行的工作模式,例如将所有任务划分为两个节点,然后将任务从这些节点进一步划分为下两个节点,以此类推。最后以这种方式发送任务。该解决方案还具有通信成本仅为O(logn)而不是O(n)的优点。

希望有帮助。