| MPI_SCATTER(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,
root,comm) INsendbuf发送消息缓冲区的起始地址(可选数据类型) INsendcount发送到各个进程的数据个数(整型)
INsendtype发送消息缓冲区中的数据类型(句柄) OUTrecvbuf接收消息缓冲区的起始地址(可选数据类型)
INrecvcount待接收的元素个数(整型) INrecvtype接收元素的数据类型(句柄) INroot发送进程的序列号(整型)
INcomm通信域(句柄) 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) INsendbuf发送消息缓冲区的起始地址(可选数据类型)
INsendcounts 发送数据的个数,整数数组 (整型) INdispls 发送数据偏移,整数数组(整型)
INsendtype发送消息缓冲区中元素类型(句柄) OUTrecvbuf 接收消息缓冲区的起始地址(可变)
INrecvcount接收消息缓冲区中数据的个数(整型) INrecvtype接收消息缓冲区中元素的类型(句柄)
INroot发送进程的标识号(句柄) INcomm 通信域(句柄) 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); | |