CUDA Kernel Optimization Basics

이 경로는 Path 2에서 만든 naive kernel을 실제로 빠르게 만드는 단계다.

핵심 질문은 단순하다.

같은 계산을 하는데 왜 어떤 kernel은 빠르고 어떤 kernel은 느린가?

먼저 시간을 재는 법을 익히고, memory coalescing, shared memory, tiled matmul, reduction, warp primitive를 순서대로 본다. 마지막에는 Path 2의 RMSNorm을 다시 가져와 naive kernel과 optimized kernel을 PyTorch workflow에서 비교한다.

  1. CUDA Event Timing과 Benchmark — CUDA 최적화 전에 kernel 구간을 일관되게 측정하는 법을 익힌다.
  2. Memory Coalescing — warp의 thread들이 연속 주소를 읽을 때 global memory 접근이 왜 빨라지는지 실험한다.
  3. Shared Memory로 Tile 재사용하기 — block 안 thread들이 global memory에서 가져온 tile을 shared memory에 올리고 재사용하는 패턴을 배운다.
  4. Tiled Matrix Multiplication — naive GEMM을 shared memory tiled GEMM으로 바꾸며 block matmul 최적화의 기본 구조를 익힌다.
  5. Reduction Optimization — softmax와 RMSNorm에 필요한 sum/max reduction을 block 안에서 병렬로 줄이는 방식을 배운다.
  6. Warp-level Reduction — shared memory 대신 warp shuffle로 warp 내부 값을 교환하며 reduction하는 패턴을 익힌다.
  7. Occupancy와 Block Size — threads per block, register, shared memory, occupancy의 trade-off를 이해한다.
  8. Optimized RMSNorm Benchmark — Path 2의 naive RMSNorm을 block/warp reduction으로 개선하고 PyTorch extension에서 비교한다.