如何正确使用MPI_Scatterv()

时间:2015-03-29 12:57:30

标签: c++ c parallel-processing mpi

我在并行程序中使用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的值应该是什么?

1 个答案:

答案 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_Scattervrecvcount5,而流程1则会计入15