2009年8月25日 星期二

cuda for slim - 塞公


--------------- 2009/08/25 ---------------


這次是主要要改寫slim 能讓cuda 在slim以multiprocess方式呈現並測試cuda在multiprocess的支援能力與正確性。可是上次是利用fork搭配system()函式(類似shell呼叫執行檔執行的方式) 來達成multiprocess的效果,是覺得有點不太恰當。所以又改回用fork的方式搭配execve()的方式把外部程式呼叫起來。不過所遇到的問題是cuda process有成功叫起來,不過執行到cudamalloc時,程式似乎異常終止,今天請DNA幫我看一下,發現是segfault問題,現在是繼續嘗試去解決。

另外,在未來要繼續實做上學期難產的waveguide model。計畫是先從介面下手,讓CAD製圖工具所畫出來的3D moudel可以讓我載入到opengl中使用。目前是先決定要以哪一種CAD輸出的檔案格式來當作我input的資料,較廣泛被使用的格式有DXF, DWG, IGES, STEP,不過前兩個檔案格式都是屬於AutoCAD公司所擁有,目前到底有沒有版權問題我看不太懂,不過wiki上面講好像有打過官司的樣子。不過現在好像很多公司都用逆向工程試著去讀寫.dwg格式,另外有一個是叫Open Design Alliance的團體自己出了一套軟體叫做
DWGdirect試著去讀寫dwg檔案http://www.opendwg.org/,因為目前我有需要的是類似parser部分,所以可能會去參考一些opensource的東西。另外還有一個網頁是有自己寫了簡單的parser部分http://www.bearcave.com/dxf/ 如果要拿DWGdirect的lib或者source似乎有一點麻煩。都不太open的樣子。http://www.opendwg.org/education

因為這幾天也只是稍微涉略一下,另外還有IGES和STEP格式有在這個網站找到http://www.gcad3d.org/看起來好像很open的樣子而且像是用openGL寫的(沒仔細看),不過對於我...只要挖出parser部分,code部分可能需要下一點功夫...找這麼多,最主要目的是可以找一個現成的parser可以讓我讀進CAD檔案格式的內容就好。希望是能讓我不要對於讀檔部分花太多時間。


--------------- 2009/08/17 ---------------


上禮拜提到:
1.在執行cuda程式時候,像是其他cpu工作是否真的會被block住?可以利用播放影片或者聲音檔來測試看看
  實驗後的結果,發現在播放聲音mp3之類的,並不會因為執行cuda運算程式後被block住。而畫面依然是block的狀態。另外撥放影片時,只有影像部分會被block住,而當cuda程式結束後,影像就直接跳過cuda執行期間應該撥放的影像部分。

2.利用thread priority設定方式來調整各thread在cpu執行所占的比例。
  實際測試,將執行cuda的cpu thread priority設低一點後,沒有改善畫面停滯的情形。

3.重新改寫multi-processes 程式。利用類似一支shell同時呼叫多個已經編譯好的cuda運算程式。目前還沒測試到錯誤的值出現。

4.之後想繼續研究人家是如何去寫cuda程式,使計算與顯示方面能無法察覺停頓的方式。

--------------- 2009/08/06 ---------------

問題應該只是顯示卡在處理資料運算時造成cpu一直等待資料回應使電腦暫時沒有回應。因為試過開兩個cpu thread跟一個cuda thread,在cpu thread 中每一秒就印一次計算的秒數,而cuda thread中就讓gpu thread做大量迴圈運算。單獨執行cuda thread約5.6秒。而三個thread同時運行時。雖然一開始畫面都沒有顯示,可是約五秒後,所印出的資料如圖:

也就是說,其實CPU thread也有在進行print out的動作,並沒有被等待回傳cuda結果的thread所卡住,只是可能有影響到I/O的動作,使得在kernel function結束之前output被卡住了。另外,利用multiprocess,實作相同程式方式也有類似的情況。

--------------- 2009/08/04 ---------------


