Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 3 additions & 13 deletions book/i18n/ko/src/SUMMARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,23 +12,17 @@

- [Puzzle 1: Map](./puzzle_01/puzzle_01.md)
- [🔰 원시 메모리 방식](./puzzle_01/raw.md)
- [💡 미리보기: LayoutTensor를 활용한 현대적 방식](./puzzle_01/layout_tensor_preview.md)
- [💡 미리보기: TileTensor를 활용한 현대적 방식](./puzzle_01/tile_tensor_preview.md)
- [Puzzle 2: Zip](./puzzle_02/puzzle_02.md)
- [Puzzle 3: 가드](./puzzle_03/puzzle_03.md)
- [Puzzle 4: 2D Map](./puzzle_04/puzzle_04.md)
- [🔰 원시 메모리 방식](./puzzle_04/raw.md)
- [📚 LayoutTensor 알아보기](./puzzle_04/introduction_layout_tensor.md)
- [🚀 현대적 2D 연산](./puzzle_04/layout_tensor.md)
- [📚 TileTensor 알아보기](./puzzle_04/introduction_tile_tensor.md)
- [🚀 현대적 2D 연산](./puzzle_04/tile_tensor.md)
- [Puzzle 5: 브로드캐스트](./puzzle_05/puzzle_05.md)
- [🔰 원시 메모리 방식](./puzzle_05/raw.md)
- [📐 LayoutTensor 버전](./puzzle_05/layout_tensor.md)
- [Puzzle 6: 블록](./puzzle_06/puzzle_06.md)
- [Puzzle 7: 2D 블록](./puzzle_07/puzzle_07.md)
- [🔰 원시 메모리 방식](./puzzle_07/raw.md)
- [📐 LayoutTensor 버전](./puzzle_07/layout_tensor.md)
- [Puzzle 8: 공유 메모리](./puzzle_08/puzzle_08.md)
- [🔰 원시 메모리 방식](./puzzle_08/raw.md)
- [📐 LayoutTensor 버전](./puzzle_08/layout_tensor.md)

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

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

- [Puzzle 11: 풀링](./puzzle_11/puzzle_11.md)
- [🔰 원시 메모리 방식](./puzzle_11/raw.md)
- [📐 LayoutTensor 버전](./puzzle_11/layout_tensor.md)
- [Puzzle 12: 내적](./puzzle_12/puzzle_12.md)
- [🔰 원시 메모리 방식](./puzzle_12/raw.md)
- [📐 LayoutTensor 버전](./puzzle_12/layout_tensor.md)
- [Puzzle 13: 1D 합성곱](./puzzle_13/puzzle_13.md)
- [🔰 기본 버전](./puzzle_13/simple.md)
- [⭐ 블록 경계 버전](./puzzle_13/block_boundary.md)
Expand Down
4 changes: 2 additions & 2 deletions book/i18n/ko/src/introduction.md
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ GPU 프로그래밍에서는 연산 자체보다 데이터를 옮기는 비용

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

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

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

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

Expand Down
4 changes: 2 additions & 2 deletions book/i18n/ko/src/puzzle_01/puzzle_01.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@

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

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

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

💡 **팁**: 두 방식을 모두 익히면 현대적인 GPU 프로그래밍 패턴을 더 깊이 이해할 수 있습니다.
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<!-- i18n-source-commit: f614177b516e68590fa807e66e31c9f20488c7e7 -->

## 왜 LayoutTensor를 고려해야 할까요?
## 왜 TileTensor를 고려해야 할까요?

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

Expand Down Expand Up @@ -32,17 +32,17 @@ idx = (batch * HEIGHT + row) * WIDTH + col
idx = (batch * padded_height + row) * padded_width + col
```

### LayoutTensor 미리보기
### TileTensor 미리보기

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

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

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

- 기본 스레드 인덱싱
- 간단한 메모리 접근 패턴
Expand Down
2 changes: 1 addition & 1 deletion book/i18n/ko/src/puzzle_02/puzzle_02.md
Original file line number Diff line number Diff line change
Expand Up @@ -132,4 +132,4 @@ expected: HostBuffer([0.0, 2.0, 4.0, 6.0])
- 한 배열을 다른 배열에 브로드캐스트해야 한다면?
- 여러 배열에서 병합(coalesced) 접근을 어떻게 보장할 수 있을까?

이러한 질문들은 Puzzle 4의 [LayoutTensor 알아보기](../puzzle_04/introduction_layout_tensor.md)에서 다룹니다.
이러한 질문들은 Puzzle 4의 [TileTensor 알아보기](../puzzle_04/introduction_tile_tensor.md)에서 다룹니다.
2 changes: 1 addition & 1 deletion book/i18n/ko/src/puzzle_03/puzzle_03.md
Original file line number Diff line number Diff line change
Expand Up @@ -160,4 +160,4 @@ if i < height and j < width and k < depth and
i >= padding and j >= padding: ...
```

