4.7 收集到全局(Gather-to-all) BACKWARDFORWARD


MPI_ALLGATHER(sendbuf, sendcount, sendtype, recvbuf, recvcount,
              recvtype,comm)
 IN  sendbuf     发送消息缓冲区的起始地址(可变)
 IN  sendcount   发送消息缓冲区中的数据个数(整型)
 IN  sendtype    发送消息缓冲区中的数据类型(句柄)
 OUT recvbuf     接收消息缓冲区的起始地址(可变)
 IN  recvcount   从任一进程中接收的元素个数(整型)
 IN  recvtype    接收消息缓冲区的数据类型(句柄)
 IN  comm        通信子(句柄)

int MPI_Allgather(void* sendbuf, int sendcount, MPI_Datatype sendtype,
                  void* recvbuf, int recvcount, MPI_Datatype recvtype,
                  MPI_Comm comm)

MPI_ALLGATHER(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT,
              RECVTYPE, COMM, IERROR)
    <type> SENDBUF(*), RECVBUF(*)
    INTEGER SENDCOUNT, SENDTYPE, RECVCOUNT, RECVTYPE, COMM, IERROR

MPI_ALLGATHER和MPI_GATHER意义相同,但此时是所有进程都将接收结果,而不是只有根进程接收结果.从每个进程发送的第j块数据将被每个进程接收,然后存放在各个进程接收消息缓冲区recvbuf的第j块.

每一个进程的sendcount和sendtype的类型必须和其他所有进程的recvcount和recvtype相同.

调用MPI_ALLGATHER相当于所有进程执行了n次调用:

    MPI_GATHER(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,
               root,comm),

其中root从0到n-1.有关于MPI_ALLGATHER的正确使用方法和MPI_GATHER相同.

MPI_ALLGATHERV(sendbuf, sendcount, sendtype, recvbuf, recvcounts,
               displs,recvtype,comm)
 IN  sendbuf     发送消息缓冲区的起始地址(可变)
 IN  sendcount   发送消息缓冲区中的数据个数(整型)
 IN  sendtype    发送消息缓冲区中的数据类型(句柄)
 OUT recvbuf     接收消息缓冲区的起始地址(可变)
 IN  recvcounts  整型数组(长度为组的大小), 存放着每个进程中接收的数
                 据个数(整型)
 IN  displs      整数数组(长度为组的大小),每个入口i存放着相对于
                 recvbuf的位移,此位移处存放着从进程i中接收的输入数据
 IN  recvtype    接收消息缓冲区的数据类型(句柄)
 IN  comm        通信子(句柄)

int MPI_Allgatherv(void* sendbuf, int sendcount,MPI_Datatype sendtype,
                   void* recvbuf, int *recvcounts, int *displs,
                   MPI_Datatype recvtype, MPI_Comm comm)

MPI_ALLGATHERV(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNTS,
               DISPLS, RECVTYPE, COMM, IERROR)
    <type>  SENDBUF(*), RECVBUF(*)
    INTEGER SENDCOUNT, SENDTYPE, RECVCOUNTS(*), DISPLS(*), RECVTYPE,
            COMM, IERROR

MPI_ALLGATHERV和MPI_GATHERV意义相同,但此时是所有的进程都将接收结果,而 不是只有根进程接收结果.从每个进程发送的第j块数据将被每个进程接收,然后存放在各个进程接收消息缓冲区recvbuf的第j块.这些块的大小不必相同.

进程j的sendcount和sendtype的类型必须和其他所有进程的recvcounts[j]和recvtype相同.

调用MPI_ALLGATHERV相当于所有进程执行了:

    MPI_GATHERV(sendbuf,sendcount,sendtype,recvbuf,recvcounts,displs,
                recvtype,root,comm),

其中root从0到n-1.有关于MPI_ALLGATHERV的正确使用方法和MPI_GATHERV相同.

4.7.1 应用MPI_ALLGATHER和MPI_ALLGATHERV的例子

例4.14: 用收集到全局的方法对例4.2进行改造,即用MPI_ALLGATHER从组内的每个进程收集100个数据然后送到每个进程中.

    MPI_Comm comm;
    int gsize,sendarray[100];
    int *rbuf;
    ......
    MPI_Comm_size(comm, &gsize);
    rbuf = (int *)malloc(gsize*100*sizeof(int));
    MPI_Allgather(sendarray, 100, MPI_INT, rbuf, 100, MPI_INT, comm);

调用结束后,每个进程都将得到全局范围内的数据并将其依次存放在自身的缓冲区中.


Copyright: NPACT BACKWARDFORWARD