【问题标题】:Update array between MPI processes在 MPI 进程之间更新数组
【发布时间】:2017-02-04 23:52:00
【问题描述】:

我有两个进程 p0 和 p1。 其中一个进程在阵列上做事(我不知道是哪个进程)。稍后,其他进程需要做一些事情(在更新数组上)。示例:

  • p1 在数组上做一些事情
  • p1“发送”数组
  • po 需要在 数组 -> “读取”更新数组
  • p1 需要在阵列上工作-> “读取”更新数组

... 等等。 看来我必须使用 MPI BSEND 但我看到还有 MPI 发送记录。在使用 MPI 的情况下 BSEND,该进程如何知道是否已将某些内容放入缓冲区?

谢谢

【问题讨论】:

    标签: c++ mpi


    【解决方案1】:

    所以,你说的是,你有一些存在于 P1 上的数组 A。在第一步计算完之后,P0 和 P1 都需要独立处理第一步计算的数组。

    事实上,这远远不是足够的信息。

    • 如果第一步中 A 的计算量很小(小于通信量),或者 P1 计算 A 时 P0 不忙,您可以在两个处理器上独立计算 A。
    • 第二步中的计算需要足够大,以至于值得将数据发送到另一个处理器。
    • 如果 P0 和 P1 上的计算具有大致相同的大小,您可以只使用 MPI_Send(阻塞),因为我预计稍后会有另一个同步点。
    • 我更喜欢手动复制数组(仅是真正需要的部分)并针对 MPI_Bsend 使用异步 MPI 调用 (Isend / Irecv),这是不鼓励的。
    • 您应该仅在有充分理由的情况下使用 Bsend、Ssend 和其他变体。这在很大程度上取决于实现和网络,哪个调用是最好的。您应该只决定是否可以使用异步 MPI。仅在绝对必要时才考虑其他 MPI 调用。

    但是使用 MPI_Sendrecv 解决这个问题有什么意义呢?当 p0 向 p1 发送一些东西并且同时 p1 向 p0 发送一些东西时,这很有用。但这不是你描述的,所以这肯定是错误的函数,这就是为什么我建议你从 MPI_Send 开始。

    【讨论】:

      猜你喜欢
      • 2013-07-08
      • 1970-01-01
      • 2021-09-22
      • 2021-07-03
      • 2016-10-05
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      • 2011-01-16
      相关资源
      最近更新 更多