如何正确使用MPI_Scatterv()

我在并行程序中使用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_ScattervMPI_Scatter之间的区别在于, MPI_Scatterv段中的段不必具有相同的长度,并且它们不必是连续的(允许存储器中的间隙)。 我不明白的部分是,如果recvbuf可以是每个进程的不同大小的数组,那么应该用于recvcount 。 假设我想将5个sendbuf元素发送到进程0和15进行处理1. recvcount的值应该是多少?

每个进程都必须使用正确的recvcount调用recvcount 。 您可以传递一个值,该值取决于每个进程的等级。

例如:

 int recvcount = (rank == 0) ? 5 : 15; MPI_Scatterv( sendbuf, sendcounts, displs, sendtype, recvbuf, recvcount, recvtype, 0, MPI_COMM_WORLD ); 

等级0进程调用MPI_Scattervrecvcount5而进程1传递计数15