Pages

2009年8月25日 星期二

CUDA 簡介

  最近受命去弄個 GPGPU(General-purpose computing on graphics processing units) 的 demo,對象就是 Nvidia 的 CUDA,這裡我找到一個還不錯的簡介,以 VS2005 來說明如何設定,雖然僅有兩個範例,但作者循序漸進,一步步地說明如何加快平行運算的速度。我只有看完第一個範例,另一個矩陣乘法有空再看:P。針對第一個範例「平方相加」,作者說明的流程依序如下:(GeForce 8800GT 1.5GHz)
  1. 一個區塊與一個執行緒 -- 640M clock cycles (約0.43秒)
  2. 一個區塊與 256 個執行緒 -- 8.3M clock cycles (約 0.0055 秒)
  3. 同上,但改變執行緒讀取資料的方式 -- 2.6M clock cycles (約 0.0017 秒)
  4. 32 個區塊與 256 個執行緒 -- 150K clock cycles (約 0.0001 秒)
  5. 同上,但個別區塊先利用 shared memory 做加總 -- 164K clock cycles (約 0.00011 秒)
  6. 同上,但改變在 shared memory 的加總方式 -- 136K~140K clock cycles (約 0.00009 秒)
  這個網頁後面還有介紹支援 CUDA 的 GPU 架構,包含 global memory、shared memory、multi-processor 和一些 cache。像要給 GPU 處理的資料就會先複製到 global memory,而執行緒在存取這個記憶體時會有 latency,所以需要建立多一點執行緒來隱藏延遲;shared memory 相當於 cache,比起前者,延遲可以忽略,但是,當多個執行緒存取同一個 bank(4 bytes) 就會發生衝突,所以就要重新考慮資料的擺放方式;還有,精確度、運算單元、和其它 cache 的介紹、總之,這個網頁值得看看。

  我手邊拿到的筆電,顯示卡為「GeForce 9700M GTS」,搭配的驅動程式版本是 177.19,但是,官網針對 Windows Vista 32 bits 提供的 CUDA 版本至少是 2.0(驅動程式版本為 178.08),幸好可以安裝,不過安裝 CUDA 2.3 失敗啦!而顯示卡資訊如下圖:(雖然安裝 2.0 版,不過顯示結果只支援到 1.1 版)


矩陣乘法之時間比較:(單位:秒)
               CPU            GPU
500x500 0.188 0.109
1000x1000 6.131 0.202
3000x3000 200.819 5.241
5000x5000 1222.182 12.480
  如果你的筆記型電腦或者桌機的顯示卡不支援CUDA,那麼,cudaGetDeviceProperties 只能抓到一個虛擬裝置「device 0」,而該裝置內容如下:


  做平行計算所探討的議題、思考的方向和做法,是我以前沒有接觸,或者甚少接觸的部分,即使看得懂,也需要許多的時間去消化吸收,爾後才能靈活運用(高微看得懂和寫得出來是兩回事)。而且,最好要能掌握顯示卡提供的硬體資訊,例如:最多可以產生幾個區塊、幾個執行緒、shared memory 有多大、有幾個暫存器,因為這些資訊都會影響資料的切割、存取,及演算法的修改,可以說是針對板子去寫平行的程式,所以像是 cublas、cufft 這些函式庫,我猜硬體資訊都已參數化。最後,開越多的執行緒或許越能隱藏 latency,但相對地,每個執行緒能分配到的資源就會越少,這是需要衡量的地方。

參考資料:
 
Blogger Templates