更新MPI进程之间的数组

时间:2017-01-25 09:47:25

标签: c++ mpi

我有两个进程p0和p1。 其中一个进程在数组上做了什么(我不知道哪个进程)。后者,其他进程需要做一些事情(在更新数组上)。例如:

  • p1在数组上做了什么
  • p1“发送”数组
  • po需要努力 数组 - > “读取”更新数组
  • p1需要处理数组 - > “读取”更新数组

......等等。 看起来我必须使用MPI BSEND,但我看到还有MPI SENDRECV。如果使用MPI BSEND,如果有什么东西被放入缓冲区,进程如何知道?

由于

1 个答案:

答案 0 :(得分:0)

所以,你说的是,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开始。