CUTLASS C++ 의 핵심인 CuTe (layout 과 tensor 의 algebra) 를 파이썬에서 직접 다루는 DSL. 같은 shape, stride, layout, tile, copy 의 개념을 C++ 보일러플레이트 없이 만지고, 결국에는 PTX/SASS 까지 — 같은 백엔드로 — 내려간다. NVIDIA 의 Vicki Wang 이 깐 CuTe Python DSL 의 첫 진입점, layout algebra 의 직관, GEMM 작성 시퀀스, 그리고 Triton 과의 경계까지 — slides PDF 와 도메인 지식으로 재구성한 학습 노트.
CUTLASS 는 NVIDIA 의 production GEMM/Conv 라이브러리. 그 안의 CuTe 가 layout 과 tile 의 algebra 를 표현하는 핵심 추상이다. 그러나 CuTe 는 C++ template으로 짜여 있고 — 한 번 코드를 펼친 사람이라면 안다 — 진입 장벽이 매우 높다. 이 강의는 CuTe 의 같은 추상을 파이썬으로 직접 만지는 새 DSL 을 깐다.
NVIDIA 가 CuTe Python DSL 을 만든 의도는 — 외부에 공개된 자료 흐름에서 — 세 갈래로 모인다.
강의 자막은 실패. 슬라이드 PDF (lecture_086/cute_dsl_introduce.pdf) 가 repo 에 있어 큰 흐름 재구성 가능. 정확한 API 이름 / 코드 예시는 NVIDIA 의 공식 문서 (CUTLASS Python README, CuTe DSL Programming Guide) 와 도메인 지식 기반.
CUTLASS C++ 코드를 한 번이라도 펼친 사람이라면 — 진입의 어려움이 어디서 오는지 안다. 그 어려움을 명시화한다.
using GemmT = cutlass::gemm::device::Gemm<...10 parameters...>; 같은 식.CuTe Python DSL 의 답 — 같은 추상을 그대로 Python 에 노출. C++ template 의 deep nesting 없이, 같은 layout / tensor / copy / mma 를 Python 객체로 직접 만지고, 컴파일은 즉시 (JIT) 도는 형태.
CuTe DSL 의 lowering 은 Python → MLIR (또는 CuTe IR) → PTX. JIT 라 컴파일 시간이 한 함수당 초 단위. C++ 의 분 단위와 비교 불가. 빠른 iteration 의 가장 큰 가치.
CuTe 의 추상은 — C++ 이든 Python 이든 — 네 가지 객체에 모인다. 이 넷의 의미를 한 번 박아두면 나머지가 펼쳐진다.
Layout 은 단순히 “이 텐서의 어떤 (i,j) 가 메모리의 어느 offset 에 있는가” 의 함수. CuTe 의 모든 magic 은 이 함수 자체를 1급 객체로 다룬다는 데서 옴. 예: Layout(Shape(M,N), Stride(N,1)) 은 row-major M×N 텐서.Tensor(ptr, layout). 차이는 — CuTe 의 Tensor 는 메모리 위치(GMEM, SMEM, RMEM) 를 type 차원에서 들고 있다. Tensor<float, GMEM, ...> 같이.m16n8k16 같은 모양과 그에 맞는 layout 이 함께 정의됨. TiledMMA 는 이 한 명령을 여러 thread / warp 에 분배하는 layout 매핑.이 네 객체로 한 GEMM 의 추상이 거의 다 표현된다 — “G/S/R memory 의 layout 들이 있고, 그 사이를 copy 가 stage 하고, 마지막에 MMA 가 누적” 의 그림.
CuTe 의 가장 큰 진입 장벽이자 가치 — layout algebra. 한 번 직관이 잡히면 같은 표기로 row-major, column-major, transposed, swizzled, blocked 가 모두 표현된다.
Stride=(1,4) 면 (i,j) → i + j·4. 같은 메모리에 다른 layout 을 씌우는 것이 transpose — 데이터 이동 없음. CuTe 의 가장 강력한 추상 중 하나.두 layout 의 합성 (composition), 분해 (compose / divide), tile 추출 (logical_divide), thread 분배 (zipped_divide) 등이 모두 정의된 algebra. L103 이 이 algebra 의 category-theoretic 해석을 깐다 — 같은 그림이 더 깊게 펼쳐진다.
강의의 핵심 데모가 정확히 이 자리. 같은 GEMM 을 — Triton 도 아니고 CUTLASS C++ 도 아니고 — CuTe Python DSL 로 짜는 시퀀스. 외부 자료로 재구성한 개념적 형태.
// 깊은 template 의 한 예
using GemmKernel = cutlass::gemm::collective::CollectiveBuilder<
cutlass::arch::Sm90,
cutlass::arch::OpClassTensorOp,
cutlass::half_t, LayoutA, AlignmentA,
cutlass::half_t, LayoutB, AlignmentB,
ElementAccumulator,
TileShape, ClusterShape,
cutlass::gemm::collective::StageCountAuto,
cutlass::gemm::collective::KernelScheduleAuto
>::CollectiveOp;
// 이걸 device::Gemm 에 한 번 더 wrap 하고...
// 메인 함수에서 args, workspace, smem 사이즈 까지 직접 셋업
import cutlass.cute as cute
@cute.kernel
def gemm(A, B, C,
tA: cute.TiledCopy,
tB: cute.TiledCopy,
tC: cute.TiledMMA):
bid_m = cute.block_idx(0)
bid_n = cute.block_idx(1)
# tile 추출 — layout algebra 로
gA = cute.local_tile(A, (BM, BK), (bid_m, _))
gB = cute.local_tile(B, (BN, BK), (bid_n, _))
gC = cute.local_tile(C, (BM, BN), (bid_m, bid_n))
sA = cute.make_smem_tensor(BM, BK)
sB = cute.make_smem_tensor(BN, BK)
rC = cute.make_reg_tensor(BM, BN)
for k in range(K // BK):
cute.copy(tA, gA[:,:,k], sA)
cute.copy(tB, gB[:,:,k], sB)
cute.cp_async_wait()
cute.gemm(tC, sA, sB, rC)
cute.copy(tC, rC, gC)
두 코드의 의도는 같다 — Hopper Tensor Core 위에서 fp16 GEMM 을 짜는 일. 차이는 표현의 두께. CuTe Python 은 같은 추상 (TiledCopy, TiledMMA, local_tile, copy) 을 명시적으로 다루지만 — template 의 깊이가 사라지고, JIT 로 빠르게 컴파일된다.
A: GMEM M × K ──tA──▶ sA: SMEM BM × BK
B: GMEM N × K ──tB──▶ sB: SMEM BN × BK
│
▼
tC (TiledMMA)
│
▼
rC: RMEM BM × BN
│
└──tC──▶ C: GMEM BM × BN
중요한 사실 한 가지 — CuTe Python DSL 이 만드는 PTX 는 CUTLASS C++ 가 만드는 PTX 와 같은 quality를 목표로 한다. 표면(C++ vs Python) 만 다르고, 깎은 결과는 같다는 게 디자인 의도. 그래서 production 에서 “Python DSL 로 짰는데 더 느리다” 같은 의외 없음.
각 lowering 단계의 IR 을 직접 dump 가능 (확인 필요 — CUTE_LOG_LEVEL 같은 환경변수). 학습 자료로도 가치 — 자기 코드가 어떤 PTX 명령으로 내려가는지 직접 본다.
L001 의 사다리에 한 칸이 추가된다 — torch → Triton → CuTe DSL → CUTLASS C++ → 직접 PTX. NCU 가 “이 명령으로 mma 의 layout 이 안 맞는다” 같은 hint 를 주면 Triton 으로 안 잡히는 자리 — CuTe 로 내려간다.
강의에서 Vicki 가 강조했을 입장 — CuTe DSL 은 Triton 의 대체가 아니라 보완. 두 도구가 사용자 표면 차원에서 같이 산다는 디자인.
cute.local_tile, cute.copy, cute.gemm 같은 정확한 함수 이름은 NVIDIA 공식 문서 확인 필요.이 노트는 슬라이드 PDF + 도메인 지식으로 재구성. 정확한 API, 정확한 lowering 경로, 정확한 사용 예시는 NVIDIA 의 공식 문서 (CUTLASS Python README, CuTe DSL Programming Guide) 에서 직접 확인. § 04 의 layout 그림은 row/column-major 의 일반적 정의로 정확하지만, hierarchical 형태의 정확한 표기는 CuTe 문서의 표기를 따라가야 한다.