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_GATHER是将数据收集到ROOT进程,而MPI_ALLGATHER相当于每一个进程都作为ROOT执行了一次MPI_GATHER调用,即每一个进程都收集到了其它所有进程的数据。从参数上看,MPI_ALLGATHER和MPI_GATHER完全相同,只不过在执行效果上,对于MPI_GATHER执行结束后,只有ROOT进程的接收缓冲区有意义,MPI_ALLGATHER调用结束后所有进程的接收缓冲区都有意义,它们接收缓冲区的内容是相同的。

MPI_ALLGATHERV(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, recvtype,
comm)
INsendbuf发送消息缓冲区的起始地址(可选数据类型)
INsendcount发送消息缓冲区中的数据个数(整型)
INsendtype 发送消息缓冲区中的数据类型(句柄)
OUT recvbuf接收消息缓冲区的起始地址(可选数据类型)
INrecvcounts 接收数据的个数,整型数组(整型)
INdispls 接收数据的偏移,整数数组(整型)
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_ALLGATHER和MPI_GATHER的关系,不难得知MPI_ALLGATHERV和MPI_GATHERV的关系。MPI_ALLGATHERV也是所有的进程都将接收结果,而不是只有根进程接收结果。从每个进程发送的第j块数据将被每个进程接收,然后存放在各个进程接收消息缓冲区recvbuf的第j块。进程j的sendcount和sendtype的类型必须和其他所有进程的recvcounts[j]和recvtype相同。

例子
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);