问题#1。
Scatterv的“位移”参数的目的是什么?它与Gatherv有什么不同?以及它如何防止地址空间上的“重叠”?您的平均joe位移数组是什么样的?
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。在散点 vector 和聚集 vector 操作中,分隔和计数的目的是相同的。两者都从每个数据块的起始位置及其所在的元素中指定了大缓冲区(分散中的sendbuf
,聚集中的recvbuf
)中的位置。在Scatterv
中,这些用于定义sendbuf
中要散布到通信器中所有进程的块。在Gatherv
中,这些用于定义在recvbuf
中的何处放置来自通信器中所有进程的不同数据。 MPI标准要求在散布期间不应读取单个位置多次,并且在收集期间不应多次写入单个位置,即各个块不应重叠,但出于性能原因,大多数(如果不是全部)存在MPI实现不严格执行该约束。根据Joe在其MPI代码中所做的操作,平均Joe位移数组看起来会有所不同。由于Scatterv
和Gatherv
通常用于在通信器中的元素数不能被进程数整除的情况下实现数据的分散和收集,因此在大多数情况下为displs[0] = 0
和displs[i] = sendcounts[0] + sendcounts[1] + ... + sendcounts[i-1]
(或recvcounts
)。
Q2。 sendbuf
,sendoffset
和sendcount
指定要收集的数据的本地部分。 recvbuf
,recvcounts[]
和displs[]
指定大缓冲区中要收集这些局部片段的部分。
这些都是用MPI标准编写的,IMHO是少数凡人都能读取的标准之一。