1

问题 #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参数中的哪一个正在接收或发送?

4

1 回答 1

3

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

Q2。sendbufsendoffsetsendcount指定要收集的数据的本地部分。recvbufrecvcounts[]displs[]指定大缓冲区中要收集这些本地片段的部分。

这一切都是用 MPI 标准编写的,恕我直言,这是为数不多的普通人可以阅读的标准之一。

于 2012-05-23T10:57:43.873 回答