MPI_ALLTOALL(sendbuf, sendcount, sendtype, recvbuf, recvcount,
recvtype, comm)
IN sendbuf 发送消息缓冲区的起始地址(可选数据类型)
IN sendcount 发送到每个进程的数据个数(整型)
IN sendtype 发送消息缓冲区中的数据类型(句柄)
OUT recvbuf 接收消息缓冲区的起始地址(可选数据类型)
IN recvcount 从每个进程中接收的元素个数(整型)
IN recvtype 接收消息缓冲区的数据类型(句柄)
IN comm 通信域(句柄)
int MPI_Alltoall(void* sendbuf, int sendcount, MPI_Datatype sendtype,
void* recvbuf, int recvcount, MPI_Datatype recvtype,
MPI_Comm comm)
MPI_ALLTOALL(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT,
RECVTYPE, COMM, IERROR)
<type> SENDBUF(*), RECVBUF(*)
INTEGER SENDCOUNT, SENDTYPE, RECVCOUNT, RECVTYPE, COMM,
IERROR

MPI_ALLTOALL是组内进程之间完全的消息交换,其中每一个进程都向其它所有的进程发送消息,同时,每一个进程都从其它所有的进程接收消息。
MPI_ALLGATHER每个进程散发一个相同的消息给所有的进程,MPI_ALLTOALL散发给不同进程的消息是不同的,因此它的发送缓冲区也是一个数组。MPI_ALLTOALL的每个进程可以向每个接收者发送数目不同的数据。第i个进程发送的第j块数据将被第j个进程接收并存放在其接收消息缓冲区recvbuf的第i块。每个进程的sendcount和sendtype的类型必须和所有其他进程的recvcount和recvtype相同,这就意谓着在每个进程和根进程之间,发送的数据量必须和接收的数据量相等。
调用MPI_ALLTOALL相当于每个进程依次将它的发送缓冲区的第i块数据发送给第i个进程。同时每个进程又都依次从第j个进程接收数据放到各自接收缓冲区的第j块数据区的位置。

MPI_ALLTOALL全互换



从图中可以看出,在互换之前依次将各进程的发送缓冲区组织在一起,互换之后依次将各进程的接收缓冲区组织在一起,则接收缓冲区组成的矩阵是发送缓冲区组成的矩阵的转置(若每次向一个进程发送的数据是多个,则将这多个数据看作是一个数据单元)。