MPI_IN_PLACE如何与MPI_Scatter一起使用?

akx*_*xlr 6 c distributed-computing mpi

MPI_IN_PLACE当作为参数给出MPI_Scatter以及如何使用它时究竟做了什么?我无法理解man MPI_Scatter:

当通信器是一个内部通信器时,您可以就地执行收集操作(输出缓冲区用作输入缓冲区).使用变量MPI_IN_PLACE作为根进程recvbuf的值.在这种情况下,将忽略recvcount和recvtype,并且根进程不会向其自身发送任何数据.由于就地选项将接收缓冲区转换为发送和接收缓冲区,因此包含INTENT的Fortran绑定必须将这些标记为INOUT,而不是OUT.

我想要做的是使用包含根数据的相同缓冲区作为每个其他进程的接收缓冲区(如in MPI_Bcast).将MPI_ScatterMPI_IN_PLACE让我做到这一点?

Ed *_*ith 5

根据mpich, MPI_scatter 的 sendbuf 仅与根相关,

sendbuf -- 发送缓冲区的地址(选择,仅在根目录下有效)

这次讨论来看,

对于 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);
Run Code Online (Sandbox Code Playgroud)

然后,您可以buf在根上的发送中使用相同的方法,并buf在每个其他进程的接收位置中使用相同的方法。接收处理器上的缓冲区dummy也可能被替换MPI_IN_PLACE