Re: CUDA Matlab plug-in: AccelerEyes' Jacket已回收

看板MATLAB作者 (MSA-0011[Bst]PLAN303E)時間16年前 (2009/05/20 00:15), 編輯推噓0(000)
留言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,
印象中, CPU運算時的浮點暫存器是用到80bits的, 如果連
05/18 00:12

05/18 00:12,
續運算都在cpu浮點暫存器到最後才寫入mem, CPU的確可能
05/18 00:12

05/18 00:14,
會有過高(指高於float精度)的準確度; 這點可能是這個世
05/18 00:14

05/18 00:15,
代的GPU沒辦法相比的; 只是這要看對精確度的要求就是:)
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
文章代碼(AID): #1A4ji4R9 (MATLAB)
討論串 (同標題文章)
文章代碼(AID): #1A4ji4R9 (MATLAB)