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

use*_*311 2 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
Run Code Online (Sandbox Code Playgroud)

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

har*_*ism 6

浮点加法不一定是关联的.

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

有许多方法可以对浮点数进行求和,并且每种方法都具有针对不同输入分布的准确性优势.这是一个不错的调查.

给定顺序的顺序求和很少是最精确的求和方式,因此,如果这是您要比较的,那么不要指望它与典型的并行缩减中使用的基于树的求和进行比较.