這隻程式簡單的講, 就是計算積分圖 (引自 paul voila "Rapid Object Detection using a Boosted Cascade of Simple Features" (CVPR 2001)) 的計算效率, 如下圖的左圖的運作模式.
這個東西要平行化, 最麻煩的一點就是它要參照前一個像素值的累加值, 不像矩陣轉換可以平行進來平行出去這麼簡單. 於是我採用分開每個列 (column) 各別去積(圖A), 寬有多長, 就拆成多少個 thread 下去跑, 算好的結果, 以轉90度的方式擺放在暫存記憶體內的對應行 (row) 內(圖B). 然後這個暫時性記憶體(圖C)一樣做垂直積分, 積好的值一樣以轉 90 度擺放, 但是是擺放到原本的記憶體內. 這樣就可以完成積分的動作.
這樣做最主要的目地是因為要寫在 brook+ 裡, 因為 brook+ 內無法讀取 output array 內的值, 只能寫, 所以要靠兩段記憶體交互的填充運作下才能達成..
如果有人有更高明的手法的話歡迎賜教, 老實講小弟我覺的這方法實在很不理想 ~_~
以下是據發表在 ptt VideoCard 版上的文章修改而來.
這個是小弟我用 brook+ 1.4beta 寫的, 但因為是用 VS2008 編譯的, 所以執行這東西需要一個 VS2008 散佈套件:
http://tinyurl.com/6yv6k2
有一個問題講在前面, 因為這是用 ATi GPU 跑的程式, 所以當執行時間過久, 會造成畫面無法回應, 而 windows 在某一定時間內沒有得到顯示畫面回應的話, 就會 reset GPU. 也就是有人會碰到的 VPU-recovery. (windows XP 是五秒, vista 好像是三秒??)
目前已知如果一邊跑工作管理員的話, 就 100% 會發生 VPU recovery, 下版我會好好修正這問題.
所以建議在跑這隻測試程式時, 將其它使用 CAL 的軟體停止運作, 像 folding@home? (名字忘了..).
第二, 運作途中若遇到畫面停止回應, GPU 被 reset, 程式就可以 ctrl+c 中止掉了, 因為 GPU 內的程式也沒了.
測試內容是計算積分圖, 分別以 x86 float (兩種方法), SSE2, 與 ATi GPU 計算 (兩種方法) 等不同的平臺上比較計算的時間還有結果, 但 16mS 以內算 OS 本身的誤差. 檔案在這:
http://www6.zippyshare.com/v/79337531/file.html
有張廣告圖的右邊, 有個 Download Link 會倒數, 倒數完後才會浮現 "Download" 字樣. (字真的很小..)
sorry 弄半天 SourceFroge 不知道怎麼傳東西上去 T_T
以下說明使用方法 (以下有很多髒話.. 這是小弟我的惡趣味..).
1.檔案解壓縮開來後, 解到一個地方假設叫 d:\temp (要默記)
2.window key + r, 會跳出 "執行", 打 cmd + [enter]
3.d:
4.cd \temp (這就是剛剛默記的目錄名)
5.bitchmark.exe 512 512
內定大小是 4096*4096, 在這裡設 512*512 測小一點, 免的 VPU 又掛點.. 以這個例子在我的機器上執行結果會是這樣:
found num of 1 CAL hardware
build the fuck matrix 513 by 513
Normal Float32 bitch 1 fucking time 0.000000 mS
Normal Float32 bitch 2 fucking time 0.000000 mS
SSE2 Float32 bitch fucking time 16.000000 mS
ATi CAL GPU (float1) bitch fucking time 640.000000 mS
ATi CAL GPU (float4) bitch 1 fucking time 375.000000 mS
ATi CAL GPU (float4) bitch 2 fucking time 250.000000 mS
it's saw fucking good..!
Press key...
GPU 方法三在 1536*1536 以上測試會自動關掉, 後述.
6.PCIeSpeedTest.exe
這是測 PCI-express bus 頻寬的, 但很容易造成顯示卡沒有回應! 這程式也是 ATi 顯示卡限定. 在這隻程式裡, 小弟的 GA-MA770DS3 這片板子 GPU->CPU 的頻寬不到 1Gbyte/s (別人測是 5.3Gbyte/s.. orz).
執行結果:
Devices found: 1
===> Testing device 0 <===
Device type: RV770
Max resource 2D width/height: 8192/8192
Total GPU memory size: 1024 MB
Total CPU cached space size: 64 MB
Total CPU uncached space size: 128 MB
GPU engine clock: 400 MHz
GPU memory clock: 800 MHz
Number of timing loops: 100
.....[後略]
註1. GPU 方法三因為是實驗中 async multi-thread 方法, 但會在更大矩陣運算時出錯.
程式如果有人想看 source code 的, 請留 email 到我信箱裡索取. :P
沒有留言:
張貼留言