2013-02-28 116 views
2

我正在創建一個調用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 

任何想法,這個錯誤?謝謝。

+3

我沒有看到錯誤,我看到了差異。而且可能完全正常,並有可能出現差異。寫一個雙精度總和減少並在CPU上運行,然後將CPU和GPU單精度結果與雙精度結果進行比較。你可能會驚訝的結果..... – talonmies 2013-02-28 15:46:54

+0

@talonmies不應該是相同的雙精度?或者它取決於GPU架構? – pQB 2013-02-28 15:57:09

+1

@pQB:也許你誤解了。我的意思是,單精度解決方案(GPU和CPU)應該與雙精度或四精度參考解決方案進行比較,而不是相互比較。 – talonmies 2013-02-28 16:00:18

回答

6

Floating point addition is not necessarily associative

這意味着當您更改浮點求和操作的順序時,可能會得到不同的結果。按定義並行化總和會改變總和的操作順序。

有許多方法可以對浮點數進行求和,並且每種方法都對不同的輸入分佈具有準確性好處。 Here's a decent survey

按給定順序的順序求和幾乎不是最準確的求和方式,所以如果這是你的比較,不要指望它與典型並行求和中使用的基於樹的求和相比較。