在MPI进程之间更新数组

Update array between MPI processes

本文关键字:更新 数组 之间 进程 MPI      更新时间:2023-10-16

我有两个进程p0和p1。其中一个进程对数组执行某些操作(我不知道是哪个进程)。稍后,另一个进程需要做一些事情(在更新数组上)。示例:

  • p1对数组执行填充操作
  • p1"发送"数组
  • 警察需要处理array->"读取"更新数组
  • p1需要处理数组->"读取"更新数组

。。。等等看起来我必须使用MPIBSEND,但我看到还有MPISENDRECV。如果使用MPIBSEND,这个过程如何知道缓冲区中是否有什么东西?

感谢

所以,你说的是,你有一个存在于P1上的数组A。在第一步中计算出这一点之后,P0和P1都需要与第一步中所计算的阵列独立工作。

事实上,这还远远不够。

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

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