GPU 相比 CPU 計算容易出錯嗎?
《在顯卡上跑資料庫》中文末寫道「GPU還有一個問題是容易出錯」。
我搜了下google查到的不多,發現「英偉達的 Tesla GPU 性能有多強勁,跟普通 GPU 的主要區別是什麼?」里也有說:「Tesla作為專用計算顯卡,包括了如ECC memory等增強穩定性的措施,使得計算結果更不容易出錯」。所以應該是確實存在這個問題。http://comment8.mydrivers.com/review/287725-1.htm 這裡也有看到一些相關討論,但是似乎意見不一致。所以想問下:
- 為什麼gpu計算容易出錯?
- 為什麼gpu在設計成允許出錯的?
- CPU就不會出錯了嗎?
GPU 相比 CPU 計算容易出錯嗎?
這種出錯分為兩種
一個是只由於浮點運算的round-off 誤差累積而造成的錯誤. 另一個是由於代碼編寫者對GPU架構的不熟悉或者並行運算不熟悉而編寫了他們以為是對的, 但實際執行時卻不可能按照他們預期去執行併產生正確結果而造成的.- 為什麼gpu計算容易出錯?
- 因為GPU就是被設計成允許出錯的.
- 為什麼gpu在設計成允許出錯的?
- 因為初期GPU設計得目的是為了計算出每個像素的顏色(r,g,b,a)數值, 而對於一個顏色而言,0.001和0.0008 兩個值, 人的肉眼已經幾乎無法分辨出差別了(當然了, GPU的運算精度要遠高於這個), 所以為了運算速度, 早期的GPU捨棄了浮點運算的精度.
但是像這樣的誤差, 再做對數學運算精度要求很高的數值模擬運算的時候就無法被接受了. 特別是在數值求解常微分或者偏微分方程的過程中, 微小的誤差不斷地累積會使得最後的結果與實際情況相差太大. 於是就有了"GPU的運算比CPU更容易出錯"這一個說法.
對於第二種錯誤, 只有更多的並行編程經驗可以幫助識別並解決問題.
但總的來說, 用GPU來做運算, 搞出錯誤的程序的機會比用CPU做運算的更大.數據量不是一個級別,可以手動糾錯或者靠ECC 等減少pagefault。朋友之前用顯卡跑彩虹表說是這樣。 @illusionwing
應該不是浮點精度的問題,雖然cpu有擴展精度,但主要用在科研上,x87指令較慢啊。我覺得一個更精確的描述是:GPU對於單/雙精度浮點數運算的精度和CPU相比還有一定差距。之所以得出容易出錯的結論,原因應該有兩個:1)演算法本身的數值計算步驟太多,導致無法消除的累計誤差,從而產生錯誤。2)沒有足夠小心的對結果進行驗證。
我同意匿名用戶關於ECC的看法。我其實對這個話題了解也有限,如果對NVIDIA顯卡的浮點運算的深入討論可以參考這份白皮書:
https://developer.nvidia.com/sites/default/files/akamai/cuda/files/NVIDIA-CUDA-Floating-Point.pdf你說的出錯指的浮點數精度嗎?消費級別顯卡的double運算可以忽略,當然titan是個奇葩。專業級計算卡諸如tesla則雙精度浮點很強
1:一個好的GPU程序,需要的很多經驗是跟寫CPU的時候完全相反的。演算法和數據結構也完全不一樣了,寫起來特別彆扭,所以一不小心出錯什麼的那是常有的。
2:在windows XP的時候,GPU的確是不允許出錯的啊。一個shader除了0,立刻就藍屏了。不過從Vista開始不會了,只會黑屏幾秒鐘,然後你的程序崩了,別人還是好的。
排名第一的 @張心欣 說的比較全面,再補充一點兒
實際上,排除GPU程序編寫時有錯誤的情況,GPU造成的錯誤(或者誤差)的原因有多種,例如(1)無ECC的顯存的不可靠性;(2)早期GPU計算允許少量誤差(3)早期GPU沒有雙精度算術單元,雙精度計算需要軟實現等等。這些問題隨著GPU的進化已經有相當大的改善了。
就目前來說,GPU容易出錯的最大原因,還是來源於GPU的雙精度浮點單元內部使用64位浮點運算;而CPU上,如果採用x87指令進行雙精度運算,則CPU內部使用80位浮點運算。在科學計算中,隨著誤差的累積、傳遞和放大,這一點誤差就會轉變為錯誤。若CPU使用多媒體指令集(SSE,3DNow等),則其內部採用的64位浮點運算與GPU就一致了。先前,GPU主要是圖形的浮點運算,隻影響像素的渲染,差點事幾乎看不出來。現在,GPU越來越多有了計算需求,很多運算不再是直接圖形相關,但是仍然是浮點運算為主,也就仍然有浮點運算的各種問題,例如對齊,截斷等。這些固有的造成精度變差的因素使得GPU本身就不是一個嚴格連貫與正確的運算設備,在超大量計算時,出錯控制可能也沒那麼好,或者是抑制錯誤的代價非常高。當然,自認為GPU邏輯控制的部分是要嚴格控制錯誤的,否則代碼跑不下去啊。
我有個同事用gpu做圖像處理,主要是把過去的cpu演算法改成gpu的,沒聽說出錯呀,倪說的出錯估計和浮點精度有關係吧,倪可以研究研究gpu的雙浮點精度,聽說現在gpu的雙浮點精度也上來了。。。這個具體幫不了你,我儘力了。
推薦閱讀:
※英特爾目前的競爭對手都有誰?
※如何評價適用筆電的第八代標壓CPU i7-8720HQ ?
※散裝CPU存在的問題有哪些?散裝為什麼比原裝可以便宜那麼多
※如何評價 AMD 正式發布的 Ryzen 5 四核/六核系列處理器?