Mojo ๐Ÿ”ฅ GPU Puzzles, Edition 1

โ€œ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๊ธฐ ์ „์— ๋ฐฐ์›Œ์•ผ ํ•˜๋Š” ๊ฒƒ๋“ค์€, ํ•˜๋ฉด์„œ ๋ฐฐ์šด๋‹ค.โ€ ์•„๋ฆฌ์Šคํ† ํ…”๋ ˆ์Šค (๋‹ˆ์ฝ”๋งˆ์ฝ”์Šค ์œค๋ฆฌํ•™)

Mojo ๐Ÿ”ฅ๋ฅผ ์‚ฌ์šฉํ•œ GPU ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‹ค์Šต ๊ฐ€์ด๋“œ์— ์˜ค์‹  ๊ฒƒ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. Mojo๋Š” ํŒŒ์ด์ฌ ๋ฌธ๋ฒ•๊ณผ ์‹œ์Šคํ…œ ์ˆ˜์ค€์˜ ์„ฑ๋Šฅ์„ ๊ฒฐํ•ฉํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ž…๋‹ˆ๋‹ค.

์•„๋ž˜ ๊ฐœ์š” ์˜์ƒ์„ ๋จผ์ € ์‹œ์ฒญํ•˜๊ฑฐ๋‚˜, ๊ณ„์† ์ฝ์–ด์ฃผ์„ธ์š”.

์™œ GPU ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ธ๊ฐ€?

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

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

์™œ GPU ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— Mojo๐Ÿ”ฅ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?

์ปดํ“จํŒ… ์‚ฐ์—…์€ ์ค‘๋Œ€ํ•œ ์ „ํ™˜์ ์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. CPU ์„ฑ๋Šฅ์€ ์ „๋ ฅ๊ณผ ๋ฐœ์—ด ์ œ์•ฝ์œผ๋กœ ์ธํ•ด ํด๋Ÿญ ์†๋„ ํ–ฅ์ƒ๋งŒ์œผ๋กœ๋Š” ํ•œ๊ณ„์— ์ด๋ฅด๋ €์Šต๋‹ˆ๋‹ค. ์ด์— ๋”ฐ๋ผ ํ•˜๋“œ์›จ์–ด ์ œ์กฐ์‚ฌ๋“ค์€ ๋ฌผ๋ฆฌ์  ์ฝ”์–ด ์ˆ˜๋ฅผ ๋Š˜๋ฆฌ๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๋‚˜์•„๊ฐ”๊ณ , ์ด๋Ÿฌํ•œ ๋ฉ€ํ‹ฐ์ฝ”์–ด ์ ‘๊ทผ ๋ฐฉ์‹์˜ ์ •์ ์ด ๋ฐ”๋กœ ์ˆ˜์ฒœ ๊ฐœ์˜ ์ฝ”์–ด๊ฐ€ ๋ณ‘๋ ฌ๋กœ ๋™์ž‘ํ•˜๋Š” ํ˜„๋Œ€ GPU์ž…๋‹ˆ๋‹ค. NVIDIA H100์„ ์˜ˆ๋กœ ๋“ค๋ฉด, ๋‹จ์ผ ํด๋Ÿญ ์‚ฌ์ดํด์— 16,896๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ๋™์‹œ์— ์‹คํ–‰ํ•˜๋ฉด์„œ 270,000๊ฐœ ์ด์ƒ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ๋Œ€๊ธฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Mojo๋Š” GPU ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•œ ์‹ค์šฉ์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ œ๊ณตํ•˜์—ฌ, ์ด๋Ÿฌํ•œ ๋ณ‘๋ ฌ์„ฑ์„ ๋” ์‰ฝ๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค:

  • ํŒŒ์ด์ฌ ์Šคํƒ€์ผ ๋ฌธ๋ฒ•์œผ๋กœ ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊นŒ์ง€
  • ์ถ”์ƒํ™”ํ•ด๋„ ์„ฑ๋Šฅ ์†์‹ค ์—†์ด ๋จธ์‹  ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผ๋˜๋Š” ์ œ๋กœ ์ฝ”์ŠคํŠธ ์ถ”์ƒํ™”
  • ์ปดํŒŒ์ผ ํƒ€์ž„์— ์˜ค๋ฅ˜๋ฅผ ์žก๋Š” ๊ฐ•๋ ฅํ•œ ํƒ€์ž… ์‹œ์Šคํ…œ
  • ํ•˜๋“œ์›จ์–ด ์ตœ์ ํ™”๋ฅผ ๊ณ ๋ คํ•œ ํ…์„œ ๊ธฐ๋ณธ ์ง€์›
  • CPUยทGPU ๋‚ด์žฅ ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ํ•˜๋“œ์›จ์–ด ์ง์ ‘ ์ œ์–ด
  • CPU์™€ GPU ๋ชจ๋‘์—์„œ ๋™์ž‘ํ•˜๋Š” ํฌ๋กœ์Šค ํ•˜๋“œ์›จ์–ด ์ด์‹์„ฑ
  • C/C++ ๋Œ€๋น„ ํ–ฅ์ƒ๋œ ์•ˆ์ „์„ฑ
  • ๋‚ฎ์€ ์ง„์ž… ์žฅ๋ฒฝ์œผ๋กœ ๋” ๋งŽ์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ GPU ์„ฑ๋Šฅ์„ ํ™œ์šฉ

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

