C++ MPJ Express Scatterv和Gatherv,int[]置换的目的是什么?

C++ MPJ Express Scatterv和Gatherv,int[]置换的目的是什么?,c++,mpi,java,C++,Mpi,Java,问题#1 Scatterv的“位移”参数的用途是什么?它与Gatherv有何不同?它如何支持地址空间上的“重叠”?你的平均位移阵列是什么样子的 Scatterv( Object sendbuf, int sendoffset, int[] sendcounts, int[] displs, Datatype sendtype, Object recvbuf, int recvoffset, int recvcount, Datatype recvtype, int root ) Gatherv

问题#1

Scatterv的“位移”参数的用途是什么?它与Gatherv有何不同?它如何支持地址空间上的“重叠”?你的平均位移阵列是什么样子的

Scatterv( Object sendbuf, int sendoffset, int[] sendcounts,
int[] displs, Datatype sendtype, Object recvbuf,
int recvoffset, int recvcount, Datatype recvtype,
int root )

Gatherv( Object sendbuf, Object sendbuf, int sendoffset,
int sendcount, Datatype sendtype, Object recvbuf,
int[] recvcounts, int[] displs, Datatype recvtype,
int root )
问题#2


在Gatherv中,两个sendbuf参数中的哪一个正在接收或发送?

Q1。在散射向量和聚集向量操作中,偏移和计数的目的是相同的。两者都指定了大缓冲区中每个数据块开始的位置(
sendbuf
in scatter,
recvbuf
in gather)以及它的元素数。在
Scatterv
中,这些用于定义将分散到通信器中所有进程的
sendbuf
中的块。在
Gatherv
中,这些用于定义在
recvbuf
中的何处放置来自通信器中所有进程的不同数据。MPI标准要求在分散期间不应多次读取单个位置,在聚集期间不应多次写入单个位置,即单个块不应重叠,但出于性能原因,大多数(如果不是全部)现有MPI实现不严格执行该约束。根据Joe在MPI代码中所做的操作,平均Joe置换数组看起来有所不同。由于
Scatterv
Gatherv
主要用于在其元素数量不能被通信器中的进程数量整除时实现数据的分散和收集,因此在大多数情况下
disfs[0]=0
disfs[i]=sendcounts[0]+sendcounts[1]+…+发送计数[i-1]
(或分别
记录计数

问题2
sendbuf
sendoffset
sendcount
指定要收集的数据的本地部分
recvbuf
recvcounts[]
dispuls[]
指定大缓冲区中要收集这些本地片段的部分

所有这些都是用MPI标准编写的,IMHO是为数不多的可供普通人阅读的标准之一。

非常感谢您,hristo!:)大量帮助