问题#1。
Scatterv的“displacements”参数的目的是什么?它与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 参数正在接收或发送?
答案 0 :(得分:3)
Q1。分散向量和聚集向量操作中的分布和计数的目的是相同的。两者都指定大缓冲区中的位置(散布中的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]
1}}(或recvcounts
)。
Q2。 sendbuf
,sendoffset
和sendcount
指定要收集的数据的本地部分。 recvbuf
,recvcounts[]
和displs[]
指定大缓冲区中要收集这些本地部分的部分。
所有这些都是用MPI标准编写的,恕我直言是少数人可以阅读的标准之一。