利用mutex方式控制 gpu resource的分配,可是在故意將cuda運算量稱大一點後,讓他做一次kernel function需要花約3秒時間,可是在這3秒內。電腦幾乎不太能做其他事情,觀察cpu loading 都跑到100% 。所以猜想是這個kernel function thread 沒有被OS切換出去讓其他thread進來工作的關係還是有其他原因。之後確定之後,在想看怎麼解決。

--------------- 2009/07/29 ---------------

在meeting後對於怎麼把cuda放進去slim當中,有幾個重點或方向可以去做。

1. 利用對於cpu multithread的呼叫cuda kernel function 就多一個 cpu thread透過它來呼叫kernel function。也就是放到slim kernel中讓kernel來做呼叫的工作。
2. 利用semaphore的機制。控制每個component的kernel function呼叫。
3. 創一個child process讓他專門來做呼叫kernel function的工作,而scheduler部分就是交給device driver。

--------------- 2009/07/28 ---------------

這篇主要是維護 如何使slim能有效利用cuda的運算能力,目前研究的是如何在multithread架構上利用 cuda的運算。之前學妹有測試過一個 process只能一次跑在GPU device上,也就是一次只能執行一個 kernel function。如果是在 multithread 上執行會發生錯誤。

而接下來老師希望測試的是利用動態連結的方式做測試,也就是先將要放進cuda運算的function(也就是kernel function)先製作成動態連結資料庫(ex: .dll or .so),然後在runtime時,再將kernel function動態載入到記憶體中。看看是否能達到multithread的效果。

我基本上大概測試是kernel function 是用來做矩陣的乘法。測的結果是透過每個thread都執行一次kernel function所算出來的結果是錯的。結果都是零(這部分我還要看一下)。而循序執行kernel function結果是正確的。

 
 

7 則留言:

SCREAMLab 提到...

1. 請問讓CPU做的工做假如增加會如何?
2. 可以知道CPU再處理GPU的waiting佔了多少時間或CPU power的比例呢?
3. 可以利用優先順序的方式讓CPU threads先被執行而wait for GPU的threads慢被執行嗎?

Buffett 提到...

塞公你有看討論區嗎?
有人有問跟你相同問題,不過還沒有答覆
http://forums.nvidia.com/index.php?s=492831b7b7ed4dcf02272934c789c839&showforum=93

這篇也可參考
http://heresy.spaces.live.com/blog/cns!E0070FB8ECF9015F!7726.entry

裡面有段"GPU 為了負載平衡,會把來自不同應用程式送來 kernels 的 block 拆開,然後把這些 blocks 看成同樣優先權去排程執行。我們可透過送出空的小 block(空包彈)混入排程器中,監測單位時間內成功處理掉的空包彈數量,以決定當時 GPU 的負載,再由執行輕量的應用軟體來做定位。"

所以意思是說 可以multi-processes ?!

加油 :)

Buffett 提到...

Multi-GPU computing
http://forums.nvidia.com/index.php?showtopic=103755

GPUWorker, master/slave multi-gpu approach
http://forums.nvidia.com/index.php?showtopic=66598

Buffett 提到...

Multi-GPU computing
http://forums.nvidia.com/index.php?showtopic=103755

GPUWorker, master/slave multi-gpu approach
http://forums.nvidia.com/index.php?showtopic=66598

SCREAMLab 提到...

喔! 這有意思! 難道我們試錯方向了?

或者說我們對GPU真正能運作的各種方式還不夠了解吧!

匿名 提到...

http://forums.nvidia.com/index.php?showtopic=97878&pid=545392&mode=threaded&start=#entry545392

這篇討論串應該比較貼切目前的問題

另外學長說是否支援multi-processes我改寫程式寫法再來研究,也有可能我程式邏輯上寫錯.

SCREAMLab 提到...

We did discuss two possible ways of using cuda in SLIM. I wonder if you can give two typical programming examples for the two cases.

Well document including a tutorial, please.