【问题标题】:MPI Communication PatternMPI 通信模式
【发布时间】:2016-05-04 15:40:35
【问题描述】:

我想知道是否有一种聪明的方法可以做到这一点。假设我有三个节点,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 填充 a0,用 1 填充 a1 等等吗?据推测,您的问题比您的示例显示的要多。也不清楚您所说的“三个节点,0、1、2”是什么意思,以及它与 MPI“节点”(计算机)或数组中的 0、1、2 值有何关系。
  • 谢谢约翰。我想祖蓝是在正确的道路上。这三个节点是独立的计算机。是的,问题还有更多。我只选择数组中的值是为了让我的意图更清楚。我想我在那个 xp 上失败了

标签: mpi


【解决方案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)

【讨论】:

  • 谢谢 Zulan 我想这是我想到的方法(虽然更充实了一点)。这是这种问题的典型通信模式吗?
  • 我想说这是解决这个问题的一种非常惯用的方法。但是,我不认为这是一个普遍的问题。
猜你喜欢
  • 2014-06-03
  • 2012-03-17
  • 2019-09-15
  • 2019-05-29
  • 2012-05-24
  • 2020-03-25
  • 2019-06-11
  • 2021-09-13
  • 2013-02-07
相关资源
最近更新 更多