새 습관 둘: index 매핑이랑 2-D launch geometry
Vector add는 1-D grid launch. Matrix add는 데이터가 2-D니까 2-D grid launch. Launch shape이 데이터 shape 미러링, 커널 안 인덱싱이 thread 좌표를 데이터 좌표에 매핑.
매핑은 두 부분:
- Thread 좌표 → 데이터 좌표:
row = blockIdx.y * blockDim.y + threadIdx.y,col = blockIdx.x * blockDim.x + threadIdx.x. - 데이터 좌표 → flat 메모리 offset: row-major면
idx = row * ld + col; column-major는 반대.
Block size 선택: 16×16 = 256 thread가 robust default. Warp size (32)의 배수, latency hiding용 ~8 warp 줘, occupancy vs register 압박 균형. 32×32 = 1024도 동작하는데 무거운 커널에선 register 한계 hit 가능.