2

我正在创建一个调用 Nvidia 的 Sum Reduction 内核(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

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

4

1 回答 1

6

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

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

对浮点数求和的方法有很多种,每种方法对不同的输入分布都有准确性优势。这是一个体面的调查

给定顺序的顺序求和很少是最准确的求和方式,因此,如果这是您要比较的内容,请不要指望它与典型并行归约中使用的基于树的求和相比较。

于 2013-03-01T03:05:50.300 回答