이런 경계 처리 패턴은 Puzzle 4의 [LayoutTensor 알아보기](../puzzle_04/introduction_layout_tensor.md)에서 배우면 훨씬 깔끔해집니다. LayoutTensor는 형태 관리 기능을 기본으로 제공합니다.
이런 경계 처리 패턴은 Puzzle 4의 [TileTensor 알아보기](../puzzle_04/introduction_tile_tensor.md)에서 배우면 훨씬 깔끔해집니다. TileTensor는 형태 관리 기능을 기본으로 제공합니다.
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
<!-- i18n-source-commit: 9ac1b899ca05c1be26f2d9ee77fe97503d00cc0f -->

# LayoutTensor 알아보기
# TileTensor 알아보기

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

> 💡 _LayoutTensor가 어떤 일을 할 수 있는지 맛보기로 살펴봅니다. 지금 모든 걸 이해할 필요는 없어요 - 퍼즐을 진행하면서 각 기능을 자세히 알아볼 겁니다_.
> 💡 _TileTensor가 어떤 일을 할 수 있는지 맛보기로 살펴봅니다. 지금 모든 걸 이해할 필요는 없어요 - 퍼즐을 진행하면서 각 기능을 자세히 알아볼 겁니다_.

## 문제: 점점 복잡해지는 코드

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

## 해결책: LayoutTensor 미리보기
## 해결책: TileTensor 미리보기

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

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

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

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

### 기본 사용 예시

```mojo
from layout import Layout, LayoutTensor
from layout import TileTensor
from layout.tile_layout import row_major

# 레이아웃 정의
comptime HEIGHT = 2
comptime WIDTH = 3
comptime layout = Layout.row_major(HEIGHT, WIDTH)
comptime layout = row_major[HEIGHT, WIDTH]()
comptime LayoutType = type_of(layout)

# 텐서 생성
tensor = LayoutTensor[dtype, layout](buffer.unsafe_ptr())
tensor = TileTensor(buffer, layout)

# 자연스럽게 요소 접근
tensor[0, 0] = 1.0 # 첫 번째 요소
tensor[1, 2] = 2.0 # 마지막 요소
```

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

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

## 간단한 예제

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

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

```bash
pixi run layout_tensor_intro
pixi run tile_tensor_intro
```

</div>
<div class="tab-content">

```bash
pixi run -e amd layout_tensor_intro
pixi run -e amd tile_tensor_intro
```

</div>
<div class="tab-content">

```bash
pixi run -e apple layout_tensor_intro
pixi run -e apple tile_tensor_intro
```

</div>
<div class="tab-content">

```bash
uv run poe layout_tensor_intro
uv run poe tile_tensor_intro
```

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

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

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

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

💡 **팁**: 진행하면서 이 예제를 기억해두세요 - 이 기본 개념을 바탕으로 점점 더 정교한 GPU 프로그램을 만들어갈 겁니다.
8 changes: 4 additions & 4 deletions book/i18n/ko/src/puzzle_04/puzzle_04.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,12 +51,12 @@

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

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

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

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

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

💡 **참고**: 이 퍼즐부터는 더 깔끔하고 안전한 GPU 코드를 위해 LayoutTensor를 주로 사용합니다.
💡 **참고**: 이 퍼즐부터는 더 깔끔하고 안전한 GPU 코드를 위해 TileTensor를 주로 사용합니다.
Original file line number Diff line number Diff line change
@@ -1,35 +1,35 @@
<!-- i18n-source-commit: db06539cab77774402e8a4bf955018fd853803d9 -->

# LayoutTensor 버전
# TileTensor 버전

## 개요

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

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

## 핵심 개념

이 퍼즐에서 배울 내용:

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

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

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

## 완성할 코드

```mojo
{{#include ../../../../../problems/p04/p04_layout_tensor.mojo:add_10_2d_layout_tensor}}
{{#include ../../../../../problems/p04/p04_tile_tensor.mojo:add_10_2d_tile_tensor}}
```

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

<details>
<summary><strong>팁</strong></summary>
Expand Down Expand Up @@ -57,28 +57,28 @@
<div class="tab-content">

```bash
pixi run p04_layout_tensor
pixi run p04_tile_tensor
```

</div>
<div class="tab-content">

```bash
pixi run -e amd p04_layout_tensor
pixi run -e amd p04_tile_tensor
```

</div>
<div class="tab-content">

```bash
pixi run -e apple p04_layout_tensor
pixi run -e apple p04_tile_tensor
```

</div>
<div class="tab-content">

```bash
uv run poe p04_layout_tensor
uv run poe p04_tile_tensor
```

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

```mojo
{{#include ../../../../../solutions/p04/p04_layout_tensor.mojo:add_10_2d_layout_tensor_solution}}
{{#include ../../../../../solutions/p04/p04_tile_tensor.mojo:add_10_2d_tile_tensor_solution}}
```

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

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

</div>
</details>
Loading
Loading