我想知道是否有一种聪明的方法可以做到这一点。假设我有三个节点,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}
我想到的方法是涉及排序和临时缓冲,但我想知道是否有更聪明的方法?
答案 0 :(得分:1)
您可以通过以下方式使用MPI_Alltoallv
:
local_data
(a
)进行排序。send_displacements
数组,send_displacements[r]
表示local_data
中引用节点r
的第一个元素的索引。send_counts
数组,使send_counts[r]
等于local_data
中与节点r
对应的元素数。除最后一个等级外,这可以计算send_counts[r] = send_displacements[r+1] - send_displacements[r]
。MPI_Alltoall(send_counts, 1, MPI_INT, recv_counts, 1, MPI_INT, comm)
recv_displacements
recv_displacements[r] = sum(recv_counts[r'] for all r' < r)
。recv_data
。MPI_Alltoallv(local_data, send_counts, send_displacements, MPI_INT, recv_data, recv_counts, recv_displacements, MPI_INT, comm)