์™œ ํผ์ฆ๋กœ ๋ฐฐ์šฐ๋Š”๊ฐ€?

๋Œ€๋ถ€๋ถ„์˜ GPU ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ž๋ฃŒ๋Š” ์‹ค์Šต์— ์•ž์„œ ๋ฐฉ๋Œ€ํ•œ ์ด๋ก ์„ ๋จผ์ € ๋‹ค๋ฃน๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ง์ ‘ ํ•ด๋ด์•ผ ์ดํ•ด๋˜๋Š” ์ถ”์ƒ์  ๊ฐœ๋…๋“ค์€ ์ž…๋ฌธ์ž์—๊ฒŒ ๋ถ€๋‹ด์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ฑ…์€ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ „ ๋ฌธ์ œ์— ๋ฐ”๋กœ ๋›ฐ์–ด๋“ค์–ด, ๋‹จ๊ณ„์ ์œผ๋กœ ๊ฐœ๋…์„ ๋ฐœ๊ฒฌํ•ด ๋‚˜๊ฐ‘๋‹ˆ๋‹ค.

ํผ์ฆ ๊ธฐ๋ฐ˜ ํ•™์Šต์˜ ์žฅ์ :

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

์•”๊ธฐ๊ฐ€ ์•„๋‹Œ ๋ฐœ๊ฒฌ์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค. ์ง์ ‘ ์‹คํ—˜ํ•˜๋ฉด์„œ ๊ฐœ๋…์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ตํžˆ๊ณ , ๊นŠ์€ ์ดํ•ด์™€ ์‹ค์ „ ์—ญ๋Ÿ‰์„ ํ•จ๊ป˜ ์Œ“์•„๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌ์˜ ๋ง: ์ด ์ฑ…์˜ Part I๊ณผ III์€ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ NVIDIA GPU ํ•™์Šต ํ”„๋กœ์ ํŠธ์ธ GPU Puzzles์—์„œ ํฐ ์˜๊ฐ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ์ด ์ฑ…์€ ํ•ด๋‹น ๊ฐœ๋…๋“ค์„ Mojo์˜ ์ถ”์ƒํ™”์™€ ์„ฑ๋Šฅ์„ ํ™œ์šฉํ•˜์—ฌ ์žฌ๊ตฌํ˜„ํ•˜๊ณ , Mojo์— ํŠนํ™”๋œ ์ตœ์ ํ™”๋กœ ๊ณ ๊ธ‰ ์ฃผ์ œ๋ฅผ ๋” ๋„“๊ฒŒ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

