具有浮点数的减少内核的精度

时间:2013-02-28 15:42:34

标签: cuda

我正在创建一个调用Nvidia减少内核的例程(reduction6),但是当我比较CPU和GPU之间的结果时,得到的错误会随着矢量大小的增加而增加,所以:

CPU和GPU减少都是浮动

Size: 1024  (Blocks : 1,  Threads : 512)
Reduction on CPU:  508.1255188 
Reduction on GPU:  508.1254883 
Error:  6.0059137e-06

Size: 16384 (Blocks : 8, Threads : 1024)
Reduction on CPU:  4971.3193359 
Reduction on GPU:  4971.3217773 
Error:  4.9109825e-05

Size: 131072 (Blocks : 64, Threads : 1024)
Reduction on CPU:  49986.6718750 
Reduction on GPU:  49986.8203125 
Error:  2.9695415e-04

Size: 1048576 (Blocks : 512, Threads : 1024)
Reduction on CPU:  500003.7500000 
Reduction on GPU:  500006.8125000 
Error:  6.1249541e-04

关于这个错误的任何想法?,谢谢。

1 个答案:

答案 0 :(得分:6)

Floating point addition is not necessarily associative

这意味着当您更改浮点求和的运算顺序时,可能会得到不同的结果。按定义并行求和会改变求和的运算顺序。

有许多方法可以对浮点数进行求和,并且每种方法都具有针对不同输入分布的准确性优势。 Here's a decent survey

给定顺序的顺序求和很少是求和的最准确方法,因此,如果这是您要比较的内容,请不要指望它与典型并行缩减中使用的基于树的求和进行比较。 / p>