在上一篇混編的文章裡面已經提到了關於三個基礎的關鍵字。

那麼在今天的這篇裡面,我們就觸及到了關於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以此類推,其實有畫圖可以勾勒圖形,只是需要點時間,後面有時間我會補上。

通過這樣的空間構想,就很容易寫出索引公式了。

上面兩個可以暫時輔助理解,但是我經過自己構想,覺得這個圖並不能很好的幫助構想。但是至少能在1D和2D的Block的情況下幫助你們一點。 這個瞭解後,我們就能很輕鬆的開始入門了,例如如何將一幅圖片分配到線程裏,如果將一個三維物體分解到線程裏,這些操作都涉及到線程的劃分,如果能較好的掌握這些基本概念,圖像處理,並行數據計算,三維切割等大規模數據處理都可以有一個較好的開始。

就像我們不能處理大型的物體,那我們就把東西切分成小塊,一步步處理,正如微分思想。

新浪微博:鍾Viator的微博

知乎:知乎用戶

文章權歸該作者所有,轉載請註明。


推薦閱讀:
相關文章