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

MPI_SCATTER是一对多的组通信调用,但是和广播不同,ROOT向各个进程发送的数据可以是不同的。MPI_SCATTER和MPI_GATHER的效果正好相反,两者互为逆操作。

数据散发

对于所有非根进程,发送消息缓冲区被忽略。根进程中的发送数据元素个数sendcount和发送数据类型sendtype必须和所有进程的接收数据元素个数recvcount和接收数据类型recvtype相同。根进程发送元素个数指的是发送给每一个进程的数据元素的个数,而不是总的数据个数。这就意味着在每个进程和根进程之间,发送的数据个数必须和接收的数据个数相等。
此调用中的所有参数对根进程来说都是有意义的,而对于其他进程来说,只有recvbuf、recvcount、recvtype、root和comm是有意义的。参数root和comm在所有进程中都必须是一致的。

MPI_SCATTERV(sendbuf, sendcounts, displs, sendtype, recvbuf, recvcount, recvtype, root, comm)
INsendbuf发送消息缓冲区的起始地址(可选数据类型)
INsendcounts 发送数据的个数,整数数组 (整型)
INdispls 发送数据偏移,整数数组(整型)
INsendtype发送消息缓冲区中元素类型(句柄)
OUTrecvbuf 接收消息缓冲区的起始地址(可变)
INrecvcount接收消息缓冲区中数据的个数(整型)
INrecvtype接收消息缓冲区中元素的类型(句柄)
INroot发送进程的标识号(句柄)
INcomm 通信域(句柄)
int MPI_Scatterv(void* sendbuf, int *sendcounts, int *displs, MPI_Datatype sendtype,
void* recvbuf, int recvcount, MPI_Datatype recvtype, int root,
MPI_Comm comm)
MPI_SCATTERV(SENDBUF, SENDCOUNTS, DISPLS, SENDTYPE, RECVBUF,
RECVCOUNT, RECVTYPE, ROOT, COMM, IERROR)
<type> SENDBUF(*), RECVBUF(*)
INTEGER SENDCOUNTS(*), DISPLS(*), SENDTYPE, RECVCOUNT,
RECVTYPE, ROOT, COMM, IERROR

正如MPI_SCATTER是MPI_GATHER的逆操作一样,MPI_SCATTERV是MPI_GATHERV的逆操作。
MPI_SCATTERV对MPI_SCATTER的功能进行了扩展,它允许ROOT向各个进程发送个数不等的数据,因此要求sendcounts是一个数组。同时还提供一个新的参数displs,指明根进程发往其它不同进程数据在根发送缓冲区中的偏移位置。对于所有非根进程,发送消息缓冲区被忽略。根进程中sendcount[i]和sendtype的类型必须和进程i的recvcount和recvtype的类型相同,这就意谓着在每个进程和根进程之间,发送的数据量必须和接收的数据量相等。
此调用中的所有参数对根进程来说都是很重要的,而对于其他进程来说只有recvbuf、recvcount、recvtype、root和comm是必不可少的。参数root和comm在所有进程中都必须是一致的。

下面的程序片段实现根进程将向组内的每个进程分散100个整型数据。
MPI_Comm comm;
int gsize,*sendbuf;
int root,rbuf[100];
......
MPI_Comm_size(comm, &gsize);
sendbuf = (int *)malloc(gsize*100*sizeof(int));
......
MPI_Scatter(sendbuf, 100, MPI_INT, rbuf, 100, MPI_INT, root, comm);