MPI_IN_PLACE如何与MPI_Scatter一起使用?
当作为MPI_Scatter
的参数给出时MPI_IN_PLACE
做了什么以及如何使用它? 我无法理解man MPI_Scatter
:
当通信器是一个内部通信器时,您可以就地执行收集操作(输出缓冲区用作输入缓冲区)。 使用变量MPI_IN_PLACE作为根进程recvbuf的值。 在这种情况下,将忽略recvcount和recvtype,并且根进程不会向其自身发送任何数据。 由于就地选项将接收缓冲区转换为发送和接收缓冲区,因此包含INTENT的Fortran绑定必须将这些标记为INOUT,而不是OUT。
我想要做的是使用包含根数据的相同缓冲区作为每个其他进程的接收缓冲区(如MPI_Bcast
)。 MPI_Scatter
和MPI_IN_PLACE
会让我这样做吗?
根据mpich ,MPI_scatter的sendbuf仅与root相关,
sendbuf – 发送缓冲区的地址(选择,仅在root时有效)
从这个讨论中,
对于scatter / scatterv,应将MPI_IN_PLACE作为recvbuf传递。 对于聚集和大多数其他集合,MPI_IN_PLACE应该作为sendbuf传递。
因此,您需要在根进程的recv缓冲区位置使用MPI_IN_PLACE,例如
if (rank == iroot) MPI_Scatter(buf, sendcount, MPI_Datatype, MPI_IN_PLACE, sendcount, MPI_Datatype, iroot, MPI_COMM_WORLD); else MPI_Scatter(dummy, sendcount, MPI_Datatype, buf, sendcount, MPI_Datatype, iroot, MPI_COMM_WORLD);
然后,您可以在root上的send中使用buf
,并在每个其他进程的recv位置使用相同的buf
。 接收处理器上的dummy
缓冲区也可能被MPI_IN_PLACE
替换。