调优简介

MPI_Allreduce函数会对数组进行规约操作(sum += a1+a2+a3…),高并发场景下,规约的顺序会极大影响浮点计算结果。精度问题本质上是并行领域长期存在的可复制性(Reproducibility)问题,其根本原因在于计算机浮点计算有截断误差,不满足结合律,如图1。由于计算结果依赖于操作的顺序,当有多进程/多线程进行运算时,必然会因为计算顺序不同而导致差异的存在。

图1 结合律问题

MPI中涉及依赖于操作顺序的浮点计算的操作有MPI_Allreduce、MPI_Reduce、MPI_Reduce_scatter、MPI_Scan和MPI_Exscan。MPI集合通信操作有很多不同的集合通信算法。不同的算法,规约顺序不同,最终计算结果也不尽相同,以Allreduce Algorithm为例(Recursive Doubling对比Rabenseinfner):

图2 Rabenseifner(recursive having对比ring)的数据流图