• 2

請問TITAN的精確度浮點運算是什東西

在做物理模擬時使用CPU或GPU計算的結果會不太一樣,GPU常常會不太準確
像我自己常在做的流體模擬,如果改成用GPU算的話果就會怪怪的,跟CPU算的整個不一樣(但整個飛快欲罷不能)

不過TITAN的介紹中有提到精確度浮點運算跟雙精確度浮點運算這兩個東西可以做科學運算
意思是用TITAN的話就可以得到跟CPU一樣的結果嗎?
2013-05-30 10:39 發佈
NVIDIA GTX TITAN 遊戲、運算二合一,打造全新產品線

這是比較簡單的網頁解釋

基本上電腦運算中帶有小數的數字就叫浮點數
而浮點數分兩種
一種叫單精度
一種叫雙精度(單精度的2倍)
精度越高 誤差越小
使用CPU運算一定可以使用雙精度運算
但因為執行緒數目的關係 通常很慢
使用顯卡運算 執行緒超多 所以超快
但大部分的顯卡都只提供單精度運算 高階顯卡或專門用於科學運算的顯卡 才會提供雙精度
Nvidia的話是Titan,AMD是Tahiti系列核心

<<以下內容錯誤 自行刪文>>

以上是我的見解,還請板上的高手指教
x225089x wrote:
這裡說的誤差是電腦上數字表達的誤差,不是樓主所提供的公式中的誤差
簡單而言,電腦沒辦法準確表達0.1這個數值(很有名的就是0.1連加10次不等於1)
這是需要額外去校正的,也就是文中提到的ECC校正
CPU的運算通常會有(記憶體要特別挑一下,或是使用的程式語言自己會去較正)

ECC是用來防止記憶體出錯的,就算全部用整數下去運算也會需要ECC。
另外,我只聽過rounding mode,沒聽過有人會額外去校正數值的誤差
能否告知更詳細的資訊?

另外回應樓主的問題,double precision需要Compute Capability 1.3以上才能使用。
而且你還需要確認rounding mode的設定或者是該軟體是否有使用低精準度的方程式(fast sin or cos)
rgly wrote:
ECC是用來防止記憶...(恕刪)


恩 看來ECC這塊我真的錯了
謝謝指正

另外 我想表達的就是rounding mode 這可能存在於code裡面
不過是軟體面的 應該跟硬體無關 這裡我又錯了
像是
power(sqrt(3.45), 2)←開根號後平方

sqrt(3.45) * sqrt(3.45)←根號後相乘 答案不相同
不過這算是軟體面的需要去校正就是了
這東西就要看會是一連串需要校正的地方
謝謝指正

不過用單精度來計算雙精度的東西
是可以肯定會存在誤差
而在一連串的計算之後
就會產生失準的問題

我先去面壁一下了...

x225089x wrote:
另外 我想表達的就是rounding mode 這可能存在於code裡面
不過是軟體面的 應該跟硬體無關 這裡我又錯了

我總覺的你講的rounding mode 跟我講的好像是不同的東西
我下面直接貼出官方CUDA3.2文件的內容
All compute devices follow the IEEE 754-2008 standard for binary floating-point arithmetic with the following deviations:
● There is no dynamically configurable rounding mode; however, most of the
operations support multiple IEEE rounding modes, exposed via device
intrinsics;
● There is no mechanism for detecting that a floating-point exception has
occurred and all operations behave as if the IEEE-754 exceptions are always
masked, and deliver the masked response as defined by IEEE-754 if there is an
exceptional event; for the same reason, while SNaN encodings are supported,
they are not signaling and are handled as quiet;


x225089x wrote:
像是
power(sqrt(3.45), 2)←開根號後平方

sqrt(3.45) * sqrt(3.45)←根號後相乘 答案不相同


以下是我用python算出的結果:
>>> math.sqrt(3.45)
1.857417562100671
>>> math.sqrt(3.45)**2
3.45
>>> math.sqrt(3.45)*math.sqrt(3.45)
3.45
不知道你是用什麼軟體去算的。

