【问题标题】:MPI buffered send/receive orderMPI 缓冲发送/接收顺序
【发布时间】:2011-01-02 17:04:59
【问题描述】:

我正在使用 MPI(使用 fortran,但问题比任何给定语言都更具体地针对 MPI 标准),特别是使用缓冲的发送/接收函数 isend 和 irecv。现在,如果我们想象以下场景:

进程 0:

isend(stuff1, ...)
isend(stuff2, ...)

流程一:

wait 10 seconds
irecv(in1, ...)
irecv(in2, ...)

消息是否按照发送顺序传递到进程 1,即我能否确定 in1 == stuff1 和 in2 == stuff2 如果使用的标签在所有情况下都相同

【问题讨论】:

    标签: parallel-processing mpi


    【解决方案1】:

    是的,消息按发送顺序接收。这被标准描述为非超车消息。有关详细信息,请参阅此MPI Standard section,这是摘录:

    Order Messages are non-overtaking:如果一个发送者连续向同一个目的地发送两条消息,并且都匹配相同的接收,那么如果第一个消息仍然处于未决状态,则此操作无法接收第二个消息。如果接收者连续发布两个接收,并且都匹配相同的消息,那么如果第一个仍然未决,则该消息不能满足第二个接收操作。此要求有助于发送与接收的匹配。它保证消息传递代码是确定性的,如果进程是单线程的并且通配符 MPI_ANY_SOURCE 未在接收中使用。 (稍后描述的一些调用,例如 MPI_CANCEL 或 MPI_WAITANY,是不确定性的额外来源。)

    【讨论】:

      【解决方案2】:

      是和不是。

      我可以确定 in1 == stuff1 和 in2 == stuff2 如果使用的标签是 在所有情况下都一样?

      是的。 send 和 recv 之间存在确定性的 1:1 相关性,这将使正确的输入进入正确的 recv 缓冲区。此行为由标准保证,并由所有 MPI 实现强制执行。

      没有。内部消息进程的确切顺序和接收端缓冲区填充的确切顺序有点像黑匣子……尤其是在使用具有多个飞行中缓冲区的 RDMA 样式消息传输时(例如 InfiniBand)。

      如果您的代码使用多个线程,并检查缓冲区以确定完整性(例如等待切换位)而不是使用 MPI_Test 或 MPI_Wait,那么消息可能会乱序到达(但在正确的缓冲区)。

      如果您的代码依赖于 in1 = stuff1 在接收方填充 in2 = stuff2 之前被填充,并且两条消息都有一个发送等级,那么使用 MPI_Issend(非阻塞,同步发送)将保证消息按顺序接收。如果您需要保证来自多个发送队列的多个recv 的缓冲区填充顺序,则需要在每个revc 之间进行某种阻塞调用(例如MPI_Recv、MPI_Barrier、MPI_Wait 等)。

      【讨论】:

      • 必须为-1,因为我不太相信您的“是和否”答案中的“否”部分......通过您在那里建议的方式“检查是否完成”是可笑的。等效地,如果我问您“x = 42; printf("%d", x); 是否保证打印 42?”您也可以说“是和否;不,因为如果您单步执行调试器并更改了 x 的值,则不会。”
      • @j...所描述的情况发生在我支持的三个不同用户身上。他们的工作具有多线程等级,具有单个 MPI 通信线程。其他线程正在与硬件控制器进行交互。硬件控制器线程正在检查缓冲区的最后一位以确定消息是否完成。当他们从 TCP 迁移到 IB 时,乱序消息到达问题就暴露出来了。这更像是“编译器优化”,而不是您提供的调试器示例。结构管理器保留缓冲区顺序,但优化了实际传输顺序。
      • 好吧,我惊呆了。 (这就是 MPI_Test() 是 for 的!)但是如果 3 个用户弄错了,那么你帖子中的信息很有价值,所以如果你编辑它以添加一个响亮的“但不要这样做” ,它是愚蠢的”或类似的东西,我会 +1。
      • 我不太关心具体的例子,而不是广泛的想法:使用 RDMA,接收端缓冲区填充的确切顺序有点像黑匣子。使用 MPI_Test 或 MPI_Wait(或所有/任何变体)是确定消息传输何时完成的“前门”方法。我在示例中特别提到了多线程案例。从多个线程进行 MPI 调用会带来性能损失。在一个线程中使用 MPI_Test/Wait 来检查另一个线程中消息传输的完整性可能不合适。
      • 如果您需要在不同的线程中进行 MPI 调用,那么您需要在不同的线程中进行 MPI 调用并且您必须付出使用线程安全 MPI 实现的性能损失 - - 正如您所展示的,替代方案是未定义的行为。我不明白你为什么不想明确指出这一点,但是好的。
      猜你喜欢
      • 1970-01-01
      • 2019-04-20
      • 2016-07-23
      • 1970-01-01
      • 2018-03-12
      • 2018-11-08
      • 1970-01-01
      • 1970-01-01
      • 2011-06-08
      相关资源
      最近更新 更多