《GPU Mode》
L103
2025 · CuTe Layout Algebra
High priority
transcript · failed
Fundamentals of CuTe Layout Algebra and Category-theoretic Interpretation
CuTe 의 layout 추상이 — “좌표를 index 로 보내는 함수” — 라는 단순한 정의 위에서, composition · divide · product · complement 의 algebraic 인 패턴이 어떻게 자연스럽게 나오는가. 그리고 그 algebra 가 category 의 morphism 으로 보일 때 mainloop / epilogue / swizzle / thread mapping 이 같은 언어로 통합된다는 시각. Jack Carlisle 과 Jay Shah (FlashAttention-3 author) 가 NVIDIA / Colfax 의 정리 위에서 같은 자료를 — paper-level 의 정확성으로 — 풀어가는 학습 노트. 슬라이드는 repo 에 동반.
CuTe
Layout
Shape · Stride
composition
divide
product
complement
swizzle
category
functor
JC
Speakers
Jack Carlisle · Jay Shah
Colfax Research · FlashAttention-3 author lineage
§ 01강의가 풀려는 문제· 왜 layout 을 algebra 로
“tile size 를 바꿨더니 swizzle 이 깨진다” 는 왜 일어나는가
CUTLASS 3.x / CuTe 의 코드를 처음 만나면 — layout 이 곳곳에 퍼져 있다. mainloop 의 SMEM tile, epilogue 의 store, threadblock 의 partition, MMA 의 thread layout. 같은 추상이지만 매번 모양이 달라 보인다. 이 강의가 풀려는 문제 — 이 모든 자리에서의 layout 이 “같은 algebra” 로 통합된다는 사실을 정확히 보이는 것.
강의가 던지는 두 개의 질문.
- layout 의 algebra 가 정확히 무엇인가 — 함수의 합성과 분해라는 frame 이 어디까지 정확하게 적용되는가.
- 그 algebra 가 “수학적으로 옳다” 는 것의 의미는 무엇인가 — category-theoretic 시각이 어떻게 layout algebra 의 일관성을 보장하는가.
강의의 인지적 frame
CuTe 의 코드는 — 일견 ad-hoc 한 type-level template 의 모음으로 보이지만 — 한 일관된 algebra 의 표현이다. 그 algebra 를 명시적으로 정리하면, 매번 헷갈리는 “mode”, “coalesce”, “divide” 가 모두 자연스럽게 자리잡는다.
“CuTe 가 어렵다고 느끼는 사람의 90% 는 — code 를 보고 algebra 를 보지 않는다. algebra 가 잡히면 code 는 표기일 뿐.”학습 노트
강의의 두 부분. 첫 번째 — algebra 자체 (§ 02–06). 두 번째 — category 의 시각 (§ 07). 첫 부분이 충분히 가치 있으므로 두 번째에 압도되지 않고 따라가는 게 좋은 학습 전략.
§ 02layout = 함수· Shape × Stride → ℕ
모든 layout 추상의 출발점 한 줄
CuTe 의 한 줄 정의 — Layout = (Shape, Stride). Shape 가 좌표 공간, Stride 가 좌표를 자연수로 mapping 하는 가중치. Layout(c) 는 좌표 c 를 받아 메모리 index 를 돌려주는 함수.
EX 01 · row-major 4×8
Layout = (4,8) : (8,1)
좌표 (i, j) ↦ 8·i + 1·j. 자연 좌표 그대로 row-major.
(0,0) → 0 (0,1) → 1 ... (0,7) → 7
(1,0) → 8 (1,1) → 9 ... (1,7) → 15
...
(3,0) → 24 ... (3,7) → 31
stride 표기는 각 mode 별 곱셈 가중치. 함수는 inner product.
EX 02 · col-major 4×8
Layout = (4,8) : (1,4)
좌표 (i, j) ↦ 1·i + 4·j. 같은 shape, 다른 stride. col-major.
(0,0) → 0 (1,0) → 1 ... (3,0) → 3
(0,1) → 4 (1,1) → 5 ... (3,1) → 7
...
(0,7) → 28 ... (3,7) → 31
메모리 안의 같은 32 element 가 — 두 layout 의 시점에서 다르게 보인다. 함수가 다를 뿐.
FIG · 같은 32 element, 두 layout 의 좌표 gridrow-major (left) · col-major (right)
row-major (4,8):(8,1)
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
col-major (4,8):(1,4)
0
4
8
12
16
20
24
28
1
5
9
13
17
21
25
29
2
6
10
14
18
22
26
30
3
7
11
15
19
23
27
31
메모리는 같다. 좌표 (1, 2) 가 — 왼쪽에서는 10, 오른쪽에서는 9 — 다른 index 를 가리킨다. layout 은 좌표의 의미를 결정한다.
정의의 형식적 형태
Shape S = (s₁, s₂, ..., sₖ) 와 Stride D = (d₁, d₂, ..., dₖ) 가 주어졌을 때 — Layout L: ∏ ℤ_{sᵢ} → ℕ, L(c₁, ..., cₖ) = Σ cᵢ · dᵢ. 모든 algebra 는 이 함수의 합성과 분해.
Shape 와 Stride 자체가 tuple 이라는 점이 중요. 단순한 정수가 아니라 — nested tuple — 도 가능. 그 자리가 hierarchical layout 의 entry point (§ 04).
§ 03mode / divide / coalesce 의 의미· 기본 연산
algebra 의 5 가지 기본 연산
layout 의 algebra 는 — 5 개의 핵심 연산으로 거의 모두 표현된다. 각 연산이 함수의 합성/분해/제한 중 어느 것의 표현인지를 명시적으로 잡으면 직관이 단단해진다.
mode
layout 의 한 차원. (M, N) : (sM, sN) 의 M 차원과 N 차원이 각자 mode. mode 단위로 따로 연산할 수 있는 수준의 분리.
layout<0>((4,8):(8,1)) = 4:8
coalesce
호환 가능한 mode 들을 합쳐 더 단순한 layout 으로. 함수는 그대로지만 표기가 단순해짐. (s₁, s₂):(d₁, d₂) 가 d₂ = s₁ · d₁ 이면 (s₁·s₂):d₁ 로.
(_2,_4):(_1,_2) → _8:_1
composition
함수의 합성. R(c) = A(B(c)). layout B 를 먼저 적용해 좌표를 layout A 의 좌표로 보내고, A 가 index 를 돌려준다. 기하학적으로 — “B 의 모양을 A 위에 놓는다”.
A ∘ B
complement
한 layout 이 채우지 않은 자리. 전체 size N 안에서 layout B 가 차지한 stride 위치 외의 stride 를 채우는 layout. divide 의 짝.
B* = complement(B, N)
logical_divide
tile 로 자르기. A ÷ B := A ∘ (B, B*). layout A 안에서 B 의 모양을 “건드리는 좌표” 로 분리, 나머지를 “안 건드리는 좌표” 로. tiling 의 정식 정의.
A ÷ B
logical_product
한 layout 을 다른 layout 의 모양대로 복제. A ⊗ B := (A, A* ∘ B). tile 의 grid 를 만들 때.
A ⊗ B
실전에서 자주 쓰는 wrapper — blocked_product, raked_product, zipped_divide, tiled_divide. 모두 logical_product / logical_divide 의 변형으로, mode 의 순서나 grouping 만 다르다.
학습 trick
각 연산이 “layout 함수의 무엇을 변경하는가” 를 한 줄로 정리한다. coalesce — 표기만 변경, 함수 동일. composition — 함수 합성. divide — 좌표 공간을 두 직교 부분으로 분해. product — 좌표 공간을 외적으로 확장. complement — 빈 자리.
§ 04hierarchical layout· 중첩 좌표
“tile of tiles” 가 자연스럽게 나오는 자리
CuTe 의 가장 큰 unique selling point — hierarchical layout. Shape 가 단순 tuple 이 아니라 nested tuple 일 수 있다. ((2,2), (2,2)) : ((4,1), (8,2)) 같은 모양. 좌표도 같은 모양으로 nested.
예시 · 4×4 의 두 가지 hierarchical 표현
flat: (4,4):(4,1)
단순 row-major. 좌표 (i, j), index = 4i + j.
hier: ((2,2),(2,2)):((8,2),(4,1))
2×2 의 outer block 안에 2×2 의 inner block. 좌표 ((I, i), (J, j)), index = 8I + 2i + 4J + j.
이걸 8 으로 나눠 보면:
8I + 4J + 2i + j
↑outer↑ ↑inner↑
왜 hierarchical 이 필요한가
tile of tiles · WGMMA shape
Hopper 의 WGMMA 는 — m64n*k16 같은 native shape 가 있다. 하나의 GEMM 의 큰 tile 안에 — WGMMA 의 작은 tile 이 — 그 안에 thread layout 이 — 다층으로 들어간다.
flat layout 으로는 이 nesting 을 표현하지 못한다. hierarchical 좌표가 자연스럽다.
algebra 의 일관성 — divide, product 모두 hierarchical layout 위에서 정의가 그대로. 추상이 깨지지 않는다.
hierarchical layout 의 좌표 형태는 — natural coordinate (nested tuple, 모양이 Shape 를 따름) 또는 — 1-D coordinate (단일 정수, colexicographic 순서). 두 형태가 자유롭게 변환 가능. 실전 코드에서 한 자리에 한 형태로 통일.
“hierarchical layout 은 같은 algebra 의 더 풍부한 도메인 일 뿐. 새 추상이 아니라 같은 추상의 자연스러운 확장.”학습 노트
§ 05swizzle 의 표현· XOR-based 와 함수합성
SMEM bank conflict 회피의 algebra 적 의미
SMEM 의 32-bank 구조는 — 같은 bank 의 32 thread access 가 동시에 일어나면 32× slowdown. 이걸 피하기 위한 swizzle 은 — 좌표를 “섞는” 함수. CuTe 에서는 swizzle 도 layout 의 합성으로 표현된다.
FIG · 8×8 SMEM tile 위 두 시나리오 (8 bank simulation)row-access pattern
naive layout
bank id mod 8
naive col
8 thread → 같은 bank 0
swizzled
addr ⊕ (row[lo3])<<0
naive 에서 column access 가 모두 bank 0 으로 collide (32× slowdown). swizzled 에서는 같은 column 이 — XOR 으로 — 서로 다른 bank 로 분산. swizzle 은 좌표를 비트 XOR 로 permute 하는 함수.
CuTe 의 Swizzle 표현
CuTe 는 swizzle 을 — Swizzle<B, M, S> 의 type 으로 표현. B = swizzle bits, M = mask 비트 시작, S = shift. 이 셋이 하나의 XOR 연산을 정의.
핵심 — Swizzle 도 layout 함수. 좌표 → 좌표 (또는 index → index) 의 함수. 일반 layout 과 합성 가능.
가장 흔한 setup — Swizzle<3, 0, 3> 또는 Swizzle<5, 0, 5> (8-bank, 32-bank). 32-bank 는 modern NVIDIA SM 의 표준.
왜 합성이 깔끔한가
SMEM 위에 layout 을 둘 때 — logical layout (사용자가 보는 좌표) ∘ swizzle (bank conflict 해결) 의 합성으로 본다. 사용자는 logical 좌표만 신경 쓰고, hardware 는 swizzle 을 흡수.
이 합성이 — algebra 안에서 그저 한 layout 의 다른 layout 과의 composition 일 뿐. 새 추상이 추가되지 않는다.
L101 § 05 와의 연결
Hopper mainloop 의 SMEM tile 은 거의 항상 swizzled. CuTe algebra 안에서 — tile shape × swizzle 의 composed layout 으로 한 자리에 표현된다. 이 시각이 잡히면 mainloop 코드의 SmemLayoutA 류 type 이 자연스럽게 읽힌다.
§ 06thread mapping· partition_S/D · TiledMMA
같은 algebra 가 thread 분배에서도 그대로 쓰인다
SMEM tile 의 layout 만 algebra 의 자리가 아니다. thread 가 tile 의 어느 element 를 담당하는가 도 같은 algebra. partition_S (source-partition), partition_D (destination-partition) 가 그 표현.
tile 위 thread mapping
tile = 16×16, threads = 32
한 warp (32 thread) 가 16×16 = 256 element 를 담당. 한 thread 가 8 element. thread layout 이 어떻게 element 를 분배하는가가 layout 으로 표현.
ThreadLayout = (32) : (1)
TiledShape = (16, 16)
partition = TiledShape ÷ ThreadLayout
= ((4, 16), 32)
= thread 안 좌표 4×16 = 8/thread × 8 (?)
실제 partition 의 결과는 (thread, value) 쌍의 hierarchical layout. divide 의 직접 응용.
TiledMMA · TiledCopy
collective MMA 와 copy 의 layout 합성
CuTe 의 TiledMMA 는 — atom MMA (작은 native instruction) 위에 — 사용자 tile 을 어떻게 분배할지를 layout 합성으로 표현.
예: TiledMMA = MMAAtom ⊗ AtomLayout — MMA atom 을 atom layout 의 모양대로 외적 product.
thread mapping, MMA tiling, copy tiling 모두 같은 algebra (divide / product). 한 번 algebra 가 잡히면 세 자리가 동시에 풀린다.
이 시각이 잡히면 — local_tile, partition_S, tiled_divide 같은 CuTe API 들이 모두 같은 algebra 의 다른 사용자 친화 wrapper 라는 사실이 명확해진다. 새 함수마다 외울 게 아니라 — “이 함수는 divide 의 무엇을 wrap 한 것인가” 의 시각으로.
§ 07mathematical correctness· category 의 시각
“수학적으로 옳다” 는 구체적으로 무슨 뜻인가
강의의 두 번째 절반. layout 의 algebra 가 — category (범주) 의 morphism 으로 보일 때 — 모든 연산의 일관성이 자연스럽게 따라온다는 시각. 카테고리 이론 백그라운드 없는 사람도 핵심만 잡을 수 있도록 절제된 정리.
CATEGORY
Layouts as objects
layout 자체가 한 object. 한 layout 은 좌표 공간 (Shape) + 그 위의 함수 (Stride 결정).
MORPHISM
Composition
layout A 에서 layout B 로의 morphism = composition. A ∘ B 가 결합법칙 성립. identity 가 L₀ = (1):(0).
FUNCTOR
Tile / partition
한 layout 카테고리에서 — divide 와 product 가 — 카테고리간의 functor 처럼 작동. divide(L, _) 가 한 functor.
ADJUNCTION
Divide ⊣ Product
divide 와 product 가 dual 관계. “잘랐다 다시 합치면 원본” 의 algebra 적 표현. complement 가 그 사이의 연결.
UNIVERSAL PROP.
Coalesce
coalesce 가 가장 단순한 동치 layout 을 만든다. categorical 의미에서 — 한 동치류의 normal form 또는 “initial / canonical” representative.
NATURALITY
Hierarchical 의 일관성
flat layout 에서 정의된 algebra 가 hierarchical 로 자연스럽게 lift. 추상이 “자연스럽게 호환” 한다는 게 categorical 의미에서 natural transformation.
왜 이 시각이 가치 있는가
두 가지 — (1) 일관성의 보장: 새 연산이 추가될 때, 그것이 카테고리의 의미에서 well-defined 인가를 묻는 게 — implementation 의 corner case 를 사전에 잡는 길. (2) 학습의 절제: ad-hoc 한 trick 의 모음이 아니라 — 작은 universal property 로부터 모두 따라온다는 시각이 학습 부담을 줄인다.
주의 — 이 시각이 implementation 을 더 빠르게 만들지는 않는다. CuTe 의 implementation 은 type-level template 으로 정해진 형태가 있고, category 시각은 그 형태가 왜 그러한지 의 답일 뿐. 강의의 메시지도 동일 — “code 를 짤 때 카테고리를 항상 의식할 필요는 없지만, 막혔을 때 카테고리 시각이 길을 보여준다”.
“이 algebra 가 단순히 ‘잘 정의됨’ 의 의미를 넘어 — 어떻게 통합되는가의 답이 카테고리 안에 있다.”학습 노트 · 강의의 입장 추정
§ 08학습 자료· 읽는 순서
이 강의 + 자료들의 읽는 path
L103 자체가 자료의 합성이고 — 그 자료들을 어떤 순서로 읽으면 가장 효율적인지가 강의의 부수적 가치.
- CUTLASS 의 cute/00_quickstart.md — Layout = (Shape, Stride) 의 30분 자료. 가장 작은 entry.
- cute/01_layout.md — coordinate mapping, hierarchical, integer types. 1 시간.
- cute/02_layout_algebra.md — composition / divide / product / complement 의 정의. 1–2 시간.
- L103 슬라이드 (layout_algebra.pdf) — 같은 자료의 정리, category 시각 추가.
- Colfax — Tutorial: Matrix Transpose in CUTLASS — algebra 가 swizzle 위에서 어떻게 작동하는가의 구체.
- Jay Shah — “A note on the algebra of CuTe Layouts” — paper-level 정리. category 시각의 깊이 보충.
- L057 — CuTe — 다른 발표자 (Jay Shah) 의 더 가벼운 introduction. 보충 시각.
- L086 — FlashAttention 3 — algebra 가 production 코드에 어떻게 들어가는가. 응용.
- L101 — Learning CUTLASS — algebra 위에 build 된 mainloop 의 hierarchy.
- NVIDIA cutlass example/cute — 실제 코드. transpose / sgemm / FA3.
학습 함정
L103 의 category 부분만 따로 떼어내서 — “category theory 부터” 시작하면 어렵다. algebra 를 먼저 (§ 02–06), category 는 마지막 (§ 07). 강의 자체도 같은 순서.
§ 09한계· algebra 가 못 잡는 자리
“layout algebra 가 모든 GPU 코드를 표현하는가” — 답은 No
- data dependent control flow — predication 이 compile-time 으로 결정되지 않으면 layout algebra 의 표현 영역 밖. attention 의 causal mask 같은 자리가 부분적으로 해당.
- dynamic shape — Shape 가 compile-time constant 가 아니면 — 같은 algebra 가 그대로 적용되지만 type-level 의 모든 결정이 runtime 으로 옮겨가 효율이 떨어진다.
- async pipeline 의 sequencing — “이 stage 가 끝나면 다음 stage 가 시작” 같은 dependency 는 layout 의 영역이 아니라 scheduling 의 영역.
- register allocation — 같은 layout 이라도 — register 에 어떻게 매핑되는가는 — compiler / SASS 의 결정. layout algebra 가 직접 통제하지 않는다.
- numerical correctness — algebra 는 “좌표 → index” 의 일관성만 보장. 결과의 numerics 는 algebra 밖.
- cross-CTA collective — TMA multicast 같은 cross-CTA 통신은 — layout 의 stride 만으로 표현하기 어렵다. 추가 추상이 필요.
이 한계들은 “algebra 가 잘못됐다” 는 의미가 아니라 — “이 algebra 는 layout 의 자리만 다룬다” 는 사실. mainloop 의 dependency, async barrier, scheduling 은 다른 추상의 영역이고, 그 영역들과 layout algebra 가 합쳐져 한 GEMM kernel 을 이룬다.
§ 10기억할 메모· key takeaways · refs
다시 열었을 때 5분 안에 손에 잡혀야 할 것
Layout = 함수
(Shape, Stride) → ℕ. 좌표를 받아 index 를 돌려준다. 모든 algebra 는 이 함수의 합성/분해.
5 기본 연산
coalesce (표기 단순화), composition (∘), complement (빈 자리), logical_divide (tile 자르기), logical_product (tile grid).
Hierarchical
Shape 가 nested tuple 가능. tile of tiles 가 자연스럽게 표현. algebra 가 변형 없이 lift.
Swizzle = layout
SMEM bank 충돌 회피의 XOR-based 함수. 일반 layout 과 합성. SmemLayout = LogicalLayout ∘ Swizzle.
Thread mapping
partition_S / partition_D / TiledMMA. 같은 algebra 의 thread 분배 응용. divide 의 직접 응용.
Category 시각
layout 이 object, composition 이 morphism, divide ⊣ product 의 adjunction. 일관성의 수학적 보장.
Algebra 의 한계
data-dependent flow, async sequencing, register allocation, cross-CTA collective 는 영역 밖. 다른 추상과 결합.
학습 path
algebra 먼저, category 마지막. quickstart → 01_layout → 02_algebra → L057 → L103 → FA3 example.
손에 새기기 — 실습 시퀀스
- 좌표 → index 직접 계산 — 5 개 layout (flat / hier / swizzled) 각각의 좌표를 손으로 메모리 grid 에 그려본다. 함수의 직관 형성.
- composition 손계산 — A=(4,4):(4,1), B=(2,2):(2,1) 의 A ∘ B 를 손으로. crd2idx 로 검증.
- logical_divide 의 결과 파악 — A=(8,8):(8,1), B=(4,4):(8,1) 의 A ÷ B 가 어떤 모양인지. CuTe 의
print_layout 으로 검증.
- swizzle 의 효과 시각화 — 8×8 SMEM 위 naive vs Swizzle<3,0,3> 의 bank id 분포를 직접 그린다.
- partition_S 의 결과 따라가기 — 16×16 tile 위 32 thread layout 의 partition 결과가 (thread, value) 쌍으로 어떻게 나오는지 손으로.
- TiledMMA 코드 읽기 — CUTLASS example 의 한 GEMM 의 TiledMMA 를 — atom + atom_layout 의 product 로 분해해 읽기.
- category 의 한 ax. 검증 — divide 후 product 가 원본을 복원하는 한 케이스를 손으로 확인. adjunction 의 직관.
§ 11다른 강의로 이어지는 길· connections
L103 의 algebra 가 다른 강의들에서 어떻게 활용되는가
§ 12열린 질문· open questions
다음에 다시 들었을 때 직접 검증해야 할 것들
- category 시각의 정확한 statement — 강의에서 어떤 universal property / functoriality 를 정확하게 statement 했는지 — slide 본문 확인 필요. (확인 필요)
- divide 와 product 의 adjunction 의 정식 형태 — 강의가 categorical adjunction 을 정식으로 statement 했는지, 또는 metaphor 로만 사용했는지. (확인 필요)
- complement 의 universal property — “unique up to iso” 류의 정식 statement 가 있었는지. (확인 필요)
- 구체적 worked example — Hopper WGMMA 의 한 case 를 슬라이드에서 직접 풀었는지. (확인 필요)
- L057 vs L103 의 분담 — Jay Shah 가 두 강의에 모두 참여했다는 가정 하에, 두 강의의 깊이 차이의 정확한 형태. (확인 필요)
- Layout 위 operation 의 complete list — 강의에서 정리한 operation 의 정확한 갯수 / 분류. (확인 필요)
검증 메모
이 노트의 algebra 정의 (§ 02–06) 는 CUTLASS 의 cute/00–02 docs 와 Colfax tutorial 시리즈로부터 정리. category 시각 (§ 07) 은 — 강의 슬라이드의 category-theoretic interpretation 부분과 일반적 category 의 vocabulary 를 합쳐 일반화. 강의의 정확한 statement (universal property, adjunction 의 정식 형태) 는 slide PDF 본문 정독 필요.