并行缩减的浮点数相关数值稳定性问题

Float related numerical stability issues for parallel reduction

我一直在查看一些与浮点求和和相关精度问题相关的在线资源。 例如。: https://devtalk.nvidia.com/default/topic/1044661/cuda-programming-and-performance/how-to-improve-float-array-summation-precision-and-stability-/

https://hal.archives-ouvertes.fr/hal-00949355v4/document

他们中的大多数人建议在处理任何现代硬件的浮点求和时使用某种形式的手动干预。例如。 (1) 使用 Kahan 算法进行浮点求和,或 (2) 将更接近的量级数排序并求和,等等。 这些细微差别是由 MPI_AllReduce 还是 OpenMP 缩减内核处理的?

仅针对 OpenMP:该标准没有说明缩减操作的应用顺序,事实上,每次执行代码时顺序甚至可能不同。 (一些 OpenMP 运行时,例如 LLVM/Intel 实现确定性缩减*,但仅保证具有相同线程数的运行之间的确定性)。

如果你想排序,或者用其他方式进行归约,你需要自己实现...