Mojo๐ฅ GPU Puzzles
ํต์ฌ ํฌ์ธํธ
- 1์ด ๊ฐ์ด๋๋ ํ์ด์ฌ ๋ฌธ๋ฒ๊ณผ ์์คํ ์์ค ์ฑ๋ฅ์ ๊ฒฐํฉํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ธ Mojo๋ฅผ ์ฌ์ฉํ์ฌ GPU ํ๋ก๊ทธ๋๋ฐ์ ํ์ตํ๋ ์ค์ต ๊ธฐ๋ฐ์ ํผ์ฆ ๊ฐ์ด๋์ ๋๋ค.
- 2ํผ์ฆ ๊ธฐ๋ฐ ํ์ต์ ์์ฐจ์ ์ฌ๊ณ ์์ ๋ณ๋ ฌ์ ์ฌ๊ณ ๋ก์ ์ ํ, ๋ฐ์ดํฐ ์ด๋์ ์ต์ ํ, ๊ทธ๋ฆฌ๊ณ ์ค๋ ๋/๋ธ๋ก/๊ทธ๋ฆฌ๋ ๊ตฌ์ฑ์ ํตํด GPU ํ๋ก๊ทธ๋๋ฐ์ ํต์ฌ ๊ฐ๋ ์ ์ฒด๋ํ๋๋ก ๋์ต๋๋ค.
- 3์ด ๊ฐ์ด๋๋ GPU ๊ธฐ์ด ๋ฐ ๋๋ฒ๊น ๋ถํฐ ๊ณ ๊ธ ์๊ณ ๋ฆฌ์ฆ, MAX graph ๋ฐ PyTorch ํตํฉ, ์ํ/๋ธ๋ก ์์ค ํ๋ก๊ทธ๋๋ฐ, ๊ณ ๊ธ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ, ์ฑ๋ฅ ๋ถ์, ๊ทธ๋ฆฌ๊ณ Tensor Core๋ฅผ ํฌํจํ ์ต์ GPU ๊ธฐ๋ฅ๊น์ง ํฌ๊ด์ ์ธ ๋ด์ฉ์ ๋ค๋ฃน๋๋ค.
๋ณธ ๋ฌธ์๋ Mojo๋ฅผ ํ์ฉํ GPU ํ๋ก๊ทธ๋๋ฐ ์ค์ต ๊ฐ์ด๋์ธ "Mojo ๐ฅ GPU Puzzles, Edition 1 Puzzles Repo Mojo Manual"์ ๋ํ ๊ฐ์๋ฅผ ์ ๊ณตํฉ๋๋ค. Python ๋ฌธ๋ฒ๊ณผ ์์คํ ์์ค์ ์ฑ๋ฅ์ ๊ฒฐํฉํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ธ Mojo๋ฅผ ์ฌ์ฉํ์ฌ GPU ํ๋ก๊ทธ๋๋ฐ์ ๊ธฐ์ด๋ถํฐ ๊ณ ๊ธ ๊ธฐ๋ฒ๊น์ง ํผ์ฆ ๊ธฐ๋ฐ ํ์ต ๋ฐฉ์์ ํตํด ์ต๋ํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
GPU ํ๋ก๊ทธ๋๋ฐ์ ์ค์์ฑ:
GPU ํ๋ก๊ทธ๋๋ฐ์ ํ๋ ์ปดํจํ
์ ํต์ฌ ์ธํ๋ผ๋ก ์๋ฆฌ ์ก์์ผ๋ฉฐ, ์์ญ์ต ๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฒ๋ฆฌํ๋ ๋๊ท๋ชจ ์ธ์ด ๋ชจ๋ธ(LLM)๋ถํฐ ์ค์๊ฐ ์์ ์คํธ๋ฆผ ๋ถ์, ๊ธฐํ ๋ชจ๋ธ๋ง, ์ ์ฝ ๊ฐ๋ฐ, ์์ ์๋ฎฌ๋ ์ด์
์ ์ด๋ฅด๊ธฐ๊น์ง ๊ด๋ฒ์ํ ๋ถ์ผ์์ ํ์์ ์ธ ์ญํ ์ ํฉ๋๋ค. ๊ธ์ต๊ถ์ ์ค์๊ฐ ๋ฆฌ์คํฌ ๋ถ์ ๋ฐ ์๊ณ ๋ฆฌ์ฆ ํธ๋ ์ด๋ฉ, ์์จ์ฃผํ ์ฐจ๋์ ์ผ์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ฑ ๋ค์ํ ์ฐ์
์์ GPU ๊ฐ์์ด ์ฐ์ฐ ํ์ ์ ์ด๋๊ณ ์์ต๋๋ค. GPU ์ปดํจํ
์ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๋ ์กฐ์ง์ ๊ฐ๋ฐ ์ฃผ๊ธฐ ๋จ์ถ, ์ฐ์ฐ ๋น์ฉ ์ ๊ฐ, ๊ทธ๋ฆฌ๊ณ ๊ธฐ์กด์๋ ํด๊ฒฐํ๊ธฐ ์ด๋ ค์ ๋ ๊ณ์ฐ ๋ฌธ์ ํด๊ฒฐ ๋ฅ๋ ฅ์ ํตํด ์๋นํ ๊ฒฝ์ ์ฐ์๋ฅผ ํ๋ณดํฉ๋๋ค.
GPU ํ๋ก๊ทธ๋๋ฐ์ ์ํ Mojo์ ์ฅ์ :
CPU ์ฑ๋ฅ์ด ์ ๋ ฅ ๋ฐ ๋ฐ์ด ์ ์ฝ์ผ๋ก ์ธํด ํ๊ณ์ ๋๋ฌํ๋ฉด์, ํ๋ ์ปดํจํ
์ ์์ฒ ๊ฐ์ ์ฝ์ด๊ฐ ๋ณ๋ ฌ๋ก ๋์ํ๋ GPU๋ฅผ ํตํด ๋๊ท๋ชจ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ์งํฅํ๊ณ ์์ต๋๋ค. Mojo๋ ์ด๋ฌํ ๋ณ๋ ฌ์ฑ์ ํจ์จ์ ์ผ๋ก ํ์ฉํ ์ ์๋๋ก ๋์ต๋๋ค.
- Python ์คํ์ผ ๋ฌธ๋ฒ: ์น์ํ ๋ฌธ๋ฒ์ผ๋ก GPU์ ์ง์ ์ ๊ทผํ ์ ์์ด ์ง์ ์ฅ๋ฒฝ์ด ๋ฎ์ต๋๋ค.
- ์ ๋ก ์ฝ์คํธ ์ถ์ํ (Zero-Cost Abstractions): ์์คํ ํ๋ก๊ทธ๋๋ฐ ์์ค์ ์ถ์ํ์๋ ์ฑ๋ฅ ์์ค ์์ด ๋จธ์ ์ฝ๋๋ก ์ปดํ์ผ๋ฉ๋๋ค.
- ๊ฐ๋ ฅํ ํ์ ์์คํ (Strong Type System): ์ปดํ์ผ ํ์์ ์ค๋ฅ๋ฅผ ๊ฐ์งํ์ฌ ๋ฐํ์ ์ค๋ฅ๋ฅผ ์ค์ ๋๋ค.
- ํ๋์จ์ด ์ต์ ํ๋ ํ ์ ๊ธฐ๋ณธ ์ง์: ํ๋์จ์ด ์ต์ ํ๋ฅผ ์ผ๋์ ๋ ํ ์ ์ฐ์ฐ์ ์ง์ํฉ๋๋ค.
- ํ๋์จ์ด ์ง์ ์ ์ด: CPU ๋ฐ GPU ๋ด์ฅ ํจ์(Intrinsics)๋ฅผ ์ง์ ํธ์ถํ์ฌ ์ธ๋ฐํ ์ ์ด๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
- ํฌ๋ก์ค ํ๋์จ์ด ์ด์์ฑ (Cross-Hardware Portability): CPU์ GPU ๋ชจ๋์์ ๋์ํ๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
- ํฅ์๋ ์์ ์ฑ: C/C++ ๋๋น ๋ ์์ ํ ํ๋ก๊ทธ๋๋ฐ ํ๊ฒฝ์ ์ ๊ณตํฉ๋๋ค.
ํผ์ฆ ๊ธฐ๋ฐ ํ์ต ๋ฐฉ์:
๋๋ถ๋ถ์ GPU ํ๋ก๊ทธ๋๋ฐ ํ์ต ์๋ฃ๊ฐ ๋ฐฉ๋ํ ์ด๋ก ์ ๋จผ์ ๋ค๋ฃจ๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ, ๋ณธ ๊ฐ์ด๋๋ ํผ์ฆ ๊ธฐ๋ฐ ํ์ต ๋ฐฉ์์ ์ฑํํ์ฌ ์ค์ ๋ฌธ์ ์ ๋ฐ๋ก ๋ฐ์ด๋ค์ด ๋จ๊ณ์ ์ผ๋ก ๊ฐ๋
์ ๋ฐ๊ฒฌํด ๋๊ฐ๋๋ค.
- ์ง์ ์ฒดํ: GPU์์ ์ฝ๋๋ฅผ ์ง์ ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
- ์ ์ง์ ๋ณต์ก๋: ๊ฐ ํผ์ฆ์ ์ด์ ์ ๋ฐฐ์ด ๊ฐ๋ ์์ ์๋ก์ด ์ง์์ ์์ ์ฌ๋ฆฝ๋๋ค.
- ์ค์ฉ์ ์ด์ : ์ค์ ๊ณ์ฐ ๋ฌธ์ ๋ฅผ ๋ฐ์ํ ํผ์ฆ๋ค๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
- ๋๋ฒ๊น ๋ฅ๋ ฅ: ์ฒด๊ณ์ ์ธ ๋๋ฒ๊น ์ฐ์ต์ ํตํด ๋ฌธ์ ํด๊ฒฐ ๋ฅ๋ ฅ์ ํฅ์์ํต๋๋ค.
- ์ง์ ์ ์ฐฉ: ์ง์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ณผ์ ์์ ๊ฐ๋ ์ ๋ํ ๊น์ ์ดํด๋ฅผ ์ป์ ์ ์์ต๋๋ค.
GPU ํ๋ก๊ทธ๋๋ฐ ์ฌ๊ณ ๋ฐฉ์ (Core Methodology):
ํจ๊ณผ์ ์ธ GPU ํ๋ก๊ทธ๋๋ฐ์ ์ํด์๋ ๊ณ์ฐ์ ๋ฐ๋ผ๋ณด๋ ๋ฐฉ์ ์์ฒด๋ฅผ ์ ํํด์ผ ํฉ๋๋ค.
- ์์ฐจ(Sequential)์์ ๋ณ๋ ฌ(Parallel)๋ก์ ์ ํ:
- ๊ธฐ์กด CPU ํ๋ก๊ทธ๋๋ฐ์
for๋ฐ๋ณต๋ฌธ์ ํตํด ๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ ๊ฐ์ต๋๋ค. - GPU ํ๋ก๊ทธ๋๋ฐ์ ์์ฒ ๊ฐ์ ์ค๋ ๋๋ฅผ ํ ๋นํ์ฌ ๋ฐ์ดํฐ ์์๋ฅผ ๋์์ ์ฒ๋ฆฌํฉ๋๋ค. ๊ฐ๋ ์ ์ผ๋ก ์ ๊ฐ์ด ๊ฐ ์ค๋ ๋๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ํน์ ๋ฐ์ดํฐ ์์๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ์ด๋ ๋ช ์์ ์ธ ๋ฐ๋ณต๋ฌธ์ด ๋๊ท๋ชจ ๋ณ๋ ฌ ์คํ์ผ๋ก ๋์ฒด๋จ์ ์๋ฏธํฉ๋๋ค.
- ๊ธฐ์กด CPU ํ๋ก๊ทธ๋๋ฐ์
- ๋ฐ์ดํฐ ์์ ์ฐ์ฐ ๊ทธ๋ฆฌ๋ ๋ง์ถ๊ธฐ (Aligning Computation Grid with Data):
- ์ค๋ ๋ (Thread): ๊ฐ๊ฐ ํน์ ๋ฐ์ดํฐ ์์๋ฅผ ๋ด๋นํ๋ ๊ฐ๋ณ ์ฒ๋ฆฌ ๋จ์์ ๋๋ค. GPU์ ๊ฐ์ฅ ์์ ์คํ ๋จ์์ ๋๋ค.
- ๋ธ๋ก (Block): ๊ณต์ ๋ฉ๋ชจ๋ฆฌ(Shared Memory) ์ ๊ทผ๊ณผ ๋๊ธฐํ(Synchronization) ๊ธฐ๋ฅ์ ๊ฐ์ถ ์ค๋ ๋ ๊ทธ๋ฃน์
๋๋ค. ๊ฐ์ ๋ธ๋ก ๋ด์ ์ค๋ ๋๋ค์
__syncthreads()์ ๊ฐ์ ๋๊ธฐํ ํ๋ฆฌ๋ฏธํฐ๋ธ๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ ฅํ ์ ์์ต๋๋ค. - ๊ทธ๋ฆฌ๋ (Grid): ์ ์ฒด ๊ณ์ฐ ๋ฌธ์ ๋ฅผ ์์ฐ๋ฅด๋ ๋ธ๋ก๋ค์ ์งํฉ์ด๋ฉฐ, ๋ชจ๋ ๋ธ๋ก์ด ๋์ผํ ์ปค๋ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค. GPU ํ๋ก๊ทธ๋๋ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ํจํด๊ณผ ๋๊ธฐํ ์๊ตฌ์ฌํญ์ ๊ด๋ฆฌํ๋ฉด์ ์ด ์ค๋ ๋ ๊ตฌ์ฑ์ ๊ท ํ์ ์ก์ ๋ณ๋ ฌ ํจ์จ์ ๊ทน๋ํํ๋ ๊ณผ์ ์ ๋๋ค.
- ๋ฐ์ดํฐ ์ด๋(Data Movement) vs. ์ฐ์ฐ(Computation):
- CPU์ GPU ๊ฐ์ ๋ฐ์ดํฐ ์ด๋: ์๋์ ์ผ๋ก ๋งค์ฐ ๋๋ฆฝ๋๋ค. PCIe ๋ฒ์ค ๋ฑ์ ํตํด ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ ๋๋ค.
- ์ ์ญ ๋ฉ๋ชจ๋ฆฌ(Global Memory)์์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ(Shared Memory)๋ก์ ์ด๋: ์ ์ญ ๋ฉ๋ชจ๋ฆฌ๋ GPU ์ธ๋ถ์ ์์นํ๊ฑฐ๋ ์บ์ ๊ณ์ธต์ด ์ ํ์ ์ธ ๋๋ฆฐ ๋ฉ๋ชจ๋ฆฌ์ธ ๋ฐ๋ฉด, ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ GPU ์นฉ ๋ด๋ถ์ ์์นํ ๋น ๋ฅด๊ณ ์ฌ์ฉ์ ๊ด๋ฆฌ ๊ฐ๋ฅํ ์บ์ ์ญํ ์ ํ๋ ๋ฉ๋ชจ๋ฆฌ์ ๋๋ค.
- ๋ ์ง์คํฐ(Registers)๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ์ด๋ฏธ ์๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ: ๊ฐ์ฅ ๋น ๋ฆ ๋๋ค. ๋ ์ง์คํฐ๋ ๊ฐ ์ค๋ ๋์ ํ ๋น๋ ์ด๊ณ ์ ๋ฉ๋ชจ๋ฆฌ์ด๋ฉฐ, ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ ๋ธ๋ก ๋ด ์ค๋ ๋๋ค์ด ๊ณต์ ํ๋ ๊ณ ์ ๋ฉ๋ชจ๋ฆฌ์ ๋๋ค.
ํ์ต ๋ด์ฉ:
๋ณธ ๊ฐ์ด๋๋ ๊ธฐ์ด ์๋ฆฌ๋ถํฐ ๊ณ ๊ธ GPU ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ๊น์ง ๋ค๋ฃจ๋ฉฐ, ์ ์์ค ๋ฉ๋ชจ๋ฆฌ ์กฐ์๋ถํฐ Mojo์ LayoutTensor ์ถ์ํ๋ก์ ์ ์ง์ ์ ํ์ ํตํด GPU ๋ฉ๋ชจ๋ฆฌ ํจํด์ ๋ํ ๊น์ ์ดํด์ ํ๋์ ํ
์ ๊ธฐ๋ฐ ์ ๊ทผ๋ฒ์ ์ค์ฉ์ ์ง์์ ๋ชจ๋ ์ ๊ณตํฉ๋๋ค.
- Part I: GPU ๊ธฐ์ด (ํผ์ฆ 1-8): ์ค๋ ๋ ์ธ๋ฑ์ฑ, ๋ธ๋ก ๊ตฌ์ฑ, ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ํจํด, ์์ ํฌ์ธํฐ์ LayoutTensor, ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๊ธฐ์ด.
- Part II: GPU ํ๋ก๊ทธ๋จ ๋๋ฒ๊น (ํผ์ฆ 9-10): GPU ๋๋ฒ๊ฑฐ, ๋๋ฒ๊น ๊ธฐ๋ฒ, ์๋ํ์ด์ ๋ฅผ ์ด์ฉํ ๋ฉ๋ชจ๋ฆฌ ์ค๋ฅ ๋ฐ ๊ฒฝ์ ์ํ ์ฐพ๊ธฐ.
- Part III: GPU ์๊ณ ๋ฆฌ์ฆ (ํผ์ฆ 11-16): ๋ณ๋ ฌ ๋ฆฌ๋์ , ํ๋ง ์ฐ์ฐ, ํฉ์ฑ๊ณฑ ์ปค๋, ๋์ ํฉ(์ค์บ) ์๊ณ ๋ฆฌ์ฆ, ํ์ผ๋ง์ ํตํ ํ๋ ฌ ๊ณฑ์ ์ต์ ํ.
- Part IV: MAX ๊ทธ๋ํ ํตํฉ (ํผ์ฆ 17-19): ์ปค์คํ MAX ๊ทธ๋ํ ์ฐ์ฐ, GPU ์ปค๋๊ณผ Python ์ฝ๋ ์ฐ๊ฒฐ, ์ํํธ๋งฅ์ค, ์ดํ ์ ๊ตฌํ.
- Part V: PyTorch ํตํฉ (ํผ์ฆ 20-22): Mojo GPU ์ปค๋๊ณผ PyTorch ํ
์ ์ฐ๊ฒฐ, CustomOpLibrary,
torch.compileํตํฉ, ์ปค๋ ํจ์ , ์ปค์คํ ์ญ๋ฐฉํฅ ํจ์ค. - Part VI: Mojo ํจ์ํ ํจํด ๋ฐ ๋ฒค์น๋งํน (ํผ์ฆ 23): Elementwise, tiled ์ฒ๋ฆฌ, vectorization, ์ฑ๋ฅ ์ต์ ํ ๋ฐ ํธ๋ ์ด๋์คํ, ๋ฒค์น๋งํน, GPU ์ค๋ ๋ฉ๊ณผ SIMD ์คํ ๊ณ์ธต ๊ตฌ์กฐ ์ดํด.
- Part VII: ์ํ ์์ค ํ๋ก๊ทธ๋๋ฐ (ํผ์ฆ 24-26): ์ํ(Warp) ๊ธฐ์ด, SIMT ์คํ ๋ชจ๋ธ, ์ํ ์ฐ์ฐ(sum, shuffle_down, broadcast, shuffle_xor, prefix_sum).
- Part VIII: ๋ธ๋ก ์์ค ํ๋ก๊ทธ๋๋ฐ (ํผ์ฆ 27):
block.sum(),block.max()๋ฅผ ํตํ ๋ธ๋ก ๋จ์ ๋ฆฌ๋์ , ๋ธ๋ก ์์ค ๋์ ํฉ ํจํด,block.broadcast(). - Part IX: ๊ณ ๊ธ ๋ฉ๋ชจ๋ฆฌ ์์คํ (ํผ์ฆ 28-29): ์ต์ ์ ๋ฉ๋ชจ๋ฆฌ ๋ณํฉ ํจํด, ๋น๋๊ธฐ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ, ๋ฉ๋ชจ๋ฆฌ ํ์ค, ๋๊ธฐํ ๊ธฐ๋ณธ ์์, ํ๋ฆฌํ์นญ ๋ฐ ์บ์ ์ต์ ํ.
- Part X: ์ฑ๋ฅ ๋ถ์ ๋ฐ ์ต์ ํ (ํผ์ฆ 30-32): GPU ์ปค๋ ํ๋กํ์ผ๋ง, ์ ์ ์จ ๋ฐ ๋ฆฌ์์ค ํ์ฉ๋ ์ต์ ํ, ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๋ฑ ํฌ ์ถฉ๋ ์ ๊ฑฐ.
- Part XI: ๊ณ ๊ธ GPU ๊ธฐ๋ฅ (ํผ์ฆ 33-34): AI ์ํฌ๋ก๋๋ฅผ ์ํ ํ ์ ์ฝ์ด(Tensor Core) ํ๋ก๊ทธ๋๋ฐ, ํ๋ GPU์ ํด๋ฌ์คํฐ ํ๋ก๊ทธ๋๋ฐ.
์ด ๊ฐ์ด๋๋ ๋ ์๊ฐ GPU ํ๋ก๊ทธ๋๋ฐ์ ํต์ฌ ๊ฐ๋ ๊ณผ ์ค์ ์ ์ฉ ๋ฅ๋ ฅ์ ํจ๊ณผ์ ์ผ๋ก ์ต๋ํ๋๋ก ๋๋ ํฌ๊ด์ ์ธ ํ์ต ์๋ฃ์ ๋๋ค.