我在并行程序中使用MPI_Scatterv
时遇到问题。以下是它的定义方式:
int MPI_Scatterv(const void *sendbuf, const int *sendcounts,
const int *displs, MPI_Datatype sendtype, void *recvbuf,
int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm)
我理解它的方式,MPI_Scatterv
和MPI_Scatter
之间的区别在于MPI_Scatterv
段不必具有相同的长度而且不必是连续的(允许内存中的间隙)。我不明白的部分是recvbuf
是否可以是每个进程的不同大小的数组,那么recvcount
应该使用什么。假设我想将5个sendbuf元素发送到流程0,将15个元素发送到流程1. recvcount
的值应该是什么?
答案 0 :(得分:5)
每个流程都必须使用正确的MPI_Scatterv
致电recvcount
。您可以传递一个值,该值取决于每个进程的等级。
例如:
int recvcount = (rank == 0) ? 5 : 15;
MPI_Scatterv( sendbuf, sendcounts, displs, sendtype,
recvbuf, recvcount, recvtype, 0, MPI_COMM_WORLD );
排名为0
的流程调用MPI_Scatterv
,recvcount
为5
,而流程1
则会计入15
。