GPU ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‚ฌ๊ณ ๋ฐฉ์‹

ํšจ๊ณผ์ ์ธ GPU ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•ด์„œ๋Š” ๊ณ„์‚ฐ์„ ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉ์‹ ์ž์ฒด๋ฅผ ๋ฐ”๊ฟ”์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•ž์œผ๋กœ์˜ ํ•™์Šต์— ๊ธธ์žก์ด๊ฐ€ ๋  ํ•ต์‹ฌ ์‚ฌ๊ณ  ๋ชจ๋ธ์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค:

์ˆœ์ฐจ์—์„œ ๋ณ‘๋ ฌ๋กœ: ๋ฐ˜๋ณต๋ฌธ์„ ์Šค๋ ˆ๋“œ๋กœ ๋Œ€์ฒด

๊ธฐ์กด CPU ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์”ฉ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค:

# CPU ๋ฐฉ์‹
for i in range(data_size):
    result[i] = process(data[i])

GPU ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ด ๋ฐฉ์‹์„ ์™„์ „ํžˆ ๋’ค์ง‘์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์”ฉ ์ˆœํšŒํ•˜๋Š” ๋Œ€์‹ , ์ˆ˜์ฒœ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ํ• ๋‹นํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์š”์†Œ๋ฅผ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค:

# GPU ๋ฐฉ์‹ (๊ฐœ๋…์ )
thread_id = get_global_id()
if thread_id < data_size:
    result[thread_id] = process(data[thread_id])

๊ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ์š”์†Œ๋ฅผ ๋งก์•„ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ, ๋ช…์‹œ์ ์ธ ๋ฐ˜๋ณต๋ฌธ์ด ๋Œ€๊ทœ๋ชจ ๋ณ‘๋ ฌ ์‹คํ–‰์œผ๋กœ ๋ฐ”๋€๋‹ˆ๋‹ค. ์ˆœ์ฐจ ์ฒ˜๋ฆฌ์—์„œ ๋™์‹œ ์‹คํ–‰์œผ๋กœ์˜ ์ „ํ™˜์ด GPU ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ•ต์‹ฌ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์œ„์— ์—ฐ์‚ฐ ๊ทธ๋ฆฌ๋“œ ๋งž์ถ”๊ธฐ

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

  • ์Šค๋ ˆ๋“œ: ๊ฐ๊ฐ ํŠน์ • ๋ฐ์ดํ„ฐ ์š”์†Œ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๊ฐœ๋ณ„ ์ฒ˜๋ฆฌ ๋‹จ์œ„
  • ๋ธ”๋ก: ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ๊ณผ ๋™๊ธฐํ™” ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ์Šค๋ ˆ๋“œ ๊ทธ๋ฃน
  • ๊ทธ๋ฆฌ๋“œ: ์ „์ฒด ๊ณ„์‚ฐ ๋ฌธ์ œ๋ฅผ ์•„์šฐ๋ฅด๋Š” ์Šค๋ ˆ๋“œ ๊ณ„์ธต ๊ตฌ์กฐ

GPU ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ž˜ํ•˜๋ ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ํŒจํ„ด๊ณผ ๋™๊ธฐํ™” ์š”๊ตฌ์‚ฌํ•ญ์„ ๊ด€๋ฆฌํ•˜๋ฉด์„œ ๋ณ‘๋ ฌ ํšจ์œจ์„ ์ตœ๋Œ€ํ•œ ๋Œ์–ด์˜ฌ๋ฆฌ๋„๋ก ์ด ์Šค๋ ˆ๋“œ ๊ตฌ์„ฑ์˜ ๊ท ํ˜•์„ ์žก์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์ด๋™ vs. ์—ฐ์‚ฐ

