gpumode · 강의 아카이브
《GPU Mode》 L077 2025 High priority transcript · failed

Domain Specific Languages for GPU Kernels

FlashAttention 의 저자가 직접 짠 DSL 풍경 지도. Triton, Mosaic-GPU, CuTe DSL, Helion, ThunderKittens, raw CUDA 가 같은 산을 다른 길로 오른다 — Tri Dao 가 그들을 "추상 레벨" × "사람이 통제 가능한 자유도" 의 두 축에서 비교한 강의의 학습 노트.

Triton Mosaic-GPU CuTe DSL Helion ThunderKittens CUDA CUTLASS tile algebra layout
T
Speaker
Tri Dao
Princeton · Together AI · FlashAttention 저자
강의 번호
L077
학습 우선순위
High
자막
failed
다시 볼 때
DSL 코드 직접 비교
§ 01강의가 풀려는 문제· why this lecture exists

"DSL 이 너무 많다" 의 다음 질문 — 무엇이 어디서 빛나는가

2024-2025 의 GPU DSL 풍경은 이미 복잡하다 — Triton, Mosaic, ThunderKittens, CuTe DSL, Pallas, Helion, JAX Pallas. 각자가 자기 자리에서 최선이라고 주장하지만, 사용자 입장에서는 "내 문제에 어떤 걸 골라야 하는가" 의 답이 명확하지 않다. Tri Dao 가 FlashAttention 저자의 입장에서 그 지도를 직접 그린다.

강의의 frame 이 명확하다.

  1. 같은 산 (efficient GPU kernel) 을 오르는 다른 길들 — 모두 비슷한 산봉우리를 노리지만 출발점과 도구가 다르다.
  2. 두 축으로 정렬한다 — 추상 레벨 (얼마나 적게 짜도 되는가) 와 통제 가능 자유도 (필요할 때 얼마나 깊이 내려갈 수 있는가). 두 축이 통상 trade-off.
  3. "어느 게 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 의 자리각 차원에서의 위치
차원TritonMosaic-GPUCuTe DSLHelionThunderKittens
frontendPython jitJAX/PallasC++ templatePython (PyTorch)C++ template
backboneTriton-IR / MLIRMosaic-IR / MLIRCUTLASS layoutTriton 위 추상raw CUDA + PTX
tile 표현tl.arange + indexingtile spec paramTensor + LayoutPyTorch tensor 같은rt<T,M,N> first-class
autotune기본 강함spec 옵션 sweeptemplate 인자Triton 의 autotune 상속없음 (template 직접)
WGMMAtl.dot 자동 loweringspec annotationcopy_atom + mma_atomTriton 과 같음warpgroup::mma_AB
TMA자동 (대부분)spec 으로 명시SM90 copyTriton 의 자동load_async + barrier
학습 곡선완만JAX 알면 쉬움가파름매우 완만가파름
peak %~80%~85%~90%~78%~86%
대표 usefusion experimentJAX/TPU portingcuBLAS 대체fast prototypingFA / GEMM 핫패스

같은 작업의 코드 길이도 큰 차이가 있다 (단순 GEMM, BF16, 4096³, 개념적).

코드 길이의 의미

짧은 게 무조건 좋다는 게 아니다. "보이지 않는 결정의 양"이 중요하다. Helion 30 줄 안에는 사람이 안 적은 결정이 매우 많다 (block size, num warps, layout, schedule). 그 결정이 사용자의 작업과 맞으면 좋고, 안 맞으면 우회 비용이 있다.

§ 04추상 레벨 vs 컨트롤· core trade-off

"escape hatch 의 깊이" 가 결정 변수

강의의 핵심 한 장 — 모든 DSL 이 추상 레벨 × 통제 자유도의 trade-off 위에 있고, 결정 변수는 "필요할 때 어디까지 내려갈 수 있는가".

FIG · escape hatch 의 깊이각 DSL 이 어디까지 직접 통제 허용
PyTorch op tile block / SMEM warp / register PTX / SASS microcode Helion Triton Mosaic-GPU ThunderKittens CuTe DSL CUDA 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 으로 노출, 사용자 통제

이 갈래를 보면 "어디서 결정이 내려지는가" 가 명확해진다.

"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 줄짜리 컴파일러 메시지.
  • raw CUDA — 가장 무거움. 하지만 가장 명시적.

"디버깅할 때"

  • Tritoninterpret=True 모드, Python breakpoint. 실속 있음.
  • 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 의 살아남는 변수.

기능TritonMosaicCuTeThunderKittensCUDA
TMA (H100)자동speccopy atomprimitiveintrinsic
WGMMAtl.dotmatmul specmma atomwarpgroup::mmaintrinsic
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 로 받는지가 산업적 자리.

이 채택 분포가 결정하는 사실 — 새 op 가 등장하면 Triton / CUTLASS 위에 먼저 구현된다. 그 이후 다른 DSL 로 흘러간다. 그래서 "어떤 DSL 이 가장 빨리 새 모델을 따라가는가" 의 답은 인프라 곡선과 1:1.

§ 09다음 단계· where each is heading

각 DSL 이 향하는 방향

"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. 팀 단위 권장 패턴.
YouTube강의 영상 (확인 필요)
Helionrepo 확인 필요

손에 새기기 — 실습 시퀀스

  1. 같은 GEMM 5 가지로 — Triton, ThunderKittens, CuTe, Helion, raw CUDA. 코드 길이 + peak% 직접 측정. 4096³ BF16.
  2. 새 op 추가의 비용 — softmax + dropout fused 를 각 DSL 에서 새로 짠다. 짜는 시간 + 디버깅 시간 직접 측정.
  3. Triton 의 escape hatchtl.inline_asm_elementwise 또는 PTX 직접 삽입. 어디까지 내려갈 수 있는지 확인.
  4. 새 칩 명령 흡수 — H100 의 TMA / WGMMA 를 Triton vs ThunderKittens 로 호출. 코드 양 비교.
  5. fault injection — 의도적 wrong indexing 을 각 DSL 에서. 에러 메시지 / 디버깅 워크플로 비교.
  6. autotune cost — 같은 GEMM 의 Triton autotune sweep 시간 vs ThunderKittens 의 template 수동 sweep 시간.
§ 11다른 강의로의 연결· connections

이 강의가 시리즈 안에서 어디로 이어지는가

§ 12열린 질문· open questions

다음에 다시 들었을 때 직접 검증해야 할 것들

검증 메모

이 노트의 비교표는 강의 시점 + 도메인 지식의 재구성. 모든 peak% 와 채택 사례는 시점 의존이고, DSL 들은 지속 발전. 같은 비교를 6개월 후에 하면 다른 그림이 나올 가능성이 큼. 절대 수치는 직접 측정 권장.

← Lecture 076BackendBench — fixing LLM kernel correctness Lecture 078 →Iris — Multi-GPU Programming in Triton