淺談 CUDA
淺談 CUDA
標簽: CUDASPSMnvidiathread 2013-11-15 00:08 1833人閱讀 評論(0) 收藏 舉報 分類: CUDA技術談版權聲明:本文為博主原創文章,未經博主允許不得轉載。
目錄(?)[-]
看懂 CUDA Device Query 參數的意義
當你安裝了CUDA SDK後,並且運行了deviceQuery後,應該能看到你的CUDA的計算性能清單,尤其需要注意以下性能指標(以GT220為例)
CUDA Capability Major/Minor version number: 1.2
CUDA Capability version number 所表示的是你的 CUDA 設備所能支持的計算架構,不同的計算架構能支持的特性是不一樣的,你若想用上最新的特性,那麼 version number 也應該越高才行,譬如最新的 CUDA 設備卡可以支持3-D網格。而過於老舊的 NVIDIA 設備卡甚至連 CUDA 都不支持。所以如果預算充足,你應該購買最新或者最有性價比的 CUDA 設備卡。
Total amount of global memory: 512 MBytes (536870912 bytes)
其次是 Global Memory 的大小,使用 CUDA RUNTIME API 並調用函數 cudaMalloc 後,便會消耗 GPU 設備上的存儲空間,合理設置程序,適當釋放和分配空間將避免程序出現Crash。
( 6) Multiprocessors, ( 8) CUDA Cores/MP: 48 CUDA Cores
第三個性能指標是 Multiprocessor 也就是 (SM),而 CUDA Cores 也就是 (SP),對於GT220來說,該計算卡中含有6個多核流處理器(Streaming Multiprocessor),而每個流處理器又包含8個流處理管線器(Streaming Processor),因此對於 GT220 來說,該設備卡一共擁有48個流處理器,也就是48個 CUDA Cores。
CUDA 設備的實際運行,是以 Wrap (32 threads) / Streaming Multiprocessor 為結構進行計算的,而在你編寫的代碼中,則是完全不同的, Thread / Block / Grid 的計算結構。
這裡,需要一些說明,讓你弄明白二者的關係。例如,GT220一共有6個SM,每個SM中又有8個SP,這意味著一個SM可以駐留8個線程塊,理論上設備能同時處理的線程塊為 6 x 8 = 48 Blocks。
Warp size: 32
另外一個需要注意的性能指標就是 Warp size。Warp(線程束),是SM運行的最基本單位,也就是調用一次SM,最少啟用一次warp(32個線程打包運行)。需要注意的是,Block並不是SM運行的最基本單位,它會被分解為多個Warp,由設備根據實際情況進行調用(Block -> SM -> Wraps)。一個SM能最多駐留的Warp是由 SM 包含的線程數 / warp size決定的。
Maximum number of threads per multiprocessor: 1024
該參數表示一個SM中有最多1024個線程,也就意味著說該設備的SM可以同時駐留 1024 / 32 = 32個線程束。
Maximum number of threads per block: 512
該參數表明創建一個Block最多能使用的線程數量。
Max dimension size of a thread block (x,y,z): (512, 512, 64)
看到這個參數後不要錯誤的認為創建的Block可以使用 512 x 512 x 64個線程。實際上你能創建的線程數量最多由 maximum number of threads per block決定, 也就是首先 ThreadIdx.xThreadIdx.yThreadIdx.z <= maximum number。其次 ThreadIdx.x <= Idx, ThreadIdx.y <= Idy, ThreadIdx.z <= Idz。
Max dimension size of a grid size (x,y,z): (65535, 65535, 1)
線程塊在計算網格中是以一維或者二維的形式組成的,最新的設備可以支持到三維。這裡的 Max dimension 就意味著你可以創建 xyz 的進程塊。
淺談 CUDA 計算設備優化
在這裡,我們還是以GT220作為例子進行說明。
開發CUDA程序主要看中的性能參數有SM、SP、Wrap Size、Maximum number of threads per SM、Maximum number of threads per block、Max dim of a thread block以及Max dim of a grid size。
問題:對於8x8、16x16、32x32這三種計算塊來說,我們該採用怎樣的網格大小對設備利用最佳?
讓我們來計算一下:
| ? | Threads | Blocks Needed for Max Utilization |
| 8x8 | 64 | 1024 / 64 = 12 |
| 16x16 | 256 | 1024 / 256 = 4 |
| 32x32 | 1024(512) | 1024 / 1024 = 1 |
從上表可以看出,第一種方案想要將SM中1024個Threads全部使用完需要12個計算塊,第二種方案則需要4個,第三種方案只要1個,然而卻超過512個線程的限制。然而SP的限制,只允許在一個SM中創建8個計算格點,因此我們來計算一下實際利用率是多少?
| ? | Threads | Utilization |
| 8x8 | 64 x 12(8) = 512 | 50% |
| 16x16 | 256 x 4 = 1024 | 100% |
| 32x32 | NULL | NULL |
由於第一種方案由於SP數量的限制,使得12個計算塊不能同時駐留在SM中,因此實際上只有8個塊可以運行,而第三種方案由於線程數已經超出限制,所以理所當然的,第二種方案顯然是最好的。
總結
- 上一篇: C++中拷贝构造函数
- 下一篇: 机器学习笔记十一之降维