是否可以进行非关联MPI_操作?

是否可以进行非关联MPI_操作?,mpi,Mpi,有可能将其标记为非交换的 是否可以制作/使用非关联的MPI\u Op?若否,原因为何 让我们假设使用MPI\u Reduce。假设您有一个由3个节点组成的集群,每个节点有2个核心,每个核心拥有1个值(v1、v2、…、v6)。假设您有一个聪明的MPI实现,它知道这种拓扑结构,并执行缩减以最小化节点间通信。它通过计算每个节点上的小计来实现这一点,然后将小计从一个节点传递到另一个节点。换言之: 节点1计算v1+v2 与步骤1并行,节点2计算v3+v4,节点3计算v5+v6 节点1向节点2发送(v1+v

有可能将其标记为非交换的

是否可以制作/使用非关联的
MPI\u Op
?若否,原因为何


让我们假设使用
MPI\u Reduce

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

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

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

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

    如果+运算不关联,则这两个结果可能完全不同。显然,这不是你想要的



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

    对于交换性,可以使用相同的优化参数。那么为什么这是可选的呢?@Adam,非交换运算符仍然可以并行计算。交换性允许使用任意的求值树,而不是严格按序树。后者可能无法很好地映射到具有特定秩排列的底层网络拓扑,并导致计算速度缓慢。@Adam非交换性并不是一个很大的障碍。考虑4个节点,每个核2个。如果操作是关联的但不是可交换的,则节点4仍然可以与节点3计算小计,然后等待节点1和2的组合小计。看看一些并行算法(例如),你自己应该能够看到它们之间的区别。我理解为什么关联性是有用的。但也有一些情况需要执行非关联操作,而不考虑性能成本。我从你们那里听到的是,MPI只帮助你们做并行工作,你们应该自己构建自己潜在的串行语义。是吗?@Adam我认为问题的关键在于MPI提供的功能对于用户自己实现(正确且高效)来说会很麻烦。当然,对于非关联操作,可能会有一个带有order参数的Reduce函数,但您可以使用一个Send和一个Recv获得相同的结果,并且它将与任何MPI实现一样高效。