我从MPI_ANY_SOURCE收到来自MPI Recv的消息的顺序是什么,

时间:2014-11-11 00:54:19

标签: mpi

我正在实施一个集线器/服务器MPI应用程序。每个服务器都可以等待一些数据,然后他们执行MPI发送到集线器。让我的中心等待从ANY_SOURCE做一个Recv对我来说相对简单。集线器可以忙于处理数据。我担心的是从其中一个服务器上跳过数据。这种情况的可能性有多大:

  • 服务器1和2执行发送
  • hub执行Recv并最终从服务器1获取数据
  • 当集线器忙时,服务器1获取更多数据,执行另一个发送
  • 当集线器执行下一个Recv时,它会获取更新的服务器1数据而不是旧服务器2

我不需要保证发送的订单是ANY_SOURCE处理它们的顺序(虽然它会很好)但是如果我在实践中新的那么它将接近订单他们被送了,我可以和上面一起去。但是,如果我可能跳过其中一个服务器的数据,我需要实现更复杂的东西。我认为这将是这种模式:

  • 服务器各自执行发送
  • hub为每个服务器执行Irecv
  • hub在所有服务器请求上执行Waitany
  • 完成一个服务器请求后,集线器会对所有其他服务器执行测试
  • 已完成的所有Irecv,集线器选择最旧的服务器数据(服务器数据中有时间标签)
  • 集线器与它刚刚选择的服务器进行通信,启动新的发送,集中新的Irecv

这需要更复杂的代码,我的第一次努力以一种我发现难以调试的方式在Waitany调用中崩溃。我正在使用Python绑定mpi4py - 因此我对使用的缓冲区的控制较少。

1 个答案:

答案 0 :(得分:2)

MPI standard保证按照发送顺序(非超车消息)接收消息。另请参阅this answer to a similar question

但是,从ANY_SOURCE收到并且有不同的发件人时,有no guarantee of fairness。所以,是的,如果应用程序需要,程序员有责任设计自己的公平系统。