Abstract: 本文介紹CUDA執行模型,只比硬體高一層的抽象

Keywords: CUDA SM,SIMT,SIMD,Fermi,Kepler

開篇廢話

今天晚上本來都該睡覺了,但是還是決定把這篇文章寫出來,畢竟昨天就沒寫。

這一篇開始我們開始接近CUDA最核心的部分,就是有關硬體,和程序的執行模型,用CUDA的目的其實說白了就是為計算速度快,所以壓榨性能,提高效率其實就是CUDA學習的最終目的,沒人學CUDA為了去顯示Hello world。前面幾篇我們學了編寫,啟動核函數,計時,統計時間,然後學習了線程,內存模型,線程內存部分我們會在後面用幾章的篇幅進行大書特書,而本章,我們介紹最底層最優理論指導意義的知識。什麼時候我們沿著硬體設計的思路設計程序,我們就會得到百戰百勝;什麼時候我們背離了硬體設計的思路去設計程序,我們就會得不到好結果。

概述

CUDA執行模型揭示了GPU並行架構的抽象視圖,再設計硬體的時候,其功能和特性都已經被設計好了,然後去開發硬體,如果這個過程模型特性或功能與硬體設計有衝突,雙方就會進行商討妥協,知道最後產品定型量產,功能和特性算是全部定型,而這些功能和特性就是變成模型的設計基礎,而編程模型又直接反應了硬體設計,從而反映了設備的硬體特性。

比如最直觀的一個就是內存,線程的層次結構幫助我們控制大規模並行,這個特性就是硬體設計最初設計好,然後集成電路工程師拿去設計,定型後程序員開發驅動,然後在上層可以直接使用這種執行模型來控制硬體。所以了解CUDA的執行模型,可以幫助我們優化指令吞吐量,和內存使用來獲得極限速度。

GPU架構概述

GPU架構是圍繞一個流式多處理器(SM)的擴展陣列搭建的。通過複製這種結構來實現GPU的硬體並行。

上圖包括關鍵組件:

- CUDA核心- 共享內存/一級緩存- 寄存器文件- 載入/存儲單元

- 特殊功能單元

- 線程束調度器

SM

GPU中每個SM都能支持數百個線程並發執行,每個GPU通常有多個SM,當一個核函數的網格被啟動的時候,多個block會被同時分配給可用的SM上執行。

注意: 當一個blcok被分配給一個SM後,他就只能在這個SM上執行了,不可能重新分配到其他SM上了,多個線程塊可以被分配到同一個SM上。

在SM上同一個塊內的多個線程進行線程級別並行,而同一線程內,指令利用指令級並行將單個線程處理成流水線。

線程束

CUDA 採用單指令多線程SIMT架構管理執行線程,不同設備有不同的線程束大小,但是到目前為止基本所有設備都是維持在32,也就是說每個SM上有多個block,一個block有多個線程(可以是幾百個,但不會超過某個最大值),但是從機器的角度,在某時刻T,SM上只執行一個線程束,也就是32個線程在同時同步執行,線程束中的每個線程執行同一條指令,包括有分支的部分,這個我們後面會講到,

SIMD vs SIMT

單指令多數據的執行屬於向量機,比如我們有四個數字要加上四個數字,那麼我們可以用這種單指令多數據的指令來一次完成本來要做四次的運算。這種機制的問題就是過於死板,不允許每個分支有不同的操作,所有分支必須同時執行相同的指令,必須執行沒有例外。

相比之下單指令多線程SIMT就更加靈活了,雖然兩者都是將相同指令廣播給多個執行單元,但是SIMT的某些線程可以選擇不執行,也就是說同一時刻所有線程被分配給相同的指令,SIMD規定所有人必須執行,而SIMT則規定有些人可以根據需要不執行,這樣SIMT就保證了線程級別的並行,而SIMD更像是指令級別的並行。SIMT包括以下SIMD不具有的關鍵特性:1. 每個線程都有自己的指令地址計數器2. 每個縣城都有自己的寄存器狀態3. 每個線程可以有一個獨立的執行路徑

而上面這三個特性在編程模型可用的方式就是給每個線程一個唯一的標號(blckIdx,threadIdx),並且這三個特性保證了各線程之間的獨立

32

32是個神奇數字,他的產生是硬體系統設計的結果,也就是集成電路工程師搞出來的,所以軟體工程師只能接受。

從概念上講,32是SM以SIMD方式同時處理的工作粒度,這句話這麼理解,可能學過後面的會更深刻的明白,一個SM上在某一個時刻,有32個線程在執行同一條指令,這32個線程可以選擇性執行,雖然有些可以不執行,但是他也不能執行別的指令,需要另外需要執行這條指令的線程執行完,然後再繼續下一條,就像老師給小朋友們分水果:第一次分蘋果,分給所有32個人,你可以不吃,但是不吃也沒別的,你就只能在那看別人吃,等別人吃完了,老師會把沒吃的蘋果回收,防止浪費。第二次分橘子,你很愛吃,可是有別的小朋友不愛吃,當然這時候他也不能幹別的,只能看你吃完。吃完後老師繼續回收剛才沒吃的橘子。第三次分桃子,你們都很愛吃,大家一起吃,吃完了老師發現沒有剩下的,繼續發別的水果,一直發到所有種類的水果都發完了。今天就可以放學了。

簡單的類比,但過程就是這樣。

CUDA編程的組件與邏輯

完整內容參考https://face2ai.com/CUDA-F-3-1-CUDA執行模型概述/


推薦閱讀:
相关文章