【问题标题】:How to check if MPI one-sided communication has finished?如何检查 MPI 单向通信是否完成?
【发布时间】:2016-04-16 13:23:15
【问题描述】:

我正在使用MPI_Raccumulate 函数,它是通过预定义聚合函数从源到目标的单向通信。

我想在程序结束时检查所有的MPI_Raccumulate调用是否已经完成(发送方发送数据,接收方成功接收数据)。但是,MPI_Wait 似乎不是解决此问题的方法;它只等待检查源缓冲区是否可更新(用户可用)。

有没有办法(1)检查一个特定的 MPI 单侧通信调用是否已完全完成(在发送方和接收方)? (2) 确认每个处理器中没有发送/接收 MPI 请求?

我的应用程序应该使用单向通信,但需要确认在特定任务结束时没有更多通信。

谢谢

【问题讨论】:

  • 我不明白您的 send-Recv 问题。你在使用通配符吗?

标签: mpi communication mpi-rma


【解决方案1】:

完成 RMA 请求只能确保本地完成,从而确保缓冲区重用。远程完成需要以下之一:

  • MPI_Win_complete,在 PSCW 使用模型中
  • MPI_Win_fence,在 BSP 使用模型中
  • MPI_Win_unlock(_all)MPI_Win_flush(_all) 在被动目标使用模型中。

您可能不想使用基于请求的 RMA。对于几乎所有使用模型,常规函数就足够了。唯一明显有用的请求 RMA 操作是MPI_Get(或MPI_Get_accumulateMPI_NO_OP,这是MPI_Get 的原子等价物)。我是作为 MPI-3 的一部分对这些功能负有最大责任的人说的。

【讨论】:

  • 感谢 Jeff,BSP 模型是我使用的执行模型。 (我应该使用 BSP 这个词 :D)看来 MPI_Win_flush 是我想要的!
  • MPI_Win_fence 的大多数使用最好使用被动目标 RMA 或非 RMA 实现,例如社区集体。你的沟通模式是什么?
  • 我的应用程序主要使用非集合被动目标 RMA,例如 MPI_Rget 和 MPI_Raccumulate。它带来数据,计算它并异步发送回来。我在每次 MPI_Rget 和 MPI_Raccumulate 调用同步之前/之后使用 MPI_Win_lock。
  • 对不起,我的评论是不合理的。你发送flush,我说fence。对此感到抱歉。
  • @Jeff 我有一个与 OP 类似的问题。我想使用 MPI_Win_fence 来确保所有单向通信都已完成,但如果尚未完成,我想在它完成时做一些其他工作。这可能吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-05
  • 2019-07-23
  • 2019-11-22
  • 2017-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多