GPU ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ์—ฐ์‚ฐ ์ž์ฒด๋ณด๋‹ค ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฎ๊ธฐ๋Š” ๋น„์šฉ์ด ๋” ํด ๋•Œ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค:

  • CPU์™€ GPU ๊ฐ„ ๋ฐ์ดํ„ฐ ์ด๋™์€ ๋А๋ฆฝ๋‹ˆ๋‹ค
  • ์ „์—ญ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋กœ์˜ ์ด๋™์€ ๊ทธ๋ณด๋‹ค ๋น ๋ฆ…๋‹ˆ๋‹ค
  • ๋ ˆ์ง€์Šคํ„ฐ๋‚˜ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์— ์ด๋ฏธ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋น ๋ฆ…๋‹ˆ๋‹ค

์ด๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ํ”ํžˆ ๊ฐ€์ง€๋Š” ๊ฐ€์ •์„ ๋’ค์ง‘์Šต๋‹ˆ๋‹ค. ๋ณ‘๋ชฉ์€ ์—ฐ์‚ฐ์ด ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ ์ด๋™์ž…๋‹ˆ๋‹ค.

์ด ์ฑ…์˜ ํผ์ฆ๋“ค์„ ํ’€์–ด๊ฐ€๋ฉด์„œ ์ด๋Ÿฌํ•œ ์›์น™์„ ์ง๊ด€์ ์œผ๋กœ ์ฒด๋“ํ•˜๊ณ , ๊ณ„์‚ฐ ๋ฌธ์ œ์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹์„ ๋ฐ”๊ฟ” ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•™์Šต ๋‚ด์šฉ

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

ํ˜„์žฌ ํ•™์Šต ๊ณผ์ •

ํ•ต์‹ฌ ๊ธฐ์ˆ ์ƒํƒœํผ์ฆ
์Šค๋ ˆ๋“œ/๋ธ”๋ก ๊ธฐ์ดˆโœ… ์ œ๊ณต ์ค‘Part I (1-8)
GPU ํ”„๋กœ๊ทธ๋žจ ๋””๋ฒ„๊น…โœ… ์ œ๊ณต ์ค‘Part II (9-10)
ํ•ต์‹ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜โœ… ์ œ๊ณต ์ค‘Part III (11-16)
MAX ๊ทธ๋ž˜ํ”„ ํ†ตํ•ฉโœ… ์ œ๊ณต ์ค‘Part IV (17-19)
PyTorch ํ†ตํ•ฉโœ… ์ œ๊ณต ์ค‘Part V (20-22)
ํ•จ์ˆ˜ํ˜• ํŒจํ„ด ๋ฐ ๋ฒค์น˜๋งˆํ‚นโœ… ์ œ๊ณต ์ค‘Part VI (23)
์›Œํ”„ ํ”„๋กœ๊ทธ๋ž˜๋ฐโœ… ์ œ๊ณต ์ค‘Part VII (24-26)
๋ธ”๋ก ์ˆ˜์ค€ ํ”„๋กœ๊ทธ๋ž˜๋ฐโœ… ์ œ๊ณต ์ค‘Part VIII (27)
๊ณ ๊ธ‰ ๋ฉ”๋ชจ๋ฆฌ ์—ฐ์‚ฐโœ… ์ œ๊ณต ์ค‘Part IX (28-29)
์„ฑ๋Šฅ ๋ถ„์„โœ… ์ œ๊ณต ์ค‘Part X (30-32)
์ตœ์‹  GPU ๊ธฐ๋Šฅโœ… ์ œ๊ณต ์ค‘Part XI (33-34)

์ƒ์„ธ ํ•™์Šต ๋ชฉํ‘œ

Part I: GPU ๊ธฐ์ดˆ (ํผ์ฆ 1-8) โœ…

  • ์Šค๋ ˆ๋“œ ์ธ๋ฑ์‹ฑ๊ณผ ๋ธ”๋ก ๊ตฌ์„ฑ ๋ฐฐ์šฐ๊ธฐ
  • ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ํŒจํ„ด๊ณผ ๊ฐ€๋“œ ์ดํ•ดํ•˜๊ธฐ
  • ์›์‹œ ํฌ์ธํ„ฐ์™€ LayoutTensor ์ถ”์ƒํ™” ๋ชจ๋‘ ๋‹ค๋ค„๋ณด๊ธฐ
  • ์Šค๋ ˆ๋“œ ๊ฐ„ ํ†ต์‹ ์„ ์œ„ํ•œ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ๊ธฐ์ดˆ ์ตํžˆ๊ธฐ

