可以创建一个MPI_Op
可以标记为不可交换的。
是否可以制作/使用MPI_Op
非关联的?如果不是,为什么不呢?
让我们MPI_Reduce
用作假设用途。
假设您有一个由 3 个节点组成的集群,每个节点有 2 个核心,每个核心拥有 1 个值(v1、v2、...、v6)。假设您有一个聪明的 MPI 实现,它知道这种拓扑,并执行缩减以最小化节点间通信。它通过计算每个节点上的小计,然后将小计从一个节点传递到另一个节点来做到这一点。换句话说:
( ((v1 + v2) + (v3 + v4) ) + (v5 + v6)
现在,假设您想对相同的数据执行相同的操作,但这次您有 2 个节点,每个节点有 3 个核心。因为实现希望最小化节点间消息传递,所以现在的最终结果是:
(v1 + v2 + v3) + (v4 + v5 + v6)
如果 + 操作不是关联的,那么这两个结果可能完全不同。显然,这不是你想要的。
底线是非关联操作不适合并行评估。非关联性意味着您将值“添加”在一起的顺序很重要,这实际上意味着如果您想要一致的、明确定义的结果,则需要连续执行操作。