如何正确使用 MPI_Scatterv()

how to use MPI_Scatterv() properly

我在并行程序中使用 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 应该使用什么。假设我想将 sendbuf 的 5 个元素发送到进程 0,将 15 个元素发送到进程 1。recvcount 的值应该是多少?

每个进程都要用recvcount调用MPI_Scatterv。您可以传递一个变量,其值取决于每个进程的等级。

例如:

int recvcount = (rank == 0) ? 5 : 15;

MPI_Scatterv( sendbuf, sendcounts, displs, sendtype,
              recvbuf, recvcount, recvtype, 0, MPI_COMM_WORLD );

具有等级 0 的进程调用 MPI_Scattervrecvcount5,而进程 1 传递的计数为 15