MPI_IN_PLACE
作为[{1}}的参数时应该做什么以及如何使用它?我无法理解MPI_Scatter
:
当通信器是一个内部通信器时,您可以就地执行收集操作(输出缓冲区用作输入缓冲区)。使用变量MPI_IN_PLACE作为根进程recvbuf的值。在这种情况下,将忽略recvcount和recvtype,并且根进程不会向其自身发送任何数据。由于就地选项将接收缓冲区转换为发送和接收缓冲区,因此包含INTENT的Fortran绑定必须将这些标记为INOUT,而不是OUT。
我想要做的是使用包含根数据的相同缓冲区作为每个其他进程的接收缓冲区(如man MPI_Scatter
中所示)。将MPI_Bcast
与MPI_Scatter
一起让我这样做吗?
答案 0 :(得分:3)
根据mpich,MPI_scatter的sendbuf仅与根相关,
sendbuf - 发送缓冲区的地址(选择,仅在根时有效)
来自this讨论,
对于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
替换。