如何正确使用MPI_Scatterv()

Han*_*i_l 2 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)
Run Code Online (Sandbox Code Playgroud)

顺便我的理解,之间的差MPI_ScattervMPI_Scatter是一个事实,即在MPI_Scatterv段不必是相同长度的,它们不必是连续的(在存储器中的间隙被允许)。我不了解的部分是recvbuf,对于每个过程,如果可以是不同大小的数组,那么应该使用什么recvcount。假设我要发送5个sendbuf元素到进程0,发送15个元素到进程1。be的值应该recvcount是多少?

use*_*815 5

每个过程都必须MPI_Scatterv以正确的方式进行调用recvcount。您可以传递一个变量,其值取决于每个进程的等级。

例如:

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

MPI_Scatterv( sendbuf, sendcounts, displs, sendtype,
              recvbuf, recvcount, recvtype, 0, MPI_COMM_WORLD );
Run Code Online (Sandbox Code Playgroud)

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