Skip to content

Commit 19dfa37

Browse files
authored
Migrate LayoutTensor to TileTensor (#238)
* Migrate LayoutTensor to TileTensor * Replace LayoutTensor with TileTensor * Replace LayoutTensor with TileTensor * pixi run format * Simplify problems with two approaches * Prioritize TileTensor over UnsafePointer * complete partial migration in p23 * restore definition of terms * remove extraneous layout_tensor from anchor tags * remove debugging test file
1 parent d09bc3f commit 19dfa37

198 files changed

Lines changed: 4824 additions & 7392 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

book/i18n/ko/src/SUMMARY.md

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,17 @@
1212

1313
- [Puzzle 1: Map](./puzzle_01/puzzle_01.md)
1414
- [🔰 원시 메모리 방식](./puzzle_01/raw.md)
15-
- [💡 미리보기: LayoutTensor를 활용한 현대적 방식](./puzzle_01/layout_tensor_preview.md)
15+
- [💡 미리보기: TileTensor를 활용한 현대적 방식](./puzzle_01/tile_tensor_preview.md)
1616
- [Puzzle 2: Zip](./puzzle_02/puzzle_02.md)
1717
- [Puzzle 3: 가드](./puzzle_03/puzzle_03.md)
1818
- [Puzzle 4: 2D Map](./puzzle_04/puzzle_04.md)
1919
- [🔰 원시 메모리 방식](./puzzle_04/raw.md)
20-
- [📚 LayoutTensor 알아보기](./puzzle_04/introduction_layout_tensor.md)
21-
- [🚀 현대적 2D 연산](./puzzle_04/layout_tensor.md)
20+
- [📚 TileTensor 알아보기](./puzzle_04/introduction_tile_tensor.md)
21+
- [🚀 현대적 2D 연산](./puzzle_04/tile_tensor.md)
2222
- [Puzzle 5: 브로드캐스트](./puzzle_05/puzzle_05.md)
23-
- [🔰 원시 메모리 방식](./puzzle_05/raw.md)
24-
- [📐 LayoutTensor 버전](./puzzle_05/layout_tensor.md)
2523
- [Puzzle 6: 블록](./puzzle_06/puzzle_06.md)
2624
- [Puzzle 7: 2D 블록](./puzzle_07/puzzle_07.md)
27-
- [🔰 원시 메모리 방식](./puzzle_07/raw.md)
28-
- [📐 LayoutTensor 버전](./puzzle_07/layout_tensor.md)
2925
- [Puzzle 8: 공유 메모리](./puzzle_08/puzzle_08.md)
30-
- [🔰 원시 메모리 방식](./puzzle_08/raw.md)
31-
- [📐 LayoutTensor 버전](./puzzle_08/layout_tensor.md)
3226

3327
# Part II: 🐞 GPU 프로그램 디버깅
3428

@@ -44,11 +38,7 @@
4438
# Part III: 🧮 GPU 알고리즘
4539

4640
- [Puzzle 11: 풀링](./puzzle_11/puzzle_11.md)
47-
- [🔰 원시 메모리 방식](./puzzle_11/raw.md)
48-
- [📐 LayoutTensor 버전](./puzzle_11/layout_tensor.md)
4941
- [Puzzle 12: 내적](./puzzle_12/puzzle_12.md)
50-
- [🔰 원시 메모리 방식](./puzzle_12/raw.md)
51-
- [📐 LayoutTensor 버전](./puzzle_12/layout_tensor.md)
5242
- [Puzzle 13: 1D 합성곱](./puzzle_13/puzzle_13.md)
5343
- [🔰 기본 버전](./puzzle_13/simple.md)
5444
- [⭐ 블록 경계 버전](./puzzle_13/block_boundary.md)

book/i18n/ko/src/introduction.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ GPU 프로그래밍에서는 연산 자체보다 데이터를 옮기는 비용
157157

158158
- 스레드 인덱싱과 블록 구성 배우기
159159
- 메모리 접근 패턴과 가드 이해하기
160-
- 원시 포인터와 LayoutTensor 추상화 모두 다뤄보기
160+
- 원시 포인터와 TileTensor 추상화 모두 다뤄보기
161161
- 스레드 간 통신을 위한 공유 메모리 기초 익히기
162162

163163
**Part II: GPU 프로그램 디버깅 (퍼즐 9-10) ✅**
@@ -227,7 +227,7 @@ GPU 프로그래밍에서는 연산 자체보다 데이터를 옮기는 비용
227227
- AI 워크로드를 위한 텐서 코어 프로그래밍 배우기
228228
- 현대 GPU의 클러스터 프로그래밍 배우기
229229

230-
이 책은 기존 방식과 달리, 먼저 저수준 메모리 조작으로 이해를 쌓은 뒤 점진적으로 Mojo의 LayoutTensor 추상화로 전환합니다. 이를 통해 GPU 메모리 패턴에 대한 깊은 이해와 현대적 텐서 기반 접근법의 실용적 지식을 모두 얻을 수 있습니다.
230+
이 책은 기존 방식과 달리, 먼저 저수준 메모리 조작으로 이해를 쌓은 뒤 점진적으로 Mojo의 TileTensor 추상화로 전환합니다. 이를 통해 GPU 메모리 패턴에 대한 깊은 이해와 현대적 텐서 기반 접근법의 실용적 지식을 모두 얻을 수 있습니다.
231231

232232
## 시작할 준비가 되셨나요?
233233

book/i18n/ko/src/puzzle_01/puzzle_01.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@
3232

3333
직접 메모리를 다루며 GPU의 기본 원리를 익힙니다.
3434

35-
### [💡 미리보기: LayoutTensor를 활용한 현대적 방식](./layout_tensor_preview.md)
35+
### [💡 미리보기: TileTensor를 활용한 현대적 방식](./tile_tensor_preview.md)
3636

37-
LayoutTensor가 GPU 프로그래밍을 어떻게 단순화하는지 살펴봅니다. 더 안전하고 깔끔한 코드를 작성할 수 있습니다.
37+
TileTensor가 GPU 프로그래밍을 어떻게 단순화하는지 살펴봅니다. 더 안전하고 깔끔한 코드를 작성할 수 있습니다.
3838

3939
💡 ****: 두 방식을 모두 익히면 현대적인 GPU 프로그래밍 패턴을 더 깊이 이해할 수 있습니다.

book/i18n/ko/src/puzzle_01/layout_tensor_preview.md renamed to book/i18n/ko/src/puzzle_01/tile_tensor_preview.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<!-- i18n-source-commit: f614177b516e68590fa807e66e31c9f20488c7e7 -->
22

3-
## LayoutTensor를 고려해야 할까요?
3+
## TileTensor를 고려해야 할까요?
44

55
아래 기존 구현을 보면 몇 가지 잠재적인 문제를 발견할 수 있습니다:
66

@@ -32,17 +32,17 @@ idx = (batch * HEIGHT + row) * WIDTH + col
3232
idx = (batch * padded_height + row) * padded_width + col
3333
```
3434

35-
### LayoutTensor 미리보기
35+
### TileTensor 미리보기
3636

37-
[LayoutTensor](https://docs.modular.com/mojo/kernels/layout/layout_tensor/LayoutTensor/)를 사용하면 이런 경우를 훨씬 깔끔하게 처리할 수 있습니다:
37+
[TileTensor](https://docs.modular.com/mojo/kernels/layout/tile_tensor/TileTensor/)를 사용하면 이런 경우를 훨씬 깔끔하게 처리할 수 있습니다:
3838

3939
```mojo
4040
# 미리보기 - 지금은 이 문법을 몰라도 괜찮습니다!
4141
output[i, j] = a[i, j] + 10.0 # 2D 인덱싱
4242
output[b, i, j] = a[b, i, j] + 10.0 # 3D 인덱싱
4343
```
4444

45-
Puzzle 4에서 LayoutTensor를 자세히 배울 예정입니다. 그때 이 개념들이 필수가 됩니다. 지금은 다음 내용을 이해하는 데 집중하세요:
45+
Puzzle 4에서 TileTensor를 자세히 배울 예정입니다. 그때 이 개념들이 필수가 됩니다. 지금은 다음 내용을 이해하는 데 집중하세요:
4646

4747
- 기본 스레드 인덱싱
4848
- 간단한 메모리 접근 패턴

book/i18n/ko/src/puzzle_02/puzzle_02.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,4 +132,4 @@ expected: HostBuffer([0.0, 2.0, 4.0, 6.0])
132132
- 한 배열을 다른 배열에 브로드캐스트해야 한다면?
133133
- 여러 배열에서 병합(coalesced) 접근을 어떻게 보장할 수 있을까?
134134

135-
이러한 질문들은 Puzzle 4의 [LayoutTensor 알아보기](../puzzle_04/introduction_layout_tensor.md)에서 다룹니다.
135+
이러한 질문들은 Puzzle 4의 [TileTensor 알아보기](../puzzle_04/introduction_tile_tensor.md)에서 다룹니다.

book/i18n/ko/src/puzzle_03/puzzle_03.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,4 +160,4 @@ if i < height and j < width and k < depth and
160160
i >= padding and j >= padding: ...
161161
```
162162

163-
이런 경계 처리 패턴은 Puzzle 4의 [LayoutTensor 알아보기](../puzzle_04/introduction_layout_tensor.md)에서 배우면 훨씬 깔끔해집니다. LayoutTensor는 형태 관리 기능을 기본으로 제공합니다.
163+
이런 경계 처리 패턴은 Puzzle 4의 [TileTensor 알아보기](../puzzle_04/introduction_tile_tensor.md)에서 배우면 훨씬 깔끔해집니다. TileTensor는 형태 관리 기능을 기본으로 제공합니다.

book/i18n/ko/src/puzzle_04/introduction_layout_tensor.md renamed to book/i18n/ko/src/puzzle_04/introduction_tile_tensor.md

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
<!-- i18n-source-commit: 9ac1b899ca05c1be26f2d9ee77fe97503d00cc0f -->
22

3-
# LayoutTensor 알아보기
3+
# TileTensor 알아보기
44

55
퍼즐 풀이를 잠시 멈추고, GPU 프로그래밍을 더 즐겁게 만들어줄 강력한 추상화를 미리 살펴봅시다:
6-
🥁 ... 바로 **[LayoutTensor](https://docs.modular.com/mojo/kernels/layout/layout_tensor/LayoutTensor/)** 입니다.
6+
🥁 ... 바로 **[TileTensor](https://docs.modular.com/mojo/kernels/layout/tile_tensor/TileTensor/)** 입니다.
77

8-
> 💡 _LayoutTensor가 어떤 일을 할 수 있는지 맛보기로 살펴봅니다. 지금 모든 걸 이해할 필요는 없어요 - 퍼즐을 진행하면서 각 기능을 자세히 알아볼 겁니다_.
8+
> 💡 _TileTensor가 어떤 일을 할 수 있는지 맛보기로 살펴봅니다. 지금 모든 걸 이해할 필요는 없어요 - 퍼즐을 진행하면서 각 기능을 자세히 알아볼 겁니다_.
99
1010
## 문제: 점점 복잡해지는 코드
1111

@@ -32,44 +32,46 @@ if row < height and col < width:
3232
output[idx] = a[idx] + 10.0
3333
```
3434

35-
## 해결책: LayoutTensor 미리보기
35+
## 해결책: TileTensor 미리보기
3636

37-
LayoutTensor는 이런 문제들을 깔끔하게 해결해줍니다. 앞으로 배울 내용을 살짝 엿보면:
37+
TileTensor는 이런 문제들을 깔끔하게 해결해줍니다. 앞으로 배울 내용을 살짝 엿보면:
3838

3939
1. **자연스러운 인덱싱**: 수동 오프셋 계산 대신 `tensor[i, j]` 사용
4040
2. **유연한 메모리 레이아웃**: 행 우선, 열 우선, 타일 구성 지원
4141
3. **성능 최적화**: GPU에 효율적인 메모리 접근 패턴
4242

4343
## 앞으로 배울 내용 맛보기
4444

45-
LayoutTensor가 할 수 있는 일을 몇 가지 예시로 살펴봅시다. 지금 모든 세부 사항을 이해할 필요는 없습니다 - 앞으로 나올 퍼즐에서 각 기능을 꼼꼼히 다룰 거예요.
45+
TileTensor가 할 수 있는 일을 몇 가지 예시로 살펴봅시다. 지금 모든 세부 사항을 이해할 필요는 없습니다 - 앞으로 나올 퍼즐에서 각 기능을 꼼꼼히 다룰 거예요.
4646

4747
### 기본 사용 예시
4848

4949
```mojo
50-
from layout import Layout, LayoutTensor
50+
from layout import TileTensor
51+
from layout.tile_layout import row_major
5152
5253
# 레이아웃 정의
5354
comptime HEIGHT = 2
5455
comptime WIDTH = 3
55-
comptime layout = Layout.row_major(HEIGHT, WIDTH)
56+
comptime layout = row_major[HEIGHT, WIDTH]()
57+
comptime LayoutType = type_of(layout)
5658
5759
# 텐서 생성
58-
tensor = LayoutTensor[dtype, layout](buffer.unsafe_ptr())
60+
tensor = TileTensor(buffer, layout)
5961
6062
# 자연스럽게 요소 접근
6163
tensor[0, 0] = 1.0 # 첫 번째 요소
6264
tensor[1, 2] = 2.0 # 마지막 요소
6365
```
6466

65-
`Layout``LayoutTensor`에 대해 더 알아보려면 [Mojo 매뉴얼](https://docs.modular.com/mojo/manual/)의 가이드를 참고하세요:
67+
`Layout``TileTensor`에 대해 더 알아보려면 [Mojo 매뉴얼](https://docs.modular.com/mojo/manual/)의 가이드를 참고하세요:
6668

6769
- [Introduction to layouts](https://docs.modular.com/mojo/manual/layout/layouts)
68-
- [Using LayoutTensor](https://docs.modular.com/mojo/manual/layout/tensors)
70+
- [Using TileTensor](https://docs.modular.com/mojo/manual/layout/tensors)
6971

7072
## 간단한 예제
7173

72-
LayoutTensor의 기본을 보여주는 간단한 예제로 모든 것을 정리해봅시다:
74+
TileTensor의 기본을 보여주는 간단한 예제로 모든 것을 정리해봅시다:
7375

7476
```mojo
7577
{{#include ../../../../src/puzzle_04/intro.mojo}}
@@ -87,28 +89,28 @@ LayoutTensor의 기본을 보여주는 간단한 예제로 모든 것을 정리
8789
<div class="tab-content">
8890

8991
```bash
90-
pixi run layout_tensor_intro
92+
pixi run tile_tensor_intro
9193
```
9294

9395
</div>
9496
<div class="tab-content">
9597

9698
```bash
97-
pixi run -e amd layout_tensor_intro
99+
pixi run -e amd tile_tensor_intro
98100
```
99101

100102
</div>
101103
<div class="tab-content">
102104

103105
```bash
104-
pixi run -e apple layout_tensor_intro
106+
pixi run -e apple tile_tensor_intro
105107
```
106108

107109
</div>
108110
<div class="tab-content">
109111

110112
```bash
111-
uv run poe layout_tensor_intro
113+
uv run poe tile_tensor_intro
112114
```
113115

114116
</div>
@@ -130,7 +132,7 @@ After:
130132
3. 자연스러운 인덱싱으로 하나의 요소를 수정합니다
131133
4. 변경 사항이 출력에 반영됩니다
132134

133-
이 간단한 예제는 LayoutTensor의 핵심 장점을 보여줍니다:
135+
이 간단한 예제는 TileTensor의 핵심 장점을 보여줍니다:
134136

135137
- 텐서 생성과 접근을 위한 깔끔한 문법
136138
- 자동 메모리 레이아웃 처리
@@ -143,6 +145,6 @@ After:
143145
- 복잡한 타일링 전략
144146
- 하드웨어 가속 연산
145147

146-
LayoutTensor와 함께 GPU 프로그래밍 여정을 시작할 준비가 됐나요? 퍼즐로 들어가봅시다!
148+
TileTensor와 함께 GPU 프로그래밍 여정을 시작할 준비가 됐나요? 퍼즐로 들어가봅시다!
147149

148150
💡 ****: 진행하면서 이 예제를 기억해두세요 - 이 기본 개념을 바탕으로 점점 더 정교한 GPU 프로그램을 만들어갈 겁니다.

book/i18n/ko/src/puzzle_04/puzzle_04.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,12 @@
5151

5252
수동으로 메모리를 관리하면서 2D 인덱싱이 어떻게 동작하는지 알아봅니다.
5353

54-
### [📚 LayoutTensor 알아보기](./introduction_layout_tensor.md)
54+
### [📚 TileTensor 알아보기](./introduction_tile_tensor.md)
5555

5656
GPU에서 다차원 배열 연산과 메모리 관리를 간편하게 해주는 강력한 추상화를 소개합니다.
5757

58-
### [🚀 현대적 2D 연산](./layout_tensor.md)
58+
### [🚀 현대적 2D 연산](./tile_tensor.md)
5959

60-
자연스러운 2D 인덱싱과 자동 경계 검사를 갖춘 LayoutTensor를 직접 써봅니다.
60+
자연스러운 2D 인덱싱과 자동 경계 검사를 갖춘 TileTensor를 직접 써봅니다.
6161

62-
💡 **참고**: 이 퍼즐부터는 더 깔끔하고 안전한 GPU 코드를 위해 LayoutTensor를 주로 사용합니다.
62+
💡 **참고**: 이 퍼즐부터는 더 깔끔하고 안전한 GPU 코드를 위해 TileTensor를 주로 사용합니다.

book/i18n/ko/src/puzzle_04/layout_tensor.md renamed to book/i18n/ko/src/puzzle_04/tile_tensor.md

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,35 @@
11
<!-- i18n-source-commit: db06539cab77774402e8a4bf955018fd853803d9 -->
22

3-
# LayoutTensor 버전
3+
# TileTensor 버전
44

55
## 개요
66

7-
2D _LayoutTensor_ `a`의 각 위치에 10을 더해 2D _LayoutTensor_ `output`에 저장하는 커널을 구현해 보세요.
7+
2D _TileTensor_ `a`의 각 위치에 10을 더해 2D _TileTensor_ `output`에 저장하는 커널을 구현해 보세요.
88

99
**참고**: _스레드 수가 행렬의 위치 수보다 많습니다_.
1010

1111
## 핵심 개념
1212

1313
이 퍼즐에서 배울 내용:
1414

15-
- 2D 배열 접근에 `LayoutTensor` 사용하기
15+
- 2D 배열 접근에 `TileTensor` 사용하기
1616
- `tensor[i, j]`로 직접 2D 인덱싱하기
17-
- `LayoutTensor`에서 경계 검사 처리하기
17+
- `TileTensor`에서 경계 검사 처리하기
1818

19-
핵심은 `LayoutTensor`가 자연스러운 2D 인덱싱 인터페이스를 제공하여 내부 메모리 레이아웃을 추상화한다는 점입니다. 그러면서도 경계 검사는 여전히 필요합니다.
19+
핵심은 `TileTensor`가 자연스러운 2D 인덱싱 인터페이스를 제공하여 내부 메모리 레이아웃을 추상화한다는 점입니다. 그러면서도 경계 검사는 여전히 필요합니다.
2020

21-
- **2D 접근**: `LayoutTensor`로 자연스러운 \\((i,j)\\) 인덱싱
21+
- **2D 접근**: `TileTensor`로 자연스러운 \\((i,j)\\) 인덱싱
2222
- **메모리 추상화**: 수동 행 우선 계산 불필요
2323
- **가드 조건**: 두 차원 모두 경계 검사 필요
2424
- **스레드 범위**: 스레드 \\((3 \times 3)\\)가 텐서 원소 \\((2 \times 2)\\)보다 많음
2525

2626
## 완성할 코드
2727

2828
```mojo
29-
{{#include ../../../../../problems/p04/p04_layout_tensor.mojo:add_10_2d_layout_tensor}}
29+
{{#include ../../../../../problems/p04/p04_tile_tensor.mojo:add_10_2d_tile_tensor}}
3030
```
3131

32-
<a href="{{#include ../_includes/repo_url.md}}/blob/main/problems/p04/p04_layout_tensor.mojo" class="filename">전체 코드 보기: problems/p04/p04_layout_tensor.mojo</a>
32+
<a href="{{#include ../_includes/repo_url.md}}/blob/main/problems/p04/p04_tile_tensor.mojo" class="filename">전체 코드 보기: problems/p04/p04_tile_tensor.mojo</a>
3333

3434
<details>
3535
<summary><strong>팁</strong></summary>
@@ -57,28 +57,28 @@
5757
<div class="tab-content">
5858

5959
```bash
60-
pixi run p04_layout_tensor
60+
pixi run p04_tile_tensor
6161
```
6262

6363
</div>
6464
<div class="tab-content">
6565

6666
```bash
67-
pixi run -e amd p04_layout_tensor
67+
pixi run -e amd p04_tile_tensor
6868
```
6969

7070
</div>
7171
<div class="tab-content">
7272

7373
```bash
74-
pixi run -e apple p04_layout_tensor
74+
pixi run -e apple p04_tile_tensor
7575
```
7676

7777
</div>
7878
<div class="tab-content">
7979

8080
```bash
81-
uv run poe p04_layout_tensor
81+
uv run poe p04_tile_tensor
8282
```
8383

8484
</div>
@@ -97,7 +97,7 @@ expected: HostBuffer([10.0, 11.0, 12.0, 13.0])
9797
<summary></summary>
9898

9999
```mojo
100-
{{#include ../../../../../solutions/p04/p04_layout_tensor.mojo:add_10_2d_layout_tensor_solution}}
100+
{{#include ../../../../../solutions/p04/p04_tile_tensor.mojo:add_10_2d_tile_tensor_solution}}
101101
```
102102

103103
<div class="solution-explanation">
@@ -106,7 +106,7 @@ expected: HostBuffer([10.0, 11.0, 12.0, 13.0])
106106

107107
- `row = thread_idx.y`, `col = thread_idx.x`로 2D 스레드 인덱스를 가져옴
108108
- `if row < size and col < size`로 범위를 벗어난 접근 방지
109-
- `LayoutTensor`의 2D 인덱싱 사용: `output[row, col] = a[row, col] + 10.0`
109+
- `TileTensor`의 2D 인덱싱 사용: `output[row, col] = a[row, col] + 10.0`
110110

111111
</div>
112112
</details>

0 commit comments

Comments
 (0)