Grid, Block, Thread 좌표계

cudaindexinggridblockthread

CUDA kernel launch는 이런 모양이다.

kernel<<<gridDim, blockDim>>>();

1D launch에서는 다음처럼 쓸 수 있다.

kernel<<<3, 4>>>();

의미는:

gridDim.x = 3
blockDim.x = 4

즉 grid 안에 block이 3개 있고, block 하나 안에 thread가 4개 있다.

CUDA가 자동으로 주는 좌표

kernel 안에서는 다음 값들을 사용할 수 있다.

blockIdx.x
threadIdx.x
blockDim.x
gridDim.x

범위는 다음과 같다.

blockIdx.x  = 0 ... gridDim.x - 1
threadIdx.x = 0 ... blockDim.x - 1

kernel<<<3, 4>>>이면:

blockIdx.x  = 0, 1, 2
threadIdx.x = 0, 1, 2, 3

threadIdx는 block마다 다시 시작한다

threadIdx.x는 전체 grid에서의 번호가 아니라, 현재 block 안에서의 번호다.

block 0: thread 0 1 2 3
block 1: thread 0 1 2 3
block 2: thread 0 1 2 3

그래서 blockIdx.xthreadIdx.x를 함께 써야 전체 위치를 만들 수 있다.

mental model

grid  = blocks의 배열
block = threads의 배열

blockIdx.x는 grid 안에서 block의 위치이고, threadIdx.x는 block 안에서 thread의 위치다.

인터랙티브 설계

  • kernel<<<3, 4>>>를 입력하면 3개 block과 각 block의 4개 thread를 그린다.
  • gridDim.xblockDim.x 슬라이더를 바꾸면 전체 좌표가 다시 계산된다.
  • thread 하나를 클릭하면 blockIdx.x, threadIdx.x, blockDim.x, gridDim.x가 표시된다.

확인

  • kernel<<<5, 8>>>이면 총 thread 수는 몇 개인가?
  • threadIdx.x가 block마다 0부터 다시 시작하는 이유는 무엇인가?
  • gridDim.xblockDim.x는 누가 정하는가?