【问题标题】:sending multiple mpi non blocking send - will it preserve the sent order发送多个 mpi 非阻塞发送 - 它会保留发送的顺序吗
【发布时间】:2012-02-21 17:56:54
【问题描述】:

说我有 3 个像这样的非阻塞发送

  1. MPI_Isend ();
  2. MPI_Isend ();
  3. MPI_Isend ();

和3个对应​​的receive

  1. MPI_Recv();
  2. MPI_Recv();
  3. MPI_Recv();

现在假设第二个 Isend 不会发送,因为它不会阻塞第三个 Isend 将被发送。现在 MPI_Recv 函数会得到预期的函数吗?

我的意思是第一个 MPI_ISend 将数据发送到第一个接收,第二个 MPI_ISent 发送到第二个 MPI_Recv 等等。

【问题讨论】:

    标签: mpi


    【解决方案1】:

    更新:我认为下面 cmets 中的 Jeremiah Willcock 是对的,而这个答案是错误的。

    如果三个ISends被顺序调用,并且receives都匹配它们,那么一个send操作是否更大,或者更快,或者其他什么都没有关系; MPI 的不超车保证告诉您消息将按照 Isend 的发送顺序到达(因此可用于 Recv)。

    如果对 ISend 的 调用 被延迟,这是我最初解释问题的方式,或者如果调用按照建议失败(但请注意,如果调用失败,您稍后会遇到其他问题) 那么原始答案成立:如果 Recieves 匹配 any 所有的 Isend,并且对第二个 ISend 的 call 以某种方式被阻止,那么第一个 MPI_Recv() 将获取第一个 Isend,第二个 Recv 将获取第三个 Isend,第三个将挂起,直到第二个 Isend 发生。

    如果要确保第一个 MPI_Recv 接收到特定消息,则应使用标记来区分各种消息,并让接收指定该标记。

    【讨论】:

    • 这是不正确的——参见 MPI 2.2 规范中关于不超车的第 3.5 节;上面的代码需要以与发送发生的顺序相同的顺序匹配接收。不过,这仅适用于发送具有相同通信器和标签的情况。
    • 老兄,这就是我在回答的第二段中所说的。
    • 你的回答不是说发送可以被任何一个接收接收吗?
    • 是的,除非你想用标签来区分它们。或者,就此而言,传播者。但是 MPI 的新手几乎从不小心地为这些东西使用标签,而且 OP 也从未在帖子中的任何地方提及它们。
    • 除了问题所暗示的是完全安全且定义明确的,即使没有标签。
    猜你喜欢
    • 2012-08-24
    • 2011-05-25
    • 2021-12-30
    • 2012-11-29
    • 2013-03-07
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    相关资源
    最近更新 更多