2016-11-21 15 views
0

我是CUDA的新手,我已閱讀並瞭解如何計算線程的ID。我有一個關於線程ID的問題,例如,在這個image中可以看到。爲什麼我需要塊維度來計算CUDA中的線程ID?

我不明白的是爲什麼線程和塊座標不足以計算threadID,而是我需要使用塊維度。

+2

圖像實際上很好地顯示它。例如,'(threadIdx.x,threadIdx.y)'是'(1,2)'有多個線程。正如ApoorvaJ指出的那樣:爲了獲得**唯一的**索引,您還必須考慮該線程的哪個*塊*以及一個塊中有多少個線程。 – Marco13

回答

3

CUDA documentation所示,多個線程一起形成一個塊,並且多個這樣的塊形成網格。

現在,當網格中的每個線程都需要唯一標識時,您必須考慮塊維度。

enter image description here

在以下示例中,ij一起唯一地標識網格中的每個線程。

int i = blockIdx.x * blockDim.x + threadIdx.x; 
int j = blockIdx.y * blockDim.y + threadIdx.y; 

threadIdx是一個塊內的線程的索引和blockIdx是網格內的塊的索引。因此,您必須有blockDim才能獲得網格內某個線索的唯一索引i, j

+0

好的,但我仍然有同樣的問題。爲什麼'blockDim'需要?對不起,我知道這可能是一個愚蠢的問題。這樣就不會說:'int i = blockIdx.x + threadIdx.x; int j = blockIdx.y + threadIdx.y;'?這樣我就知道塊內的線程和網格內的塊。爲什麼我需要塊中有多少個線程(即塊維度)? – chick3n0x07CC

+3

爲了唯一標識整個_grid_中的每個_thread_。我建議你在紙上試着嘗試你陳述的公式,並嘗試以這種方式唯一地爲每個線索索引。恐怕我不知道如何進一步解釋這一點。 – ApoorvaJ

0

我們必須really2瞭解並能想象當內核推出和線程的創建,以及什麼blockDim,blockIdx,threadIdx真的是我們的頭,物理可視化....

塊尺寸(BlockDim)是「X或Y或Z尺寸的每個BLOCK中的」THREADS的數量(計數)「(取決於.X,.Y或.Z)。

BlockIdx.x表示線程位於哪個塊中的索引號。塊的索引號從零開始計數,從左到右(x),上下(y),從前到後(z)排序。

threadIdx.x是本地索引,從零開始在每個塊(blockIdx.x)中。 但是,當它運行/生活時,我們應該知道「全局線程索引」。因此,它需要:

uint globalIdx_x = blockIdx.X * blockDim.X + threadIdx.x; 

嘗試閱讀和學習這本書: 專業CUDA C語言編程 - Wrox的編程。

相關問題