Mojo๐Ÿ”ฅ GPU Puzzles
Blog

Mojo๐Ÿ”ฅ GPU Puzzles

2026.03.09
ยทWebยทby ๊ถŒ์ค€ํ˜ธ
#GPU Programming#Mojo#Parallel Computing#Performance Optimization

ํ•ต์‹ฌ ํฌ์ธํŠธ

  • 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++ ๋Œ€๋น„ ๋” ์•ˆ์ „ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ํŠน์„ฑ๋“ค์€ Mojo๊ฐ€ GPU ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋” ๋งŽ์€ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜์—ฌ ํ˜์‹ ์„ ์ด‰์ง„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

ํผ์ฆ ๊ธฐ๋ฐ˜ ํ•™์Šต ๋ฐฉ์‹:
๋Œ€๋ถ€๋ถ„์˜ GPU ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•™์Šต ์ž๋ฃŒ๊ฐ€ ๋ฐฉ๋Œ€ํ•œ ์ด๋ก ์„ ๋จผ์ € ๋‹ค๋ฃจ๋Š” ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ, ๋ณธ ๊ฐ€์ด๋“œ๋Š” ํผ์ฆ ๊ธฐ๋ฐ˜ ํ•™์Šต ๋ฐฉ์‹์„ ์ฑ„ํƒํ•˜์—ฌ ์‹ค์ „ ๋ฌธ์ œ์— ๋ฐ”๋กœ ๋›ฐ์–ด๋“ค์–ด ๋‹จ๊ณ„์ ์œผ๋กœ ๊ฐœ๋…์„ ๋ฐœ๊ฒฌํ•ด ๋‚˜๊ฐ‘๋‹ˆ๋‹ค.

  • ์ง์ ‘ ์ฒดํ—˜: GPU์—์„œ ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ ์ง„์  ๋ณต์žก๋„: ๊ฐ ํผ์ฆ์€ ์ด์ „์— ๋ฐฐ์šด ๊ฐœ๋… ์œ„์— ์ƒˆ๋กœ์šด ์ง€์‹์„ ์Œ“์•„ ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค.
  • ์‹ค์šฉ์  ์ดˆ์ : ์‹ค์ œ ๊ณ„์‚ฐ ๋ฌธ์ œ๋ฅผ ๋ฐ˜์˜ํ•œ ํผ์ฆ๋“ค๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋””๋ฒ„๊น… ๋Šฅ๋ ฅ: ์ฒด๊ณ„์ ์ธ ๋””๋ฒ„๊น… ์—ฐ์Šต์„ ํ†ตํ•ด ๋ฌธ์ œ ํ•ด๊ฒฐ ๋Šฅ๋ ฅ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
  • ์ง€์‹ ์ •์ฐฉ: ์ง์ ‘ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ฐœ๋…์— ๋Œ€ํ•œ ๊นŠ์€ ์ดํ•ด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

GPU ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‚ฌ๊ณ ๋ฐฉ์‹ (Core Methodology):
ํšจ๊ณผ์ ์ธ GPU ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•ด์„œ๋Š” ๊ณ„์‚ฐ์„ ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉ์‹ ์ž์ฒด๋ฅผ ์ „ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. ์ˆœ์ฐจ(Sequential)์—์„œ ๋ณ‘๋ ฌ(Parallel)๋กœ์˜ ์ „ํ™˜:
    • ๊ธฐ์กด CPU ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ for ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์”ฉ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, foriinrange(datasize):result[i]=process(data[i])for i in range(data_size): result[i] = process(data[i])์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    • GPU ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ˆ˜์ฒœ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ํ• ๋‹นํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์š”์†Œ๋ฅผ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋…์ ์œผ๋กœ threadid=getglobalid();ifthreadid<datasize:result[threadid]=process(data[threadid])thread_id = get_global_id(); if thread_id < data_size: result[thread_id] = process(data[thread_id])์™€ ๊ฐ™์ด ๊ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ํŠน์ • ๋ฐ์ดํ„ฐ ์š”์†Œ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ช…์‹œ์ ์ธ ๋ฐ˜๋ณต๋ฌธ์ด ๋Œ€๊ทœ๋ชจ ๋ณ‘๋ ฌ ์‹คํ–‰์œผ๋กœ ๋Œ€์ฒด๋จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  1. ๋ฐ์ดํ„ฐ ์œ„์— ์—ฐ์‚ฐ ๊ทธ๋ฆฌ๋“œ ๋งž์ถ”๊ธฐ (Aligning Computation Grid with Data):
