CUDA中grid、block、thread、warp與SM、SP的關係

首先概括一下這幾個概念。其中SM(Streaming Multiprocessor)SP(streaming Processor)是硬件層次的,其中一個SM可以包含多個SP。thread是一個線程,多個thread組成一個線程塊block,多個block又組成一個線程網格grid。

現在就說一下一個kenerl函數是怎麼執行的。一個kernel程式會有一個grid,grid底下又有數個block,每個block是一個thread羣組。在同一個block中thread可以通過共享內存(shared memory)來通信,同步。而不同block之間的thread是無法通信的。

CUDA的設備在實際執行過程中,會以block爲單位。把一個個block分配給SM進行運算;而block中的thread又會以warp(線程束)爲單位,對thread進行分組計算。目前CUDA的warp大小都是32,也就是說32個thread會被組成一個warp來一起執行。同一個warp中的thread執行的指令是相同的,只是處理的數據不同。

基本上warp 分組的動作是由SM 自動進行的,會以連續的方式來做分組。比如說如果有一個block 裏有128 個thread 的話,就會被分成四組warp,第0-31 個thread 會是warp 1、32-63 是warp 2、64-95是warp 3、96-127 是warp 4。而如果block 裏面的thread 數量不是32 的倍數,那他會把剩下的thread獨立成一個warp;比如說thread 數目是66 的話,就會有三個warp:0-31、32-63、64-65 。由於最後一個warp 裏只剩下兩個thread,所以其實在計算時,就相當於浪費了30 個thread 的計算能力;這點是在設定block 中thread 數量一定要注意的事!

一個SM 一次只會執行一個block 裏的一個warp,但是SM 不見得會一次就把這個warp 的所有指令都執行完;當遇到正在執行的warp 需要等待的時候(例如存取global memory 就會要等好一段時間),就切換到別的warp來繼續做運算,藉此避免爲了等待而浪費時間。所以理論上效率最好的狀況,就是在SM 中有夠多的warp 可以切換,讓在執行的時候,不會有「所有warp 都要等待」的情形發生;因爲當所有的warp 都要等待時,就會變成SM 無事可做的狀況了。

實際上,warp 也是CUDA 中,每一個SM 執行的最小單位;如果GPU 有16 組SM 的話,也就代表他真正在執行的thread 數目會是32*16 個。不過由於CUDA 是要透過warp 的切換來隱藏thread 的延遲、等待,來達到大量平行化的目的,所以會用所謂的active thread 這個名詞來代表一個SM 裏同時可以處理的thread 數目。而在block 的方面,一個SM 可以同時處理多個thread block,當其中有block 的所有thread 都處理完後,他就會再去找其他還沒處理的block 來處理。假設有16 個SM、64 個block、每個SM 可以同時處理三個block 的話,那一開始執行時,device 就會同時處理48 個block;而剩下的16 個block 則會等SM 有處理完block 後,再進到SM 中處理,直到所有block 都處理結束。

發佈了1 篇原創文章 · 獲贊 8 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章