答案 0 :(得分:2)
假设您有一个包含3个节点的集群,每个节点有2个核心,每个核心拥有1个值(v1,v2,...,v6)。假设您有一个知道此拓扑的聪明的MPI实现,并执行减少以最小化节点间通信。它通过计算每个节点上的小计,然后将小计从一个节点传递到另一个节点来实现。换句话说:
((v1 + v2)+(v3 + v4))+(v5 + v6)
现在,假设您想对相同的数据执行相同的操作,但这次您有2个节点,每个节点有3个核心。因为实现希望最小化节点间消息传递,所以最终结果将是:
(v1 + v2 + v3)+(v4 + v5 + v6)
如果+操作不是关联的,那么这两个结果可能完全不同。显然,这不是你想要的东西。
底线是非关联操作不适合并行评估。非关联性意味着您将值“添加”在一起的顺序很重要,这实际上意味着如果您需要一致,明确定义的结果,则需要按顺序执行操作。