【问题标题】:What is the standard way to use MPI_Isend to send the same message to many processors?使用 MPI_Isend 向多个处理器发送相同消息的标准方法是什么?
【发布时间】:2013-04-04 03:35:46
【问题描述】:

我最初使用 MPI_Send 与 MPI_Irecv 配对,但我最近发现 MPI_Send 可能会阻塞,直到收到消息。因此,我将更改为 MPI_Isend,我需要将相同的消息发送到 N 个不同的处理器。假设缓冲区稍后会被破坏,我应该在循环中有一个带有 MPI_Isend 和 MPI_Wait 的 for 循环,还是应该在循环后发出一个请求数组并且只有 MPI_Isend 和 MPI_Waital?

【问题讨论】:

    标签: mpi


    【解决方案1】:

    为了将相同的缓冲区分配给“n”个远程队列,MPI_Bcast 是“显而易见的”选择。除非您有一些“压倒性”的理由来避免使用 MPI_Bcast,否则建议使用它。通常,所有主要 MPI 实现都对 MPI_Bcast 进行了很好的优化。

    如果阻塞是一个问题,MPI 3.0 标准引入了 MPI_IBcast 以及其他非阻塞集合。非阻塞集合体的初始实现似乎是“幼稚的”,并且构建为非阻塞点对点例程的包装器(例如,MPI_IBcast 被实现为对 MPI_ISend 和 MPI_IRecv 调用的包装器)。在接下来的一两年内,实施的质量可能会有所提高——部分取决于 MPI 应用程序开发人员社区的采用速度。

    MPI_Send 将“阻塞”,直到调用应用程序可以安全地重新使用发送缓冲区。对相应 MPI_[I]Recv 的状态没有任何保证。

    如果您需要非阻塞,那么最好的建议是在循环中调用 MPI_ISend。或者,持久请求可以与 MPI_Start 或 MPI_Startall 一起使用,如果这是一个将在程序过程中重复的消息模式。 Persistent communication requests.

    【讨论】:

      【解决方案2】:

      由于是相同的消息,您应该可以使用MPI_Bcast。您只需要创建一个新的通信器来定义一个进程子组。

      【讨论】:

      • 不会 MPI_Bcast 阻止吗?
      • 是的,它会的。如果您使用的是 MPI 3.0,则某些实现已经有 MPI_Ibcast
      猜你喜欢
      • 2020-08-01
      • 2016-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多