顯示具有 CUDA 標籤的文章。 顯示所有文章
顯示具有 CUDA 標籤的文章。 顯示所有文章

2012年4月27日 星期五

Building the GPU Cluster


我們有幾台 GPU Server,老師有想要將他建立成一個 GPU Cluster 的 prototype, 在Infrastructure,我們有了機器,那問題就是要如何管理這些資源(CPU, Mem, Network, GPU ...)。

我的想法是,有三個部份要做,分別為基礎建設的管理、程式介面(Platform)、用戶介面。


1. 基礎建設的管理

用以往實驗室常用的方式,就是將程式寫成 components 然後再不同台機器上運作, 接著建個 data flow 交換資料。以我的經驗,這樣的方式在多個使用者時不免會有一人當機,整車人都不能用機器。虛擬化既然這麼紅,那我們是不是用虛擬化的管理方式呢? 現有的 Hypervisor 有 VMWare, xen, kvm 等。將每個 component 放在一個虛擬機器裡頭,接著也一樣用 data flow 做溝通,萬一某台虛擬機器死翹翹,那也不會影響機器內的其他用戶,是一個可行的方法。再者跨多台機器的 Management Tool 也是很多,像是 Nimbus, OpenNebula, Eucalyptus,他們可以用來管理這些 Hypervior。如此一來,我們有了一個中控中心,可以發佈虛擬機器和關閉虛擬機器,有人要執行他的 component 們,我們就給他幾台虛擬機吧。


2. 程式介面

既然 DataFlow 是這樣一個好的傳統,那我們也許可以繼續沿用,每個用戶將他的程式寫成一個 component,然後我們將他放在虛擬機裡。他要 CPU/Mem/Network 我們就給他,他要 GPU,我們也給他。這裡比較難的地方就是要怎麼將 GPU 給虛擬化,有人有辦法請給我一點方向。好加在的是,CUDA 4.0 允許多工,多個人再一台機器上享用 GPU 也不會有太大的問題,剩下的就是 GPU 虛擬化的問題。


3. 用戶介面

前端的用戶介面,負責與使用者溝通,讓他們上傳程式,觀看結果。以往的方法都是寫個 Shell,像是小大象 Hadoop 的 Shell,但我想是不是有其他方法呢?這裡頭還需要 Build System,讓上傳的 Component 可以順利編譯。所以用戶介面要有幾個功能,包括上傳資料程式、建置系統、瀏覽結果的介面。




特別打出來,希望各位看倌、高人能給一些建議。

以後這裡就變一個討論串了,歡迎不吝嗇提出意見。

2009年10月12日 星期一

Special Topic on ESL and Multi-core Tool Design

Syllabus

1. SystemC Simulation Kernel
2. Advanced OpenESL tool development
3. TLM2.X
4. ARM Processor ESL Model
5. Multi-core Virtual Model
6. Multi-core Programming on Virtual Model
7. Multi-core application programming using CUDA
8. Debugging tool for microprocessors

09/23 - 10/07

大鈞陳大鈞_投影片.rar
阿凡EM_for_GMM_on_CUDA.ppt
宗胤8051 SystemC Model.pptx
8051 ISS Implement in SystemC.pptx
品皓gdb_for_8051_品皓.ppt
塞公Memory Locality Exploitation Strategies for FFT on the CUDA Architecture.pptx
rurusystemC kernel.pptx
小聽Course_進度_090923.pptx
Course_進度_090930.pptx
Course_進度_091007.pptx
龍哥Arm9 Cpu.pptx

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結果是正確的。

 
 

2009年3月18日 星期三

OpenCL

看來nVidia有意要開放OpenCL變成Open Standard
不過當然是為了賺錢.... Maket Builder 這個字還真有意思

http://www.channelregister.co.uk/2009/03/17/opencl_demo/

2009年3月14日 星期六

CUDA - Vivian

[090314]

架構介紹

‧ CUDA中,分為host和device兩部分。Host通常是指CPU。而 Device是host的coprocessor,它有自己的memory,可以跑平行的threads,在這裡我們指GPU,然而它也可以是其他的parallel processing device。在Device上跑的程式區段,我們稱為kernel。

‧ In CUDA program, serial 程序交給host (CPU)來做,而其中可以highly parallel的部分,我們寫成kernel function,放到device (GPU)上執行。

流程簡單敘述如下,host端將資料和kernel給GPU,GPU執行kernel,CPU在這同時可以做其他的事情或是等待GPU的資料return。

Serial code executes on the host while parallel code executes on the device.

Thread Hierarchy

1. Thread : 執行的最小單位,每個thread都有一個獨特的threadIdx , a 3-component vector,so threadIdx can be 1D , 2D, or 3D, 方便我們去 domain 程式使用的vector 或 matrix的元素。

數個Threads組成一個block。

Note : GPU上的thread 較 CPU上的light weight,因為是用硬體去做,耗費的cycle較少。但是CPU到GPU之間存取等會耗掉不少時間,因此只有當程式能"highly" parallel,整體的效率才會有顯著的增進。

2. Block : 同一個block的threads可以使用共用的share memory來合作或同步,此外,__syncthreads()函數也可以使block中所有的threads都同步到了這個點時,才讓所有的threads繼續執行下去。目前的GPU一個block可以包含512 個threads。

數個Blocks再組成grid,同樣地,一個block 有獨一的blockIdx, which can be 1D or 2D.

Memory Hierarchy

1. register & local memory : 每個thread有自己可以存取的 registers,在 kernel function 裡宣告的 automatic variable 會存在 register,但是當 automatic variable 數量多於一個thread可使用的register數量,或是 array型態的變數,以上這些會存在local memory。local memory 實際上是在 DRAM,速度較register慢許多,使用上要謹慎考慮效率問題。

2. Shared memory: 同一個block的threads可以存取的共同memory,效率快,它的Lifetime 與此所屬的block一樣長。

3. Global memory: 相當於GPU的DRAM,可以被host和device的每個thread存取,可以用於host和device交換資料使用,但是data access latency很長。

4. Constant and texture memory spaces : two additional read-only memory spaces accessible by all threads. The global, constant, and texture memory spaces are persistent across kernel launches by the same application.

*All above figure from Nvidia Programming Guide.

*參考資源
Nvidia CUDA document
國網中心CUD教學課程
Hotball's Hive

-------------------------------------------------------------------------------

大家好,我是碩零的新生Vivian,也可以叫我小聽~

下次會介紹關於programming的部分。


2009年2月3日 星期二

安裝CUDA --- VC8

首先要到CUDA官網抓一下東西

選擇 Windows XP


將下面三個都抓下來, 抓2.0就好可以了
1. CUDA 驅動程式:
2. CUDA 工具套件:
3. CUDA 軟體開發套件(SDK):

放Tool Chain:
C:\CUDA\

範例放在這邊
C:\Program Files\NVIDIA Corporation\NVIDIA CUDA SDK\Projects
進到 Project 之後點VC的Project檔就可以開了

一些小問題:
Q1: 有多張顯卡時, 要選另一張顯卡, 可以傳參數 "-device=1"
Q2: VC Syntax Highlight可以看 ~SDK\doc\syntax_highlighting裡面的文件

Have Fun~