C++&CUDA 線程索引計算
在上一篇混編的文章裡面已經提到了關於三個基礎的關鍵字。
那麼在今天的這篇裡面,我們就觸及到了關於Grid、Block、Thread的劃分部分,這個非常重要,也是我今天時間花費比例佔比較大的,在劃分的時候,我們不得不說劃分用在什麼地方,那就是核函數,核心函數之前就是那個用Global標記的函數,它可以看作是整個設備端的Main入口函數,它調用Device函數,我們在它的語法上可以看到奇怪的<<<>>>的符號,這個符號中間就是我們劃分的中心了,主要有3個參數,Grid的維度和block的維度。還有一個默認參數我們先不理會。
這兩個維度我們可以直接用整數型數字手動劃分,例如addKernel<<<2,32>>> (a,b).這就是劃分為2個block,每個block含有32個線程,這個number of thread per block最好是32的倍數,因為我們通過設備的查詢可以發現,線程束的最大值為32,如果劃分小於32,則浪費,所以最好是32的倍數。
其實2,32兩個參數最完整的形式應該是(2,1,1),(32,1,1).只不過顯示為單個數字,這個情況就是1D Grid and 1D block的情況。
Grid 和Block的情況有6種,分別為以下圖片給出的,並且攜帶了每個線程唯一的索引公式,這個公式要死記硬背那就太可怕了,我們可以通過幾何來理解這個公式,
1D 一條線
2D 一個面
3D 一個體
顯然我們剛才手動定義的是一維,即一條線,線上有兩個block,這個block也是一維的,即一條線。
2D,3D以此類推,其實有畫圖可以勾勒圖形,只是需要點時間,後面有時間我會補上。
通過這樣的空間構想,就很容易寫出索引公式了。