2012-08-01 80 views
1

最近,我一直在使用CUDA 開發環境使得方案(FDTD操作),操作系統是Windows Server 2008中,顯卡是TeslaC2070,編譯器是VS2010。該程序使用單精度浮點和雙精度浮點計算。約浮點運算

我讀了CUDA編程指南3.2和4.0。在附錄中,嚮導告訴我sin()cos()的最大精度爲2 ULP。我的原始CPU程序產生的結果與CUDA版本不同。

我想要的結果正確一致。可能嗎?

+3

是什麼讓你相信'sin'或'cos'惹的禍?什麼是您正在使用的主機庫的ULP?浮點運算不是關聯的。即使並行簡單操作(如求和)也會改變結果。 – talonmies 2012-08-01 20:01:59

+1

@talonmies,你爲什麼要在評論中發佈答案?好吧,我會咬人的。 :-) – harrism 2012-08-01 22:07:26

回答

3

引述Goldberg(紙,每一個計算機科學家,計算科學家,甚至可能是每一個科學家,誰的方案,應該讀):

由於舍入誤差,代數學的結合律不 一定保持浮點數。

這意味着,當您使用顯然是聯想算術—即使改變操作—的順序,你可能會得到稍微不同的答案。

並行,顧名思義,結果在不同的排序相對於串行運算操作。 「令人困窘的並行」計算,即每個輸出元素獨立於其他所有元素進行計算的計算,有時不必擔心這一點。但是像減少或掃描一樣的集體操作和空間鄰域計算等模板(如在FDTD中)一樣,也會遇到這種影響。

在實踐中,即使使用不同的編譯器(甚至不同的編譯器選擇)可以改變浮點計算的結果,編譯相同的代碼,即使,具有或不具有並行性。

+1

以下來自NVIDIA的白皮書介紹了CPU結果可能與GPU結果不同的各種原因:http://developer.download.nvidia.com/assets/cuda/files/NVIDIA-CUDA-Floating-Point.pdf – njuffa 2012-08-02 03:59:42