4.10 归约-分散(Reduce-Scatter) BACKWARDFORWARD


MPI中还包括对每个归约操作的变形,即将结果分散到组内的所有进程中去.

MPI_REDUCE_SCATTER(sendbuf, recvbuf, recvcounts, datatype, op, comm)
 IN   sendbuf       发送消息缓冲区的起始地址(可变)
 OUT  recvbuf       接收消息缓冲区的起始地址(可变)
 IN   recvcounts    整型数组,存放着分布在每个进程的结果元素个数, 所
                    有进程的数组都必须相同.
 IN   datatype      输入缓冲区的元素类型(句柄)
 IN   op            操作(句柄)
 IN   comm          通信子(句柄)

int MPI_Reduce_scatter(void* sendbuf, void* recvbuf, int *recvcounts
                       MPI_Datatype datatype, MPI_Op op, MPI_Comm comm)
MPI_REDUCE_SCATTER(SENDBUF, RECVBUF, RECVCOUNTS, DATATYPE, 
                   OP, COMM, IERROR)
    <type> SENDBUF(*), RECVBUF(*)
    INTEGER RECVCOUNTS(*), DATATYPE, OP, COMM, IERROR

MPI_REDUCE_SCATTER对由sendbuf、count和datatype定义的发送缓冲区中的数组逐个元素进行归约操作,这个数组的长度count = ∑irecvcount[i].然后, 这个结果向量被分成n个互不连通的部分,这里n为组中成员数.第i段中包含recvcounts[i]个元素,第i段发送到进程i并且存放在由recvbuf、recvcounts[i]和datatype定义的输入缓冲区中.

对实现者的建议:MPI_REDUCE_SCATTER例程从功能上等价于:一个count次(等于 recvcounts[i])MPI_REDUCE操作,后面跟一个sendcounts次(等于recvcounts)MPI_SCATTERV操作,但直接实现可能运行得更快一些(对实现者的建议结尾).


Copyright: NPACT BACKWARDFORWARD