MPI_GATHER(sendbuf,
sendcount, sendtype, recvbuf, recvcount, recvtype, root , comm) INsendbuf发送消息缓冲区的起始地址(可选数据类型) INsendcount发送消息缓冲区中的数据个数(整型) INsendtype发送消息缓冲区中的数据类型(句柄) OUTrecvbuf 接收消息缓冲区的起始地址(可选数据类型) INrecvcount待接收的元素个数(整型,仅对于根进程有意义) INrecvtype接收元素的数据类型(句柄,仅对于根进程有意义) INroot接收进程的序列号(整型) INcomm通信域(句柄) int MPI_Gather(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm) MPI_GATHER(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT, RECVTYPE,ROOT, COMM, IERROR) <type> SENDBUF(*), RECVBUF(*) INTEGER SENDCOUNT, SENDTYPE, RECVCOUNT, RECVTYPE, ROOT, COMM, IERROR 收集MPI_GATHER是典型的多对一通信的例子。在收集调用中,每个进程(包括根进程本身)将其发送缓冲区中的消息发送到根进程,根进程根据发送进程的进程标识的序号即进程的rank值,将它们各自的消息依次存放到自已的消息缓冲区中。和广播调用不同的是,广播出去的数据都是相同的,但对于收集操作,虽然从各个进程收集到的数据的个数必须相同,但从各个进程收集到的数据一般是互不相同的。其结果就象一个进程组中的N个进程(包括根进程在内)都执行了一个发送调用,同时根进程执行了N次接收调用。
MPI_GATHERV(sendbuf,
sendcount, sendtype, recvbuf, recvcounts, displs,recvtype, MPI_GATHERV和MPI_GATHER的功能类似,也完成数据收集的功能,但是它可以从不同的进程接收不同数量的数据。为此,接收数据元素的个数recvcounts是一个数组,用于指明从不同的进程接收的数据元素的个数。根从每一个进程接收的数据元素的个数可以不同,但是发送和接收的个数必须一致。除此之外,它还为每一个接收消息在接收缓冲区的位置提供了一个位置偏移displs数组,用户可以将接收的数据存放到根进程消息缓冲区的任意位置。也就是说,MPI_GATHERV明确指出了从不同的进程接收数据元素的个数以及这些数据在ROOT的接收缓冲区存放的起始位置,这是它相对于MPI_GATHER灵活的地方,也是比MPI_GATHER复杂的地方。
MPI_Comm comm; | |||