GPU以及CUDA的幾個基本概念理解

參考:blog.sina.com.cn/s/blog_80ce3a550101lntp.html

GPU的硬件結構中與CUDA相關的幾個概念:thread block grid warp sp sm
streaming processor(sp): 最基本的處理單元,streaming processor 最後具體的指令和任務都是在sp上處理的。GPU進行並行計算,也就是很多個sp同時做處理。現在SP的術語已經有點弱化了,而是直接使用thread來代替。一個SP對應一個thread。
Warp:warp是SM調度和執行的基礎概念,同時也是一個硬件概念,注意到Warp實際上是一個和硬件相關的概念,通常一個SM中的SP(thread)會分成幾個warp(也就是SP在SM中是進行分組的,物理上進行的分組),每一個WARP中在Tegra中是32個thread.這個WARP中的32個thread(sp)是一起工作的,執行相同的指令,如果沒有這麼多thread需要工作,那麼這個WARP中的一些thread(sp)是不工作的。
每一個線程都有自己的寄存器內存和local memory,一個warp中的線程是同時執行的,也就是當進行並行計算時,線程數儘量爲32的倍數,如果線程數不上32的倍數的話;假如是1,則warp會生成一個掩碼,當一個指令控制器對一個warp單位的線程發送指令時,32個線程中只有一個線程在真正執行,其他31個 進程會進入靜默狀態。

streaming multiprocessor(sm):多個sp加上其他的一些資源組成一個sm, streaming multiprocessor. 其他資源也就是存儲資源,共享內存,寄儲器等。可見,一個SM中的所有SP是先分成warp的,是共享同一個memory和instruction unit。
每個SM通過使用兩個特殊函數(Special Function Unit,SFU)單元進行超越函數和屬性插值函數(根據頂點屬性來對像素進行插值)計算。SFU用來執行超越函數、插值以及其他特殊運算
在 G80/G92 的架構下,總共會有 128 個 SP,以 8 個 SP 爲一組,組成 16 個 SM,再以兩個 SM 爲一個 TPC,共分成 8 個 TPC 來運作。而在新一代的 GT200 裏,SP 則是增加到 240 個,還是以 8 個 SP 組成一個 SM,但是改成以 3 個 SM 組成一個 TPC,共 10 組 TPC。
在Tegra系列中,一個GPU中通常只有2個SM,每一個SM中包含4個WARP,每一個warp中有32個thread(SP),因此,一個SM中有128個SP。
Stream:流(Stream)是一系列順序執行的命令,流之間相對無序或併發的執行他們的命令。

軟件概念:
thread–>block–>grid:在利用cuda進行編程時,一個grid分爲多個block,而一個block分爲多個thread。其中任務劃分到是否影響最後的執行效果。劃分的依據是任務特性和GPU本身的硬件特性。GRID,BLOCK,THREAD是軟件概念,而非硬件的概念。

從硬件角度講,一個GPU由多個SM組成(當然還有其他部分),一個SM包含有多個SP(以及還有寄存器資源,shared memory資源,L1cache,scheduler,SPU,LD/ST單元等等),1.x硬件,一個SM包含8個SP,2.0是32個,2.1是48個,3.0和3.5是192個。以及SP目前也稱爲CUDA CORE,而SM目前也稱爲MP,在KEPLER架構(SM3.0和3.5)下也稱爲SMX。

從軟件角度講,CUDA因爲是SIMT的形式,GRID,block,thread是thread的組織形式。最小的邏輯單位是一個thread,最小的硬件執行單位是thread warp(簡稱warp),若干個thread(典型值是128~512個)組成一個block,block被加載到SM上運行,多個block組成整體的GRID。

這裏爲什麼要有一箇中間的層次block呢?這是因爲CUDA通過這個概念,提供了細粒度的通信手段,因爲block是加載在SM上運行的,所以可以利用SM提供的shared memory和__syncthreads()功能實現線程同步和通信,這帶來了很多好處。而block之間,除了結束kernel之外是無法同步的,一般也不保證運行先後順序,這是因爲CUDA程序要保證在不同規模(不同SM數量)的GPU上都可以運行,必須具備規模的可擴展性,因此block之間不能有依賴。

從上面的表述中可以總結:
在GPU中最小的硬件單元是SP(這個術語通常使用thread來代替),而硬件上一個SM中的所有SP在物理上是分成了幾個WARP(每一個warp包含一些thread),warp中的SP是可以同時工作的,但是執行相同的指令,也就是說取指令單元取一條指令同時發射給WARP中的所有的SP(假設SP都需要工作,否則有些是idle的).可見,在硬件上一個SM->WARPS->threads(sp).
對於軟件thread組織來看,因爲一個SM中是分WARP的,而一個WARP包含一定數目(比如Tegra 32個)的sp(thread),因此最好按照這個數目來組織thread,否則硬件該warp上有些SP是不工作的。

這就是CUDA的兩級並行結構。

總而言之,一個kernel對應一個GRID,該GRID又包含若干個block,block內包含若干個thread。GRID跑在GPU上的時候,可能是獨佔一個GPU的,也可能是多個kernel併發佔用一個GPU的(需要fermi及更新的GPU架構支持)。

block是resident在SM上的,一個SM可能有一個或多個resident blocks,需要具體根據資源佔用分析。

thread以warp爲單位被SM的scheduler 發射到SP或者其他單元,如SFU,LD/ST unit執行相關操作,需要等待的warp會被切出(依然是resident 狀態),以空出執行單元給其他warps。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章