我沒寫過CUDA的code
所以我是以我寫JAVA的經驗來說明的
不過應該是我自己的code問題啦

那公式是餘弦相似度計算,用於計算兩文章之間的相似性
值會在0~1之間
過程中會有多次的遞迴計算
因此會有多個變數被我存下來
而當兩者在最後要相除的時候 明明該是全等的1 確可能會產生0.99與1.01這種問題
這問題還滿常發生的
不過換個語言就不太有這種問題
像是matlab之類的,或許跟語言對浮點數的處理也有關吧
我所想表達的情況
類似這篇當中的 - 誤差的產生及傳播:截尾及離散化誤差 這部分的情況

https://zh.wikipedia.org/wiki/%E6%95%B0%E5%80%BC%E5%88%86%E6%9E%90

而樓主所需要的計算 或許也會需要多次的數值儲存 在多次遞迴後就有可能產生這種現象

round-off error跟rounding mode不同 我錯看
所以我的跟你看的rounding mode認知真的不一樣

另外就是單精度捨入誤差的值會比起雙精度要多的
這樣計算的結果 肯定會差距更大
而我想表達的校正就是在這幾點上面
請問這東西的有辦法校正嗎?
更深入的東西 請原諒我的一知半解
謝謝各位大大解惑,其實看完文章再看其他留言,整個直冒汗...
好像比我事先想的又複雜太多XDD
還是等有錢的時候直接去敗一塊測看看

vox0097 wrote:
在做物理模擬時使用C...(恕刪)


應該不用TITAN就可以開倍精度浮點運算了(在GTX480時我就看過測試軟體測試這方面的能力)

更前面的GTX200系列就沒支援

你的問題應該是軟體沒啟動或支援這方面的功能

如果可以詢問軟體開發商或是看說明書會比較清楚

x225089x wrote:
像是matlab之類的,或許跟語言對浮點數的處理也有關吧
我所想表達的情況
類似這篇當中的 - 誤差的產生及傳播:截尾及離散化誤差 這部分的情況

我想你想要表達的應該是 Truncation error,這的確是一個值得考慮的問題。


x225089x wrote:
round-off error跟rounding mode不同 我錯看
所以我的跟你看的rounding mode認知真的不一樣

rounding mode 其實就是決定如何處理round-off error的策略。

x225089x wrote:
另外就是單精度捨入誤差的值會比起雙精度要多的
這樣計算的結果 肯定會差距更大
而我想表達的校正就是在這幾點上面
請問這東西的有辦法校正嗎?

現在應該是沒有人用單精度去做科學運算
如果想要改善round-off error,我猜想要避免是不可能的,至少可以藉由設定rounding mode讓不同平台運算的結果能夠接近,CUDA就有提供這個功能,不過目前(至少cuda3.2)應該是沒有提供exception handler讓使用者去處理一些特殊狀況

Truncation error的話我並沒有相關的知識,這點很抱歉。


guardxd wrote:
應該不用TITAN就可以開倍精度浮點運算了(在GTX480時我就看過測試軟體測試這方面的能力)
更前面的GTX200系列就沒支援
你的問題應該是軟體沒啟動或支援這方面的功能
如果可以詢問軟體開發商或是看說明書會比較清楚

N家的產品對於CUDA的功能有一個被稱作computing capability的等級
computing capability 1.3以上都可以使用雙精度運算,不過軟體應該要打開就是了
請樓主在購買前先確認一下吧,不一定是要很貴的卡才會有這功能。
雙精度應該都有,差別在於衰減的程度而已.
記得titan(在驅動中勾選雙精度)/k20等級的卡,雙精度的能力可以達到單精度的1/3
而像780/770/680/670......的卡雙精度能力只有單精度的1/24
另外,只有專業卡如k20之流的才支援ECC
  • 2
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?