모든 CUDA / Metal 초보 무는 다섯 가지
- Lock-step ≠ order. Warp 안 thread는 program counter 공유하지만 다른 block의 warp들이 interleave해서 print 순서 어긋남. Ant #128이 Ant #1 자주 이김.
- 개미 너무 많으면 → 줄. 카드가 동시에 host할 수 있는 SM 수보다 block 더 많이 launch하면 나머지는 차례 기다림. 대규모 병렬? 응. 무한? 아냐.
- Clock 산수 reality check. 2 GHz × 1,000 thread ≈ tick당 명령어 슬롯 200만 — 인상적인데 bound 있음. Pipeline stall, memory wait, bank conflict가 표제 숫자 깎음.
- 스케줄러가 부사관. 어느 warp 언제 돌지 하드웨어 결정. 코드는 briefing 쓰고 스케줄러가 순서 픽. Divergent branch, register 압박, shared-memory 한계 다 입력으로 들어감.
- Warp divergence가 throughput 죽임. 32-thread warp가
if (thread_id % 2 == 0) ... else ...실행하면 두 path 직렬화 — warp 절반이 idle인 동안 나머지가 각 branch 돌림. 사실상 throughput 절반, 심한 형태는 더 깊이 깎음.
이 중 초보가 자기도 모르게 가장 자주 디자인해 들어가는 게 warp divergence. fix는 if 통째 회피가 아니라 — 분기 결정을 warp 안에서 uniform하게 유지해서 warp 안 32 thread가 같은 path 가게.