如何正确使用 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_Scatterv
和 MPI_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_Scatterv
,recvcount
为 5
,而进程 1
传递的计数为 15
。
我在并行程序中使用 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
应该使用什么。假设我想将 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_Scatterv
,recvcount
为 5
,而进程 1
传递的计数为 15
。