전공/MFC 삽질들..

Cuda threadIdx, blockIdx

무한공백 2010. 11. 23. 11:29

혼자 공부한것이라 틀릴수도 있어요. ^^;;

threadIdx 는 블럭 내에서의 스레드의 위치를 나타내고
blockIdx 는 그리드 내에서 블럭의 위치를 나타낸다.


2*2의 블럭내에 2*2의 스레드(총 4개 )가 있다면, threadIdx는 블럭내의 인덱스 이므로 아래와 같다.
(블럭(0,0) Thead(00,10,01,11) 총 4개를 가진다는 예제의 그림임)


서로 다른 블럭내의 스레드는 모두 동일한 인덱스를 가진다.
따라서, 작업하는 실제 스레드 위치를 알기 위해서는 다음과 같이 계산해 줘야 한다.

int work_x = blockIdx.x * blockDim.x + threadIdx.x;
int work_y = blockIdx.y * blockDim.y + threadIdx.y;

여기서 blockDim은 자신이 지정해준 블럭내의 스레드 크기이다.


dim3 blockPerGrid(2,2) // Grid 안의 블록 갯수, 현재는 2행2열 개의 block이 존재한다. 
dim3 threadPerBlock(2,2) //Block 안의 스레드 갯수, 현재는 2행2열 개의 thread가 존재한다.
test <<< blockPerGrid, threadPerBlock >>> ,,,,,

이경우 blockDim.x = 2 blockDim.y = 2; 즉, block내의 스레드 갯수를 의미한다. 따라서,

실질적인 작업 위치는 아래와 같이 계산된다.
(work_x와 work_y가 실제 스레드의 인덱스라 할 수 있음, 위의 work_x, y 구하는 식에 blockIdx.x 넣고 blockDim.x 넣고 , threadIdx.x 넣고 계산해 보시면 금방 알수 있어요. 실제 인덱스 스레드의 인덱스를 가르키는 것 뿐이지 별거 아닙니다.... 어려우실까요?..)


공부하면서 하는거라 틀린 부분이 있을 지도 있습니다.