Re: CUDA Matlab plug-in: AccelerEyes' Jacket已回收
看板MATLAB作者yeahbo (MSA-0011[Bst]PLAN303E)時間16年前 (2009/05/20 00:15)推噓0(0推 0噓 0→)留言0則, 0人參與討論串4/10 (看更多)
※ 引述《Leon (Achilles)》之銘言:
: ※ 引述《yeahbo (MSA-0011[Bst]PLAN303E)》之銘言:
: : Error 分析:
: : http://photo.xuite.net/yeahbo/420580/70.jpg

: : 相同的 single 運算,分別由 CPU 和 GPU 計算,然後跟 CPU 的 double 運算的結果
: : 相減取絕對值,算出方陣每個 element 的平均誤差
: : + - .* 三種運算的誤差約在 10^-8,而且 CPU 和 GPU 的結果完全相同
: : ./ 運算的誤差較大,因為除法會放大數值誤差,這可以接受...
: 這有意思, 我來問一下:
: 在 matlab 中, 對於浮點的運算實做有誰熟的?
浮點數運算有一套 IEEE 754 的標準來定義
它的運算是實做在 cpu 或 gpu 的電路裡(為了不易混淆,使用小寫)
不管是使用哪種程式語言都是一樣的
: 我知道 matlab 對於大數運算有特別的方式, 所以不容易爆掉.
對於處理超過 IEEE 754 標準所定義的範圍的"大數"
就需要額外的處理,MATLAB 有提供這種大數運算(不過我不熟XD)
在 IEEE 754 標準中
使用 32-bit 所定出的 single 浮點數,在一附近的數的最小單位是 2^-23 = 1.2e-7
使用 64-bit 所定出的 double 浮點數,在一附近的數的最小單位是 2^-52 = 2.2e-16
至於其他細節,可以參考維基百科:
http://en.wikipedia.org/wiki/IEEE_754-1985
: 但是, 你的實驗中, 如我了解沒錯的話,
: 是取在 [0 , 1] 的 random number.
: +, -, *, 這三個 operation 頂多跳到 [-1,1] 之間.
: 但是你要算 / 的話, 這東西就有大問題,
: 因為你的 Variance 是 depends on the random number you choose.
: 統計上而言這東西很難給你看出一個規律來.
: 建議, 你把 data 取在 [1,2] 之間,
: 重作一次, 會比較 meaningful.
其實我的測試裡
是先用 cpu 執行 rand() 函數產生 A 和 B 兩個一樣大小的方陣
而且每個 element 都是 double 浮點數
再拿這兩個方陣丟給 cpu 和 gpu 運算,算式是 C = A + B (同理類推 - .* ./ *)
所以無論是 cpu 還是 gpu,拿來比較的運算結果都是用同一筆數據運算出來的
只是因為在這次的測試裡,gpu 只能計算 single 浮點數
所以在把 A B 方陣傳給 gpu 時,同時也會把數據從 double 轉換成 single
為了驗證 gpu 運算的正確性(因為聽說有可能算錯XD)
也用 cpu 算同一筆數據轉換成 single 後的運算結果來比較
而這張 Error 圖中
實線是 sum[ abs( C_gpu_single - C_cpu_double )] / 方陣element數
圓點是 sum[ abs( C_cpu_single - C_cpu_double )] / 方陣element數
也就是用來分析 single 運算跟 double 運算相比會增加多少誤差
在 + - ./ 運算中,約 10^-8 的誤差跟 IEEE 754 標準的定義差不多
而且實線跟圓點完全重合在一起,表示 gpu 沒有算錯(假設 cpu 是對的)
./ 運算的誤差會較大,是因為除法會放大數值誤差,這可以接受
但是,實線跟圓點"沒有"完全重合在一起,表示 gpu 出事了啊~~ <囧>
"同一筆數據" 由 cpu 和 gpu 算出不同的結果,這是不可接受的啊...
: : 但是 CPU 和 GPU 的結果有差異(完了!<囧>)
: : 雖然最大可加速 1500 倍,但是算不準就沒用了啊... Orz
從 Speed Up 結果顯示,2048 x 2048 方陣的 ./ 運算加速了 1500 倍
但是相同大小的方陣,+ - .* 運算只加速了約 800 倍... = =+
"據說" 在遊戲繪圖應用方面,廠商為了盡可能提高運算速度,有時候會犧牲 "準確性"
正式提出 GPGPU 並實作後,已經是第三個世代了... nVidia 難道還沒有改掉壞習慣嗎?
(因為還沒有確定,這裡我只是提出質疑,並不是否定 gpu 的準確性)
: : 最後,矩陣乘法部分因為運算量多很多,而且越大的矩陣每個 element 的運算量越大
: : 所以越大的矩陣誤差越大是可預期的
: : 但是 CPU 和 GPU 的結果比 ./ 差更多(大爆炸!<囧>)
: : nVidia 你到底做了什麼? <囧>
: : ---
: : 這篇好像不太適合放這裡? XD
: 抱歉, 這段敘述我看不懂.
在矩陣乘法 C = A * B 裡
因為 C 的每個 element 是 A 的某個 raw 跟 B 的某個 column
相對應的 element 相乘,在全部相加起來
如果是 2048 x 2048 的方陣,C 的每個 element 需要 2048 次乘法和 2047 次加法
前述的浮點數的數值誤差,是有累加性的
所以越大的方陣進行矩陣乘法,結果的每個 element 需要越多"次"運算
所以會有越大的數值誤差,這跟結果相符合
(所以科學運算還是需要 double)
不過矩陣乘法的 Error 圖中,實線跟圓點差異非常大... Orz
推
05/18 00:12,
05/18 00:12
→
05/18 00:12,
05/18 00:12
→
05/18 00:14,
05/18 00:14
→
05/18 00:15,
05/18 00:15
根據這位版友的推文,或許可以解釋這個差異的來源
畢竟,在 + 和 .* 運算中,並沒有看到任何問題
: 另外問個問題:
: 我的 matlab 7.6 似乎會自動想辦法去把工作丟到 每個 core 上面去,
: 那, 現在 Cuda 和 matlab 的結合到什麼程度了?
: 有辦法讓 matlab 自己決定要怎麼放 process 到每個 gpu core 嘛?
在這個 AccelerEyes' Jacket 的 Matlab plug-in 中
只要執行 gsingle() 這個函數就可以把資料丟進 gpu 中
而且之後的任何運算都是用 gpu 執行的
非常方便 XD
PS. 其實不是"任何"運算,在 AccelerEyes' Jacket 的 User Guide 裡
有詳細列出目前各種運算的支援情形
至少簡單的 + - * / 和三角函數、exp() 都已有支援,但是 eig() 還沒有
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.167.168.58
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 4 之 10 篇):
MATLAB 近期熱門文章
PTT數位生活區 即時熱門文章