MPI_Reduce 与(MPI_Gather + 根减少)的性能

Performance of MPI_Reduce vs (MPI_Gather + Reduction on Root)

使用 MPICH2 库的 CRAY 超级计算机。每个节点有32个CPU的。

我在 N 个不同的 MPI 等级上有一个浮点数,其中每个等级都在不同的节点上。我需要对这组浮点数进行归约操作。我想知道对于任何 N 值,MPI_Reduce 是否比 MPI_Gather 在根上计算的减少更快。请假设在根等级上完成的减少将使用一个好的可以利用 N 个线程的并行归约算法。

如果 N 的任何值都不是更快,那么对于更小的 N(如 16)或更大的 N 是否更趋于正确?

如果是真的,为什么? (例如,MPI_Reduce 是否会使用一种树通信模式,这种模式往往会在用于与树的下一层进行通信的方法中隐藏归约操作的时间?)

假设 MPI_Reduce 总是比 MPI_Gather + local reduce 快。

即使存在减少比收集慢的 N 情况,MPI 实现也可以在收集 + 本地减少方面轻松实现这种情况下的减少。

MPI_Reduce 仅优于 MPI_Gather + local reduce:

  1. MPI_Reduce 是更高级别的操作,为实现提供了更多优化机会。
  2. MPI_Reduce 需要分配更少的内存
  3. MPI_Reduce 需要传输更少的数据(如果使用树)或在相同的 link 上传输更少的数据(如果使用直接多对一)
  4. MPI_Reduce 可以在更多资源上分配计算(例如使用树通信模式)

也就是说: 永远不要对性能做出任何假设。测量.