MPI通信模式

时间:2016-05-03 23:00:44

标签: mpi

我想知道是否有一种聪明的方法可以做到这一点。假设我有三个节点,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}

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

1 个答案:

答案 0 :(得分:1)

您可以通过以下方式使用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)