GPU๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์กฐํ™”๋œ ๊ทธ๋ฆฌ๋“œ๋กœ ๋ณด๊ณ , GPU ์Šค๋ ˆ๋“œ๋Š” ์ด์— ๋Œ€์‘ํ•˜๋Š” ์—ฐ์‚ฐ ๊ทธ๋ฆฌ๋“œ๋ฅผ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ตœ์ ์˜ ์„ฑ๋Šฅ์„ ์œ„ํ•ด์„œ๋Š” ์ด ์Šค๋ ˆ๋“œ ๊ตฌ์„ฑ์„ ์ž˜ ์„ค๊ณ„ํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๊ณต๊ฐ„์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์Šค๋ ˆ๋“œ (Thread): ๊ฐ๊ฐ ํŠน์ • ๋ฐ์ดํ„ฐ ์š”์†Œ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๊ฐœ๋ณ„ ์ฒ˜๋ฆฌ ๋‹จ์œ„์ž…๋‹ˆ๋‹ค. GPU์˜ ๊ฐ€์žฅ ์ž‘์€ ์‹คํ–‰ ๋‹จ์œ„์ž…๋‹ˆ๋‹ค.
  • ๋ธ”๋ก (Block): ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ(Shared Memory) ์ ‘๊ทผ๊ณผ ๋™๊ธฐํ™”(Synchronization) ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ์Šค๋ ˆ๋“œ ๊ทธ๋ฃน์ž…๋‹ˆ๋‹ค. ๊ฐ™์€ ๋ธ”๋ก ๋‚ด์˜ ์Šค๋ ˆ๋“œ๋“ค์€ __syncthreads()์™€ ๊ฐ™์€ ๋™๊ธฐํ™” ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜‘๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๋“œ (Grid): ์ „์ฒด ๊ณ„์‚ฐ ๋ฌธ์ œ๋ฅผ ์•„์šฐ๋ฅด๋Š” ๋ธ”๋ก๋“ค์˜ ์ง‘ํ•ฉ์ด๋ฉฐ, ๋ชจ๋“  ๋ธ”๋ก์ด ๋™์ผํ•œ ์ปค๋„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. GPU ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ํŒจํ„ด๊ณผ ๋™๊ธฐํ™” ์š”๊ตฌ์‚ฌํ•ญ์„ ๊ด€๋ฆฌํ•˜๋ฉด์„œ ์ด ์Šค๋ ˆ๋“œ ๊ตฌ์„ฑ์˜ ๊ท ํ˜•์„ ์žก์•„ ๋ณ‘๋ ฌ ํšจ์œจ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.
  1. ๋ฐ์ดํ„ฐ ์ด๋™(Data Movement) vs. ์—ฐ์‚ฐ(Computation):
GPU ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ์ข…์ข… ์—ฐ์‚ฐ ์ž์ฒด๋ณด๋‹ค ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฎ๊ธฐ๋Š” ๋น„์šฉ์ด ๋” ํฐ ๋ณ‘๋ชฉ์ด ๋ฉ๋‹ˆ๋‹ค.
  • CPU์™€ GPU ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ด๋™: ์ƒ๋Œ€์ ์œผ๋กœ ๋งค์šฐ ๋А๋ฆฝ๋‹ˆ๋‹ค. PCIe ๋ฒ„์Šค ๋“ฑ์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • ์ „์—ญ ๋ฉ”๋ชจ๋ฆฌ(Global Memory)์—์„œ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ(Shared Memory)๋กœ์˜ ์ด๋™: ์ „์—ญ ๋ฉ”๋ชจ๋ฆฌ๋Š” GPU ์™ธ๋ถ€์— ์œ„์น˜ํ•˜๊ฑฐ๋‚˜ ์บ์‹œ ๊ณ„์ธต์ด ์ œํ•œ์ ์ธ ๋А๋ฆฐ ๋ฉ”๋ชจ๋ฆฌ์ธ ๋ฐ˜๋ฉด, ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋Š” GPU ์นฉ ๋‚ด๋ถ€์— ์œ„์น˜ํ•œ ๋น ๋ฅด๊ณ  ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•œ ์บ์‹œ ์—ญํ• ์„ ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์ž…๋‹ˆ๋‹ค.
  • ๋ ˆ์ง€์Šคํ„ฐ(Registers)๋‚˜ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์— ์ด๋ฏธ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ: ๊ฐ€์žฅ ๋น ๋ฆ…๋‹ˆ๋‹ค. ๋ ˆ์ง€์Šคํ„ฐ๋Š” ๊ฐ ์Šค๋ ˆ๋“œ์— ํ• ๋‹น๋œ ์ดˆ๊ณ ์† ๋ฉ”๋ชจ๋ฆฌ์ด๋ฉฐ, ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋ธ”๋ก ๋‚ด ์Šค๋ ˆ๋“œ๋“ค์ด ๊ณต์œ ํ•˜๋Š” ๊ณ ์† ๋ฉ”๋ชจ๋ฆฌ์ž…๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ํŠน์„ฑ์œผ๋กœ ์ธํ•ด GPU ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ•ต์‹ฌ์€ ๋ฐ์ดํ„ฐ ์ด๋™์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•™์Šต ๋‚ด์šฉ:
๋ณธ ๊ฐ€์ด๋“œ๋Š” ๊ธฐ์ดˆ ์›๋ฆฌ๋ถ€ํ„ฐ ๊ณ ๊ธ‰ 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 ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ•ต์‹ฌ ๊ฐœ๋…๊ณผ ์‹ค์ œ ์ ์šฉ ๋Šฅ๋ ฅ์„ ํšจ๊ณผ์ ์œผ๋กœ ์Šต๋“ํ•˜๋„๋ก ๋•๋Š” ํฌ๊ด„์ ์ธ ํ•™์Šต ์ž๋ฃŒ์ž…๋‹ˆ๋‹ค.