Part II: GPU ํ”„๋กœ๊ทธ๋žจ ๋””๋ฒ„๊น… (ํผ์ฆ 9-10) โœ…

  • GPU ๋””๋ฒ„๊ฑฐ์™€ ๋””๋ฒ„๊น… ๊ธฐ๋ฒ• ๋ฐฐ์šฐ๊ธฐ
  • ์ƒˆ๋‹ˆํƒ€์ด์ €๋กœ ๋ฉ”๋ชจ๋ฆฌ ์˜ค๋ฅ˜์™€ ๊ฒฝ์Ÿ ์ƒํƒœ ์ฐพ๊ธฐ
  • GPU ๋ฒ„๊ทธ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ์‹๋ณ„ํ•˜๊ณ  ์ˆ˜์ •ํ•˜๊ธฐ
  • ๋ณต์žกํ•œ GPU ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ณผ์ œ์— ๋„์ „ํ•  ์ž์‹ ๊ฐ ์Œ“๊ธฐ

์ฐธ๊ณ : ๋””๋ฒ„๊น… ํผ์ฆ์„ ์‹คํ–‰ํ•˜๋ ค๋ฉด NVIDIA GPU ๋””๋ฒ„๊น… ๋„๊ตฌ ์ ‘๊ทผ์„ ์œ„ํ•œ pixi๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. CUDA๋ฅผ ์ง€์›ํ•˜๋Š” NVIDIA GPU์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

Part III: GPU ์•Œ๊ณ ๋ฆฌ์ฆ˜ (ํผ์ฆ 11-16) โœ…

  • ๋ณ‘๋ ฌ ๋ฆฌ๋•์…˜๊ณผ ํ’€๋ง ์—ฐ์‚ฐ ๊ตฌํ˜„ํ•˜๊ธฐ
  • ํšจ์œจ์ ์ธ ํ•ฉ์„ฑ๊ณฑ ์ปค๋„ ๋งŒ๋“ค๊ธฐ
  • ๋ˆ„์  ํ•ฉ(์Šค์บ”) ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฐฐ์šฐ๊ธฐ
  • ํƒ€์ผ๋ง ์ „๋žต์œผ๋กœ ํ–‰๋ ฌ ๊ณฑ์…ˆ ์ตœ์ ํ™”ํ•˜๊ธฐ

Part IV: MAX ๊ทธ๋ž˜ํ”„ ํ†ตํ•ฉ (ํผ์ฆ 17-19) โœ…

  • ์ปค์Šคํ…€ MAX ๊ทธ๋ž˜ํ”„ ์—ฐ์‚ฐ ๋งŒ๋“ค๊ธฐ
  • GPU ์ปค๋„๊ณผ ํŒŒ์ด์ฌ ์ฝ”๋“œ ์—ฐ๊ฒฐํ•˜๊ธฐ
  • ์†Œํ”„ํŠธ๋งฅ์Šค, ์–ดํ…์…˜ ๊ฐ™์€ ํ”„๋กœ๋•์…˜ ์ˆ˜์ค€์˜ ์—ฐ์‚ฐ ๊ตฌํ˜„ํ•˜๊ธฐ

