我正在创建一个调用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
关于这个错误的任何想法?,谢谢。
答案 0 :(得分:6)
Floating point addition is not necessarily associative
这意味着当您更改浮点求和的运算顺序时,可能会得到不同的结果。按定义并行求和会改变求和的运算顺序。
有许多方法可以对浮点数进行求和,并且每种方法都具有针对不同输入分布的准确性优势。 Here's a decent survey。
给定顺序的顺序求和很少是求和的最准确方法,因此,如果这是您要比较的内容,请不要指望它与典型并行缩减中使用的基于树的求和进行比较。 / p>