MPI 通信模式

MPI Communication Pattern

我想知道是否有聪明的方法来做到这一点。假设我有三个节点 0、1、2。假设每个节点都有一个数组 a0、a1、a2。如果每个节点的内容是

a0 = {0, 1, 2, 1}
a1 = {1, 2, 2, 0}
a2 = {0, 0, 1, 2}

是否有一个聪明的通信模式,以便将每个数字移动到它对应的节点,即

a0 = {0, 0, 0, 0}
a1 = {1, 1, 1, 1}
a2 = {2, 2, 2, 2}

我想到的方法将涉及排序和临时缓冲区,但我想知道是否有更聪明的方法?

您可以通过以下方式使用 MPI_Alltoallv

  1. local_dataa)按每个元素对应的节点升序排列。
  2. 创建一个 send_displacements 数组,使得 send_displacements[r] 指示 local_data 中第一个元素的索引,该元素引用节点 r
  3. 创建一个 send_counts 数组,使得 send_counts[r] 等于 local_data 中对应于节点 r 的元素数。这可以计算 send_counts[r] = send_displacements[r+1] - send_displacements[r] 除了最后一个排名。
  4. MPI_Alltoall(send_counts, 1, MPI_INT, recv_counts, 1, MPI_INT, comm)
  5. 计算 recv_displacements 使得 recv_displacements[r] = sum(recv_counts[r'] for all r' < r).
  6. 准备一个包含 sum(recv_counts) 个元素的 recv_data
  7. MPI_Alltoallv(local_data, send_counts, send_displacements, MPI_INT, recv_data, recv_counts, recv_displacements, MPI_INT, comm)