MPI是否丢弃或延迟消息
Does MPI drop or delay messages?
我在这里问了同样的问题,但我认为它太长了,所以我将以更短的方式再试一次:
我有一个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)的优点。
希望有帮助。
- boost::进程间消息队列引发错误
- 如何仅为一个函数添加延迟
- 在线编译器中的分段C++没有打印消息
- C++错误消息*成员参考.**初学者*
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 如何通过参数抛出错误消息
- 从服务器传输到客户端的消息不会出现
- 以在Qt中的IF语句中设置时间延迟
- ROS2 动态消息模板
- C++秘密消息学校作业
- glad 导致 glfwSwapBuffers 返回错误消息
- 为什么当通过 TCP 发送的消息速率增加时,请求-响应消息对的延迟会降低?
- 使用websocket时消息被延迟
- MPI是否丢弃或延迟消息
- 如何度量在多核系统上运行的多个应用程序之间的消息延迟
- ActiveMQ-CPP -消息重新传递延迟没有得到应用
- 网络延迟和应用程序>进程消息()
- Windows (c++)上窗口消息的问题(延迟)
- FIX引擎从客户端向服务器发送FIX消息的最低延迟是多少?