2015-04-02 18 views
4

MPI_IN_PLACE作为MPI_Scatter的参数给出时应如何操作?应如何使​​用?我无法理解man MPI_ScatterMPI_IN_PLACE如何与MPI_Scatter一起使用?

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

我想要做的是使用相同的缓冲区,其中包含根上的数据作为每个其他进程的接收缓冲区(如MPI_Bcast)。请问MPI_ScatterMPI_IN_PLACE让我这样做?

回答

3

MPI_scatter的sendbuf只在根据mpich根相关,

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); 

然后,您可以在根和互相过程中的recv位置相同buf发送使用buf。接收处理器上的dummy缓冲区可能也可能被MPI_IN_PLACE替代。

+1

虚拟缓冲区可以替换为NULL,因为它永远不会被读取。 – 2015-04-02 23:10:10

相关问题