매일 쓰는 high-level 라이브러리가 결국 이 커널
numpy, PyTorch, MLX의 모든 vector arithmetic 줄이 결국 방금 쓴 거랑 본질적으로 같은 CUDA / Metal 커널에 dispatch돼. 뭐가 생성되고 언제 어디서 — 그걸 이해하는 게 커널 레벨 코딩에서 framework 레벨 코딩으로 가는 다리야.
| Layer | 뭐가 dispatch | 어느 backend로 |
|---|---|---|
NumPy a + b (CPU) | OpenBLAS / MKL 커널 (SIMD-vectorized) | x86 AVX2/AVX512 또는 ARM NEON |
PyTorch a + b on CUDA tensor | cuBLAS 또는 ATen의 hand-rolled CUDA 커널 | NVCC-compiled CUDA |
PyTorch a + b on MPS tensor (Mac) | MPS (Metal Performance Shaders) 커널 | Metal compute |
MLX a + b (Apple) | MLX-native Metal 커널 | Metal compute |
torch.compile(f) graph | Triton-generated 커널 (shape별 custom code) | NVCC / Triton |
각 라이브러리가 숨기는 게 9단계 워크플로우. PyTorch에서 a + b는 내부적으로:
- A랑 B가 device + dtype 공유하는지 체크.
- 같은 device에 출력 tensor 할당.
- 커널 픽 — element-wise add, broadcast add,
torch.compile로 이전 op이랑 fuse 등. - tensor shape으로부터 launch geometry (thread × block) 계산.
- 커널 launch.
- 출력 tensor handle return (host copy 아직 없음 —
.cpu()나.numpy()에서 일어남).
그래서 x.cuda() + y.cuda() 같은 snippet이 'Python expression처럼 보여도' 빠른 거 — 무거운 일은 정확히 lesson 3–4에서 쓴 커널.