모든 CUDA / Metal 초보 무는 다섯 가지
- Lock-step ≠ order. Warp 안 thread는 program counter를 공유하지만, 다른 block의 warp들이 interleave해서 print 순서가 어긋나. Ant #128이 Ant #1을 자주 이겨.
- 개미 너무 많으면 → 줄. 카드가 동시에 host할 수 있는 SM 수보다 block을 더 많이 launch하면 나머지는 차례를 기다려. 대규모 병렬? 응. 무한? 아냐.
- Clock 산수로 현실 점검. 2 GHz × 1,000 thread ≈ tick당 명령어 슬롯 200만 — 인상적이지만 한계는 있어. 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 가게.