Part V: PyTorch ํ†ตํ•ฉ (ํผ์ฆ 20-22) โœ…

  • Mojo GPU ์ปค๋„๊ณผ PyTorch ํ…์„œ ์—ฐ๊ฒฐํ•˜๊ธฐ
  • CustomOpLibrary๋กœ ํ…์„œ ๋งˆ์ƒฌ๋ง์„ ๋งค๋„๋Ÿฝ๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ
  • torch.compile๊ณผ ํ†ตํ•ฉํ•˜์—ฌ ์‹คํ–‰ ์ตœ์ ํ™”ํ•˜๊ธฐ
  • ์ปค๋„ ํ“จ์ „๊ณผ ์ปค์Šคํ…€ ์—ญ๋ฐฉํ–ฅ ํŒจ์Šค ๋ฐฐ์šฐ๊ธฐ

Part VI: Mojo ํ•จ์ˆ˜ํ˜• ํŒจํ„ด ๋ฐ ๋ฒค์น˜๋งˆํ‚น (ํผ์ฆ 23) โœ…

  • ํ•จ์ˆ˜ํ˜• ํŒจํ„ด ๋ฐฐ์šฐ๊ธฐ: elementwise, tiled ์ฒ˜๋ฆฌ, vectorization
  • ์ฒด๊ณ„์ ์ธ ์„ฑ๋Šฅ ์ตœ์ ํ™”์™€ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ ์ตํžˆ๊ธฐ
  • ์ •๋Ÿ‰์  ๋ฒค์น˜๋งˆํ‚น์œผ๋กœ ์„ฑ๋Šฅ ๋ถ„์„ํ•˜๊ธฐ
  • GPU ์Šค๋ ˆ๋”ฉ vs SIMD ์‹คํ–‰ ๊ณ„์ธต ๊ตฌ์กฐ ์ดํ•ดํ•˜๊ธฐ

Part VII: ์›Œํ”„ ์ˆ˜์ค€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (ํผ์ฆ 24-26) โœ…

  • ์›Œํ”„ ๊ธฐ์ดˆ์™€ 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 ์›Œํฌ๋กœ๋“œ๋ฅผ ์œ„ํ•œ ํ…์„œ ์ฝ”์–ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฐ์šฐ๊ธฐ
  • ํ˜„๋Œ€ GPU์˜ ํด๋Ÿฌ์Šคํ„ฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฐ์šฐ๊ธฐ

์ด ์ฑ…์€ ๊ธฐ์กด ๋ฐฉ์‹๊ณผ ๋‹ฌ๋ฆฌ, ๋จผ์ € ์ €์ˆ˜์ค€ ๋ฉ”๋ชจ๋ฆฌ ์กฐ์ž‘์œผ๋กœ ์ดํ•ด๋ฅผ ์Œ“์€ ๋’ค ์ ์ง„์ ์œผ๋กœ Mojo์˜ LayoutTensor ์ถ”์ƒํ™”๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด GPU ๋ฉ”๋ชจ๋ฆฌ ํŒจํ„ด์— ๋Œ€ํ•œ ๊นŠ์€ ์ดํ•ด์™€ ํ˜„๋Œ€์  ํ…์„œ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ๋ฒ•์˜ ์‹ค์šฉ์  ์ง€์‹์„ ๋ชจ๋‘ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ์ž‘ํ•  ์ค€๋น„๊ฐ€ ๋˜์…จ๋‚˜์š”?

GPU ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์™œ ์ค‘์š”ํ•œ์ง€, Mojo๊ฐ€ ์™œ ์ ํ•ฉํ•œ์ง€, ๊ทธ๋ฆฌ๊ณ  ํผ์ฆ๋กœ ์–ด๋–ป๊ฒŒ ๋ฐฐ์šฐ๋Š”์ง€ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด์ œ ์‹œ์ž‘ํ•ด ๋ด…์‹œ๋‹ค.

๋‹ค์Œ ๋‹จ๊ณ„: ํผ์ฆ ์‚ฌ์šฉ ๊ฐ€์ด๋“œ์—์„œ ํ™˜๊ฒฝ ์„ค์ •, ์‹œ์Šคํ…œ ์š”๊ตฌ์‚ฌํ•ญ, ์ฒซ ๋ฒˆ์งธ ํผ์ฆ ์‹คํ–‰ ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•˜์„ธ์š”.