一、浮点计算的舍入误差
在cuda的浮点数计算中,float的性能要高于double。32位在累加大量数字的时候,一个非常小的,小数部分的贡献可能会被舍入为零,cuda一般计算的数量都非常的庞大,累计起来,会造成不小的误差。
二、Kahan算法
1、原理
Kahan算法通过引入一个补偿变量c来跟踪由于舍入而丢失的重要的低位信息
2、计算步骤
(1)在每次加法时,首先计算当前数 x 与补偿 c 的差 y,这可以让我们在计算和时尽量减少舍入误差;
(2)然后,将 y 加到当前的总和 sum 中,得到一个临时和 t;
(3)接下来,通过 (t - sum) - y 计算新的补偿 c,这个过程实际上是在恢复丢失的低位部分;(4)最后,将临时和 t 更新到 sum 中。
3、伪代码
function KahanSum