2

可以创建一个MPI_Op可以标记为不可交换的。

是否可以制作/使用MPI_Op非关联的?如果不是,为什么不呢?

让我们MPI_Reduce用作假设用途。

4

1 回答 1

2

假设您有一个由 3 个节点组成的集群,每个节点有 2 个核心,每个核心拥有 1 个值(v1、v2、...、v6)。假设您有一个聪明的 MPI 实现,它知道这种拓扑,并执行缩减以最小化节点间通信。它通过计算每个节点上的小计,然后将小计从一个节点传递到另一个节点来做到这一点。换句话说:

  1. 节点 1 计算 v1 + v2。
  2. 与步骤 1 并行,节点 2 计算 v3 + v4,节点 3 计算 v5 + v6。
  3. 节点 1 将 (v1 + v2) 发送给节点 2,后者将其添加到自己的小计中。结果是 (v1 + v2) + (v3 + v4)。
  4. 节点 2 将此结果传递给节点 3,后者将其添加到自己的小计中。最终结果是:

( ((v1 + v2) + (v3 + v4) ) + (v5 + v6)

现在,假设您想对相同的数据执行相同的操作,但这次您有 2 个节点,每个节点有 3 个核心。因为实现希望最小化节点间消息传递,所以现在的最终结果是:

(v1 + v2 + v3) + (v4 + v5 + v6)

如果 + 操作不是关联的,那么这两个结果可能完全不同。显然,这不是你想要的。


底线是非关联操作不适合并行评估。非关联性意味着您将值“添加”在一起的顺序很重要,这实际上意味着如果您想要一致的、明确定义的结果,则需要连续执行操作。

于 2013-10-15T23:08:33.223 回答