1. 程式人生 > >CUDA 關於 BLOCK數目與Thread數目設定

CUDA 關於 BLOCK數目與Thread數目設定

GPU的計算核心是以一定數量的Streaming Processor(SP)組成的處理器陣列,NV稱之為Texture Processing Clusters(TPC),每個TPC中又包含一定數量的Streaming Multi-Processor(SM),每個SM包含8個SP。SP的主要結構為一個ALU(邏輯運算單元),一個FPU(浮點運算單元)以及一個Register File(暫存器堆)。SM內包含有一個Instruction Unit、一個Constant Memory、一個Texture Memory,8192個Register、一個16KB的Share Memory、8個Stream Processor(SP)和兩個Special Function Units(SFU)。(GeForce9300M GS只擁有1個SM) Thread是CUDA模型中最基本的執行單元,執行最基本的程式指令。Block是一組協作Thread,Block內部允許共享儲存,每個Block最多包含512個Thread。Grid是一組Block,共享全域性記憶體。Kernel是在GPU上執行的核心程式,每一個Grid對應一個Kernel任務。 在程式執行的時候,實際上每32個Thread組成一個Warp,每個 warp 塊都包含連續的執行緒,遞增執行緒 ID 。Warp是MP的基本排程單位,每次執行的時候,由於MP數量不同,所以一個Block內的所有Thread不一定全部同時執行,但是每個Warp內的所有Thread一定同時執行。因此,我們在定義Thread 

Size的時候應使其為Warp Size的整數倍,也就是Thread Size應為32的整數倍。理論上Thread越多,就越能彌補單個Thread讀取資料的latency ,但是當Thread越多,每個Thread可用的暫存器也就越少,嚴重的時候甚至能造成Kernel無法啟動。因此每個Block最少應包含64個Thread,一般選擇128或者256,具體視MP數目而定。一個MP最多可以同時執行768個Thread,但每個MP最多包含8個Block,因此要保持100%利用率,Block數目與其Size有如下幾種設定方式: Ø 2 blocks x 384 threads Ø 3 blocks x 256 threads Ø 4 blocks x 192 threads Ø 6 blocks x 128 threads Ø 8 blocks x 96 threads