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
:
- 将
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)
.
- 准备一个包含 sum(recv_counts) 个元素的
recv_data
。
MPI_Alltoallv(local_data, send_counts, send_displacements, MPI_INT, recv_data, recv_counts, recv_displacements, MPI_INT, comm)
我想知道是否有聪明的方法来做到这一点。假设我有三个节点 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
:
- 将
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)
. - 准备一个包含 sum(recv_counts) 个元素的
recv_data
。 MPI_Alltoallv(local_data, send_counts, send_displacements, MPI_INT, recv_data, recv_counts, recv_displacements, MPI_INT, comm)