FlashAttention 의 저자가 직접 짠 DSL 풍경 지도. Triton, Mosaic-GPU, CuTe DSL, Helion, ThunderKittens, raw CUDA 가 같은 산을 다른 길로 오른다 — Tri Dao 가 그들을 "추상 레벨" × "사람이 통제 가능한 자유도" 의 두 축에서 비교한 강의의 학습 노트.
2024-2025 의 GPU DSL 풍경은 이미 복잡하다 — Triton, Mosaic, ThunderKittens, CuTe DSL, Pallas, Helion, JAX Pallas. 각자가 자기 자리에서 최선이라고 주장하지만, 사용자 입장에서는 "내 문제에 어떤 걸 골라야 하는가" 의 답이 명확하지 않다. Tri Dao 가 FlashAttention 저자의 입장에서 그 지도를 직접 그린다.
강의의 frame 이 명확하다.
같은 산 (efficient GPU kernel) 을 오르는 다른 길들 — 모두 비슷한 산봉우리를 노리지만 출발점과 도구가 다르다.
두 축으로 정렬한다 — 추상 레벨 (얼마나 적게 짜도 되는가) 와 통제 가능 자유도 (필요할 때 얼마나 깊이 내려갈 수 있는가). 두 축이 통상 trade-off.
"어느 게 best 인가" 가 아니라 "어느 자리에 어느 것이 자연스러운가" — 답은 작업의 hot path 깊이 + 팀의 학습 곡선.
강의의 인지적 frame
이 강의는 비교 panel 이지 evangelism 이 아니다. Tri Dao 본인이 FlashAttention-1 은 raw CUDA, FA-2 는 CUTLASS, FA-3 는 ThunderKittens + 직접 PTX 까지 도구를 옮겨가며 짰다 — 그 경험에서 나오는 솔직한 권장.
"DSL 의 가치는 abstraction 의 우아함이 아니라 — 필요할 때 그 추상을 부수고 내려갈 수 있는 escape hatch 의 깊이다."Tri Dao · 확인 필요
§ 02GPU DSL 의 분류· taxonomy
두 축으로 자른 정렬 — 추상 레벨 × 사람이 통제 가능한 자유도
Tri 가 슬라이드 한 장으로 정리한 정렬 — 추상 레벨이 높으면 코드가 짧다, 통제 가능 자유도가 높으면 hardware 의 모든 칸을 직접 짤 수 있다. 둘은 통상 trade-off.
FIG · DSL 정렬 — 추상 레벨 축왼쪽 = 더 짧은 코드 / 오른쪽 = 더 직접적 통제
tooling
Helion
Triton
Mosaic-GPU
CuTe DSL
ThunderKittens
CUDA + PTX
← 더 추상적 (compiler 가 결정)더 직접적 (사람이 결정) →
왼쪽 끝의 Helion 은 "Triton 보다 더 PyTorch 같은" 표현. 오른쪽 끝의 raw CUDA 는 PTX 까지 사람이 통제. 그 사이 점들이 각자 다른 trade-off 위치를 차지.
tile-level
Triton · Python DSL, jit
Helion · 더 PyTorch 스러운 frontend
Mosaic-GPU · JAX/Pallas tile
tile = 1차 시민, autotune 강함
layout-aware
CuTe DSL · CUTLASS 의 layout algebra
ThunderKittens · 16×16 tile 명시적
layout swizzling 직접 통제
raw / PTX
CUDA C++ · WMMA / WGMMA intrinsic
inline PTX · escape hatch 의 끝
모든 칸을 사람이 결정
graph compiler
torch.compile · Inductor → Triton
JAX/XLA · HLO 위 fusion
사용자가 op 만 적고 fusion 자동
§ 03Triton / Mosaic / CuTe / Helion 비교· side by side
같은 GEMM 을 5 가지 방식으로 — 코드의 모양이 어떻게 다른가
강의에서 가장 진하게 다뤄진 비교. Tri Dao 가 같은 GEMM 작업을 5 개 DSL 로 어떻게 표현하는지 줄별로 짚는다.
TAB · 5 가지 DSL 의 자리각 차원에서의 위치
차원
Triton
Mosaic-GPU
CuTe DSL
Helion
ThunderKittens
frontend
Python jit
JAX/Pallas
C++ template
Python (PyTorch)
C++ template
backbone
Triton-IR / MLIR
Mosaic-IR / MLIR
CUTLASS layout
Triton 위 추상
raw CUDA + PTX
tile 표현
tl.arange + indexing
tile spec param
Tensor + Layout
PyTorch tensor 같은
rt<T,M,N> first-class
autotune
기본 강함
spec 옵션 sweep
template 인자
Triton 의 autotune 상속
없음 (template 직접)
WGMMA
tl.dot 자동 lowering
spec annotation
copy_atom + mma_atom
Triton 과 같음
warpgroup::mma_AB
TMA
자동 (대부분)
spec 으로 명시
SM90 copy
Triton 의 자동
load_async + barrier
학습 곡선
완만
JAX 알면 쉬움
가파름
매우 완만
가파름
peak %
~80%
~85%
~90%
~78%
~86%
대표 use
fusion experiment
JAX/TPU porting
cuBLAS 대체
fast prototyping
FA / GEMM 핫패스
같은 작업의 코드 길이도 큰 차이가 있다 (단순 GEMM, BF16, 4096³, 개념적).
Helion — ~30 줄. PyTorch 호출처럼 보인다.
Triton — ~80 줄. autotuner config 까지 포함.
Mosaic-GPU — ~120 줄. JAX 의 Pallas 위에 spec.
ThunderKittens — ~100 줄. WGMMA 명시.
CuTe DSL — ~250+ 줄. Layout 정의 + Atom 조합.
raw CUDA — ~500 줄. 모든 boilerplate 포함.
코드 길이의 의미
짧은 게 무조건 좋다는 게 아니다. "보이지 않는 결정의 양"이 중요하다. Helion 30 줄 안에는 사람이 안 적은 결정이 매우 많다 (block size, num warps, layout, schedule). 그 결정이 사용자의 작업과 맞으면 좋고, 안 맞으면 우회 비용이 있다.
§ 04추상 레벨 vs 컨트롤· core trade-off
"escape hatch 의 깊이" 가 결정 변수
강의의 핵심 한 장 — 모든 DSL 이 추상 레벨 × 통제 자유도의 trade-off 위에 있고, 결정 변수는 "필요할 때 어디까지 내려갈 수 있는가".
FIG · escape hatch 의 깊이각 DSL 이 어디까지 직접 통제 허용
중요한 사실 — Triton 도 inline_asm 으로 PTX 까지 escape 가능하다 (최근 추가). 하지만 그 hatch 가 얼마나 자주 쓰이고 잘 동작하는지가 다른 문제. 실용적 깊이가 그래프보다 짧을 수 있음.
강의에서 Tri 가 짚은 핵심 — FA-2 → FA-3 의 전환은 escape hatch 의 깊이 부족 때문이었다. Triton 으로는 FA-3 의 ping-pong, async warpgroup specialization 을 표현할 도구가 부족했다. 그래서 ThunderKittens / 직접 CUDA 로 내려갔다.
trade-off 의 한 줄 정리
"높은 추상 + 깊은 escape hatch" 가 이상적이지만 둘은 통상 충돌. Triton 은 추상은 높지만 escape 가 얕다, ThunderKittens 는 escape 가 깊지만 추상이 낮다. 그래서 두 도구 모두 살아 있고, 같은 팀이 양쪽을 쓴다.
§ 05컴파일 파이프라인 차이· how each lowers
Triton-IR vs Mosaic-IR vs CUTLASS template — 다른 다리
DSL 별 lowering pipeline 의 갈래. 어디서 어떤 결정이 내려지는지가 성능 의 결정 변수.
Triton
L0: Python jit
L1: Triton-IR (tile-level)
L2: MLIR (TritonGPU dialect)
L3: LLVM IR
L4: PTX → SASS
layout/swizzle 결정 = MLIR pass 안
CuTe DSL
L0: C++ template
L1: Layout / Tensor abstraction
L2: Atom 조합 (Copy + MMA)
L3: nvcc PTX gen
L4: SASS
layout = 사람이 직접 명시
ThunderKittens
L0: C++ template
L1: tile primitives (rt/st)
L2: warpgroup ops
L3: nvcc + inline PTX
L4: SASS
layout = template 으로 노출, 사용자 통제
이 갈래를 보면 "어디서 결정이 내려지는가" 가 명확해진다.
Triton — 대부분의 결정 (layout, register allocation, vectorization, async pipeline) 이 MLIR pass 안에서. 사용자는 BLOCK_SIZE, num_warps, num_stages 정도만 통제.
CuTe — Layout 과 Atom 의 조합으로 사용자가 결정. compiler 는 그것을 기계어로 옮길 뿐.
ThunderKittens — 중간. tile 형태는 사용자가, swizzling 의 hex detail 은 라이브러리가.
"DSL 의 진짜 차이는 어떤 결정이 사용자의 손에 남고 어떤 결정이 컴파일러의 손에 가는가의 분배다."Tri Dao · 확인 필요
§ 06사용자 경험· developer ergonomics
"코드를 짤 때" 와 "디버깅할 때" 의 두 시점
DSL 의 가치는 행복한 path 의 코드 길이가 아니라 버그 났을 때 빠져나오는 시간. Tri 가 강조한 ergonomics 의 두 면.
"코드를 짤 때"
Triton / Helion — Python REPL, 즉각 jit. iteration 이 가장 빠름. tutorial 튜닝부터 시작 가능.
Mosaic-GPU — JAX 환경 안에 있으면 자연. 그렇지 않으면 환경 셋업이 무거움.
ThunderKittens — C++ 컴파일 사이클. nvcc 가 한 번 도는데 30초+. 실수 비용 큼.
CuTe DSL — template error 의 늪. 잘못된 layout 한 줄이 100 줄짜리 컴파일러 메시지.
ThunderKittens — printf 가능 + ncu profile 자연스러움. 하지만 IDE 통합 약함.
CuTe — Layout 이 잘못되면 silent 한 wrong result. 디버깅이 가장 어려움.
compiler 결정 추적 — Triton 의 TRITON_INTERPRET, TRITON_CACHE_DIR 안 IR dump 가 유용. 다른 DSL 은 비슷한 기능이 약하거나 없음.
numerical 검증 — § L076 의 BackendBench 같은 외부 harness 가 결국 필요.
팀 단위 결정
같은 팀에 Python 만 아는 ML 엔지니어와 CUDA 까지 아는 GPU 엔지니어가 섞여 있으면 — 통상 Triton 으로 시작 → 핫패스만 ThunderKittens 또는 CUTLASS 의 두 단계 워크플로가 자연스럽다. Tri 의 명시적 권장.
§ 07hardware 가속 활용· TMA · WGMMA · async
새 칩의 새 명령을 누가 가장 빨리 흡수하는가
H100 / B200 같은 새 칩이 나오면 새 명령 (TMA, WGMMA, tcgen05.mma) 을 DSL 이 흡수해야 한다. 흡수 속도가 DSL 의 살아남는 변수.
기능
Triton
Mosaic
CuTe
ThunderKittens
CUDA
TMA (H100)
자동
spec
copy atom
primitive
intrinsic
WGMMA
tl.dot
matmul spec
mma atom
warpgroup::mma
intrinsic
async barrier
자동
spec
지원
mbarrier 직접
intrinsic
FP8 (H100)
지원
지원
정식
정식
지원
tcgen05.mma (B200)
2025 후반
미상
정식 (FA4)
정식 (FA4)
intrinsic
FP4 (B200)
2025 후반
미상
정식
정식
지원
warp specialization
제한적
제한적
지원
core feature
지원
큰 패턴 — 새 명령은 항상 raw CUDA / CUTLASS 가 먼저 흡수, ThunderKittens 가 빠른 두 번째. Triton 은 추상 레벨이 높은 만큼 새 명령의 흡수가 느리다 (spec 정의 → IR 추가 → MLIR pass → backend lowering 전체가 가야 함).
왜 FA4 가 ThunderKittens 위에서 먼저 등장했는가
B200 의 5-way warp specialization, tcgen05.mma 같은 새 명령을 explicit 하게 다룰 도구가 ThunderKittens 외에는 없었기 때문. Triton 의 대응이 더 늦은 자연스러운 이유. (자세한 내용은 L080)
§ 08채택 곡선· adoption curve
"어디까지 깔려 있는가" 가 다음 결정 변수
DSL 의 운명을 결정하는 또 하나 — 인프라가 누구 위에 깔리는가. PyTorch, JAX, vLLM, SGLang 같은 layer 가 어떤 DSL 을 default 로 받는지가 산업적 자리.
Triton — torch.compile 의 Inductor 가 Triton 으로 lowering. 사실상 PyTorch 의 default backend. 가장 넓은 채택.
CuTe / CUTLASS — cuBLAS, cuDNN, FlashAttention 의 reference 인프라. NVIDIA 가 직접 maintain. 가장 깊은 채택.
Mosaic-GPU — Google 의 JAX/Pallas 인프라. TPU porting 의 base. JAX 생태계 의존적.
ThunderKittens — HazyResearch / Together / Stanford. attention 의 reference 구현. research-leading 채택.
Helion — 강의 시점에 신생. 채택 곡선 미상 (확인 필요).
이 채택 분포가 결정하는 사실 — 새 op 가 등장하면 Triton / CUTLASS 위에 먼저 구현된다. 그 이후 다른 DSL 로 흘러간다. 그래서 "어떤 DSL 이 가장 빨리 새 모델을 따라가는가" 의 답은 인프라 곡선과 1:1.
§ 09다음 단계· where each is heading
각 DSL 이 향하는 방향
Triton — 새 칩 (B200, MI300) 의 명령을 더 빠르게 흡수, autotune 의 cost 감소, inline_asm 의 escape hatch 강화.
Mosaic-GPU — TPU 에서 GPU 로의 단일 코드 경로 강화, JAX/Pallas 통합의 깊이.
CuTe DSL — Blackwell 명령의 정식 abstraction, FP4 / sparsity 의 first-class.
ThunderKittens — HipKittens (AMD), ThunderMittens (Apple) 의 cross-arch 확장. § L075 참조.
Helion — Triton 의 frontend 추상의 더 위. PyTorch 의 native fusion 표현으로의 후보.
새 후보들 — Pallas (JAX), MLX (Apple), 그리고 LLM-as-DSL 같은 generative 접근 (BackendBench 의 후속).
"DSL 의 풍경은 안정되지 않는다 — 새 칩이 나올 때마다 풍경이 다시 그려지고, 가장 빨리 흡수한 DSL 이 그 칩의 reference 가 된다."학습 노트
§ 10기억할 메모· key takeaways
다시 열었을 때 손에 잡혀야 할 것
두 축 정렬
추상 레벨 × 통제 가능 자유도. 통상 trade-off. 모든 DSL 이 이 평면 위 한 점.
escape hatch 깊이
"필요할 때 어디까지 내려갈 수 있는가" 가 진짜 결정 변수. Triton 의 한계가 FA-3 → ThunderKittens 전환의 이유.
Triton
tile DSL, Python jit. fusion experiment / fast prototype 에 best. autotuner 강함.
ThunderKittens
tile primitive 명시, C++ template. FA / GEMM 핫패스에 best. WGMMA explicit.
CuTe DSL
CUTLASS 의 layout algebra. cuBLAS 대체 / 가장 깊은 통제. 학습 곡선 가파름.
Mosaic-GPU
JAX/Pallas 의 GPU 분기. TPU 코드 porting / JAX 환경.
Helion
Triton 위 더 PyTorch 같은 frontend. 가장 짧은 코드. fast prototype.
두 단계 워크플로
Triton 으로 시작 → 핫패스만 ThunderKittens / CUTLASS. 팀 단위 권장 패턴.