๐Ÿ•ต ์บ์‹œ ํžˆํŠธ์˜ ์—ญ์„ค

๊ฐœ์š”

์ฒซ ๋ฒˆ์งธ ํ”„๋กœํŒŒ์ผ๋ง ํƒ์ • ์‚ฌ๊ฑด์— ์˜ค์‹  ๊ฒƒ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค! ์„ธ ๊ฐœ์˜ GPU ์ปค๋„์ด ๋ชจ๋‘ ๋™์ผํ•œ ๋ฒกํ„ฐ ๋ง์…ˆ output[i] = a[i] + b[i]์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋‹น์—ฐํžˆ ์„ฑ๋Šฅ๋„ ๊ฐ™๊ฒ ์ฃ ?

์•„๋‹™๋‹ˆ๋‹ค! ์ด ์ปค๋„๋“ค์˜ ์„ฑ๋Šฅ ์ฐจ์ด๋Š” ๊ทน์ ์ž…๋‹ˆ๋‹ค - ํ•˜๋‚˜๋Š” ๋‚˜๋จธ์ง€๋ณด๋‹ค ์ˆ˜์‹ญ ๋ฐฐ๋‚˜ ๋А๋ฆฝ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์˜ ์ž„๋ฌด: ๋ฐฉ๊ธˆ ๋ฐฐ์šด ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์™œ ๊ทธ๋Ÿฐ์ง€ ๋ฐํ˜€๋‚ด์„ธ์š”.

๋„์ „ ๊ณผ์ œ

GPU ์ตœ์ ํ™”์— ๋Œ€ํ•œ ๊ธฐ์กด ์ƒ์‹์„ ์™„์ „ํžˆ ๋’ค์ง‘๋Š” ์„ฑ๋Šฅ ๋ฏธ์Šคํ„ฐ๋ฆฌ์— ์˜ค์‹  ๊ฒƒ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค! ๋ˆˆ์•ž์—๋Š” ๊ฒ‰๋ณด๊ธฐ์— ๋™์ผํ•œ ๋ฒกํ„ฐ ๋ง์…ˆ ์ปค๋„ ์„ธ ๊ฐœ๊ฐ€ ์žˆ๊ณ , ๋ชจ๋‘ ์ •ํ™•ํžˆ ๊ฐ™์€ ์ˆ˜ํ•™ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

output[i] = a[i] + b[i]  // ๋‹จ์ˆœํ•œ ์‚ฐ์ˆ  ์—ฐ์‚ฐ - ๋ญ๊ฐ€ ์ž˜๋ชป๋  ์ˆ˜ ์žˆ์„๊นŒ?

์ถฉ๊ฒฉ์ ์ธ ํ˜„์‹ค:

  • ์„ธ ์ปค๋„ ๋ชจ๋‘ ๋™์ผํ•˜๊ณ  ์ •ํ™•ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค
  • ํ•˜๋‚˜์˜ ์ปค๋„์ด ๋‚˜๋จธ์ง€๋ณด๋‹ค ~50๋ฐฐ ๋А๋ฆฝ๋‹ˆ๋‹ค
  • ๊ฐ€์žฅ ๋А๋ฆฐ ์ปค๋„์ด ๊ฐ€์žฅ ๋†’์€ ์บ์‹œ ํžˆํŠธ์œจ์„ ๋ณด์ž…๋‹ˆ๋‹ค (์˜ˆ์ƒ๊ณผ ์ •๋ฐ˜๋Œ€!)
  • ์ผ๋ฐ˜์ ์ธ ์„ฑ๋Šฅ ์ง๊ด€์ด ์™„์ „ํžˆ ๋น—๋‚˜๊ฐ‘๋‹ˆ๋‹ค

ํƒ์ • ์ž„๋ฌด:

  1. ์„ฑ๋Šฅ ๋ฒ”์ธ ์‹๋ณ„ - ์–ด๋–ค ์ปค๋„์ด ์น˜๋ช…์ ์œผ๋กœ ๋А๋ฆฐ๊ฐ€?
  2. ์บ์‹œ์˜ ์—ญ์„ค ๊ทœ๋ช… - ๋†’์€ ์บ์‹œ ํžˆํŠธ๊ฐ€ ์™œ ๋‚ฎ์€ ์„ฑ๋Šฅ์„ ์˜๋ฏธํ•˜๋Š”๊ฐ€?
  3. ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ํŒจํ„ด ํ•ด๋… - ๋™์ผํ•œ ์—ฐ์‚ฐ์ด ์–ด๋–ป๊ฒŒ ์ด๋ ‡๊ฒŒ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋Š”๊ฐ€?
  4. ํ”„๋กœํŒŒ์ผ๋ง ๋ฐฉ๋ฒ•๋ก  ํ•™์Šต - ์ถ”์ธก์ด ์•„๋‹Œ NSight ๋„๊ตฌ๋กœ ๊ทผ๊ฑฐ๋ฅผ ํ™•๋ณดํ•˜๋ผ

์™œ ์ค‘์š”ํ•œ๊ฐ€: ์ด ํผ์ฆ์€ CPU ๊ธฐ๋ฐ˜ ์ง๊ด€์— ๋„์ „ํ•˜๋Š” GPU ์„ฑ๋Šฅ์˜ ๊ทผ๋ณธ ์›๋ฆฌ๋ฅผ ๋“œ๋Ÿฌ๋ƒ…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ธฐ๋ฅด๋Š” ์—ญ๋Ÿ‰์€ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ํŒจํ„ด์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ณต์žก๋„๋ณด๋‹ค ์ค‘์š”ํ•œ ์‹ค๋ฌด GPU ์ตœ์ ํ™”์— ์ง์ ‘ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜์ „: ์ด ๊ณผ์ •์€ ํ”„๋กœ๋•์…˜ ์„ฑ๋Šฅ ์ด์Šˆ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๋“ฏ์ด, ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋จผ์ € ๋ณด์ง€ ์•Š๊ณ  ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ๋งŒ์œผ๋กœ ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœํŒŒ์ผ๋ง ๊ฒฐ๊ณผ๋ฅผ ์–ป์€ ํ›„์— ์ฝ”๋“œ๋ฅผ ๋“ค์—ฌ๋‹ค๋ด…๋‹ˆ๋‹ค.

ํƒ์ • ๋„๊ตฌ ๋ชจ์Œ

ํ”„๋กœํŒŒ์ผ๋ง ํŠœํ† ๋ฆฌ์–ผ์—์„œ ๋ฐฐ์šด ๋„๊ตฌ๋“ค:

  • NSight Systems (nsys) - ์–ด๋–ค ์ปค๋„์ด ๋А๋ฆฐ์ง€ ์ฐพ๊ธฐ
  • NSight Compute (ncu) - ์ปค๋„์ด ์™œ ๋А๋ฆฐ์ง€ ๋ถ„์„ํ•˜๊ธฐ
  • ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ ์ง€ํ‘œ - ๋น„ํšจ์œจ์ ์ธ ์ ‘๊ทผ ํŒจํ„ด ํƒ์ง€

์‹œ์ž‘ํ•˜๊ธฐ

Step 1: ๋ฒค์น˜๋งˆํฌ ์‹คํ–‰

pixi shell -e nvidia
mojo problems/p30/p30.mojo --benchmark

์ปค๋„ ๊ฐ„์— ๊ทน์ ์ธ ์‹คํ–‰ ์‹œ๊ฐ„ ์ฐจ์ด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ํ•˜๋‚˜์˜ ์ปค๋„์ด ๋‚˜๋จธ์ง€๋ณด๋‹ค ํ›จ์”ฌ ๋А๋ฆฝ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ๋ณด์ง€ ์•Š๊ณ  ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ๋งŒ์œผ๋กœ ์›์ธ์„ ์ฐพ์•„๋‚ด๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค.

์ถœ๋ ฅ ์˜ˆ์‹œ:

| name    | met (ms)  | iters |
| ------- | --------- | ----- |
| kernel1 | 171.85    | 11    |
| kernel2 | 1546.68   | 11    |  <- ์ด๊ฒƒ๋งŒ ์œ ๋… ๋А๋ฆฌ๋‹ค!
| kernel3 | 172.18    | 11    |

Step 2: ํ”„๋กœํŒŒ์ผ๋ง์„ ์œ„ํ•œ ๋นŒ๋“œ ์ค€๋น„

ํ•„์ˆ˜: ์ •ํ™•ํ•œ ํ”„๋กœํŒŒ์ผ๋ง์„ ์œ„ํ•ด ์ตœ์ ํ™”๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ์ „์ฒด ๋””๋ฒ„๊ทธ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜์—ฌ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค:

mojo build --debug-level=full problems/p30/p30.mojo -o problems/p30/p30_profiler

์ค‘์š”ํ•œ ์ด์œ :

  • ์ „์ฒด ๋””๋ฒ„๊ทธ ์ •๋ณด: ํ”„๋กœํŒŒ์ผ๋Ÿฌ์— ์™„์ „ํ•œ ์‹ฌ๋ณผ ํ…Œ์ด๋ธ”, ๋ณ€์ˆ˜๋ช…, ์†Œ์Šค ๋ผ์ธ ๋งคํ•‘์„ ์ œ๊ณต
  • ์ข…ํ•ฉ ๋ถ„์„: NSight ๋„๊ตฌ๊ฐ€ ์„ฑ๋Šฅ ๋ฐ์ดํ„ฐ๋ฅผ ํŠน์ • ์ฝ”๋“œ ์œ„์น˜์™€ ์—ฐ๊ด€ ์ง“๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅ
  • ์ตœ์ ํ™” ์œ ์ง€: ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ์™€ ๋™์ผํ•œ ํ˜„์‹ค์ ์ธ ์„ฑ๋Šฅ ์ธก์ • ๋ณด์žฅ

Step 3: ์‹œ์Šคํ…œ ์ „์ฒด ์กฐ์‚ฌ (NSight Systems)

๊ฐ ์ปค๋„์„ ํ”„๋กœํŒŒ์ผ๋งํ•˜์—ฌ ์ „์ฒด ๊ทธ๋ฆผ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค:

# ์ตœ์ ํ™” ๋นŒ๋“œ๋กœ ๊ฐ ์ปค๋„์„ ๊ฐœ๋ณ„ ํ”„๋กœํŒŒ์ผ๋ง (์ฝœ๋“œ ์Šคํƒ€ํŠธ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ ์›Œ๋ฐ์—… ํฌํ•จ)
nsys profile --trace=cuda,osrt,nvtx --delay=2 --output=./problems/p30/kernel1_profile ./problems/p30/p30_profiler --kernel1
nsys profile --trace=cuda,osrt,nvtx --delay=2 --output=./problems/p30/kernel2_profile ./problems/p30/p30_profiler --kernel2
nsys profile --trace=cuda,osrt,nvtx --delay=2 --output=./problems/p30/kernel3_profile ./problems/p30/p30_profiler --kernel3

# ๊ฒฐ๊ณผ ๋ถ„์„
nsys stats --force-export=true ./problems/p30/kernel1_profile.nsys-rep > ./problems/p30/kernel1_profile.txt
nsys stats --force-export=true ./problems/p30/kernel2_profile.nsys-rep > ./problems/p30/kernel2_profile.txt
nsys stats --force-export=true ./problems/p30/kernel3_profile.nsys-rep > ./problems/p30/kernel3_profile.txt

ํ™•์ธํ•  ์‚ฌํ•ญ:

  • GPU ์ปค๋„ ์š”์•ฝ - ์–ด๋–ค ์ปค๋„์ด ๊ฐ€์žฅ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š”๊ฐ€?
  • ์ปค๋„ ์‹คํ–‰ ์‹œ๊ฐ„ - ์ฐจ์ด๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋‚˜๋Š”๊ฐ€?
  • ๋ฉ”๋ชจ๋ฆฌ ์ „์†ก ํŒจํ„ด - ๊ตฌํ˜„ ๊ฐ„์— ๋น„์Šทํ•œ๊ฐ€?

Step 4: ์ปค๋„ ์‹ฌ์ธต ๋ถ„์„ (NSight Compute)

๋А๋ฆฐ ์ปค๋„์„ ์‹๋ณ„ํ•œ ํ›„, NSight Compute๋กœ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค:

# ์ตœ์ ํ™” ๋นŒ๋“œ๋กœ ๊ฐ ์ปค๋„์˜ ๋ฉ”๋ชจ๋ฆฌ ํŒจํ„ด ์‹ฌ์ธต ๋ถ„์„
ncu --set=@roofline --section=MemoryWorkloadAnalysis -f -o ./problems/p30/kernel1_analysis ./problems/p30/p30_profiler --kernel1
ncu --set=@roofline --section=MemoryWorkloadAnalysis -f -o ./problems/p30/kernel2_analysis ./problems/p30/p30_profiler --kernel2
ncu --set=@roofline --section=MemoryWorkloadAnalysis -f -o ./problems/p30/kernel3_analysis ./problems/p30/p30_profiler --kernel3

# ๊ฒฐ๊ณผ ํ™•์ธ
ncu --import ./problems/p30/kernel1_analysis.ncu-rep --page details
ncu --import ./problems/p30/kernel2_analysis.ncu-rep --page details
ncu --import ./problems/p30/kernel3_analysis.ncu-rep --page details

์œ„ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ถœ๋ ฅ์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค:

Kernel1: Memory Throughput: ~308 Gbyte/s, Max Bandwidth: ~51%
Kernel2: Memory Throughput: ~6 Gbyte/s,   Max Bandwidth: ~12%
Kernel3: Memory Throughput: ~310 Gbyte/s, Max Bandwidth: ~52%

์ฃผ์š” ์กฐ์‚ฌ ์ง€ํ‘œ:

  • Memory Throughput (Gbyte/s) - ์‹ค์ œ ๋‹ฌ์„ฑํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋Œ€์—ญํญ
  • Max Bandwidth (%) - ์ด๋ก ์  ์ตœ๋Œ€ ๋Œ€์—ญํญ ๋Œ€๋น„ ํ™œ์šฉ๋ฅ 
  • L1/TEX Hit Rate (%) - L1 ์บ์‹œ ํšจ์œจ
  • L2 Hit Rate (%) - L2 ์บ์‹œ ํšจ์œจ

๐Ÿค” ๋ฐ˜์ง๊ด€์ ์ธ ๊ฒฐ๊ณผ: Kernel2๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ์บ์‹œ ํžˆํŠธ์œจ์„ ๋ณด์ด๋ฉด์„œ ๊ฐ€์žฅ ๋‚ฎ์€ ์„ฑ๋Šฅ์„ ๋ณด์ž…๋‹ˆ๋‹ค! ์ด๊ฒƒ์ด ํ’€์–ด์•ผ ํ•  ํ•ต์‹ฌ ๋ฏธ์Šคํ„ฐ๋ฆฌ์ž…๋‹ˆ๋‹ค.

Step 5: ํƒ์ • ์งˆ๋ฌธ

ํ”„๋กœํŒŒ์ผ๋ง ๊ทผ๊ฑฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ปค๋„ ์ฝ”๋“œ problems/p30/p30.mojo๋ฅผ ์‚ดํŽด๋ณด๋ฉฐ ๋‹ค์Œ ์งˆ๋ฌธ์— ๋‹ตํ•ด ๋ณด์„ธ์š”:

์„ฑ๋Šฅ ๋ถ„์„

  1. ์–ด๋–ค ์ปค๋„์ด ๊ฐ€์žฅ ๋†’์€ Memory Throughput์„ ๋‹ฌ์„ฑํ•˜๋Š”๊ฐ€? (Gbyte/s ๊ฐ’ ํ™•์ธ)
  2. ์–ด๋–ค ์ปค๋„์˜ Max Bandwidth ํ™œ์šฉ๋ฅ ์ด ๊ฐ€์žฅ ๋‚ฎ์€๊ฐ€? (๋ฐฑ๋ถ„์œจ ๋น„๊ต)
  3. ๋ฉ”๋ชจ๋ฆฌ ์ฒ˜๋ฆฌ๋Ÿ‰์˜ ์„ฑ๋Šฅ ๊ฒฉ์ฐจ๋Š” ์–ผ๋งˆ์ธ๊ฐ€? (๊ฐ€์žฅ ๋น ๋ฅธ ๊ฒƒ๊ณผ ๊ฐ€์žฅ ๋А๋ฆฐ ๊ฒƒ์˜ ๋ฐฐ์ˆ˜ ์ฐจ์ด)

์บ์‹œ์˜ ์—ญ์„ค

  1. ์–ด๋–ค ์ปค๋„์˜ L1/TEX Hit Rate๊ฐ€ ๊ฐ€์žฅ ๋†’์€๊ฐ€?
  2. ์–ด๋–ค ์ปค๋„์˜ L2 Hit Rate๊ฐ€ ๊ฐ€์žฅ ๋†’์€๊ฐ€?
  3. ๐Ÿคฏ ์บ์‹œ ํžˆํŠธ์œจ์ด ๊ฐ€์žฅ ๋†’์€ ์ปค๋„์ด ์™œ ์„ฑ๋Šฅ์ด ๊ฐ€์žฅ ๋‚˜์œ๊ฐ€?

๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ํŒจํ„ด ํƒ๊ตฌ

  1. ๋†’์€ ์บ์‹œ ํžˆํŠธ์œจ์ด ์‹ค์ œ๋กœ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š”๊ฐ€?
  2. ์–ด๋–ค ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ํŒจํ„ด์ด ๋†’์€ ์บ์‹œ ํžˆํŠธ์™€ ๋‚ฎ์€ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ๋™์‹œ์— ์œ ๋ฐœํ•˜๋Š”๊ฐ€?
  3. ์™œ โ€œํšจ์œจ์ ์ธ ์บ์‹ฑโ€œ์ด โ€œ๋น„ํšจ์œจ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผโ€œ์˜ ์ฆ์ƒ์ผ ์ˆ˜ ์žˆ๋Š”๊ฐ€?

โ€œ์•„ํ•˜!โ€ ์ˆœ๊ฐ„

  1. ํ”„๋กœํŒŒ์ผ๋ง ๊ทผ๊ฑฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ, ์ด ์‚ฌ๋ก€๊ฐ€ ๋ณด์—ฌ์ฃผ๋Š” GPU ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ทผ๋ณธ ์›๋ฆฌ๋Š” ๋ฌด์—‡์ธ๊ฐ€?

๋ฐœ๊ฒฌํ•  ํ•ต์‹ฌ ํ†ต์ฐฐ: ๋•Œ๋กœ๋Š” ๋†’์€ ์บ์‹œ ํžˆํŠธ์œจ์ด ์„ฑ๋Šฅ ์Šน๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ผ ์œ„ํ—˜ ์‹ ํ˜ธ์ž…๋‹ˆ๋‹ค!

์†”๋ฃจ์…˜

์ด ๋ฏธ์Šคํ„ฐ๋ฆฌ๋Š” GPU ์„ฑ๋Šฅ์˜ ๊ทผ๋ณธ ์›๋ฆฌ๋ฅผ ๋“œ๋Ÿฌ๋ƒ…๋‹ˆ๋‹ค: ์ปค๋„์ด ๋™์ผํ•œ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋”๋ผ๋„ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ”์šด๋“œ ์—ฐ์‚ฐ์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ํŒจํ„ด์ด ์„ฑ๋Šฅ์„ ์ง€๋ฐฐํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœํŒŒ์ผ๋ง ๊ทผ๊ฑฐ๊ฐ€ ๋ฐํžˆ๋Š” ๊ฒƒ:

  1. ์„ฑ๋Šฅ ์œ„๊ณ„: Kernel1๊ณผ Kernel3์€ ๋น ๋ฅด๊ณ , Kernel2๋Š” ์น˜๋ช…์ ์œผ๋กœ ๋А๋ฆผ (์ˆ˜์‹ญ ๋ฐฐ ์ฐจ์ด)
  2. ๋ฉ”๋ชจ๋ฆฌ ์ฒ˜๋ฆฌ๋Ÿ‰์ด ๋‹ต์„ ๋งํ•ด์ค€๋‹ค: ๋น ๋ฅธ ์ปค๋„์€ ๋†’์€ ๋Œ€์—ญํญ ํ™œ์šฉ๋ฅ ์„ ๋‹ฌ์„ฑํ•˜๊ณ , ๋А๋ฆฐ ์ปค๋„์€ ์ตœ์†Œํ•œ์˜ ํ™œ์šฉ๋ฅ ๋งŒ ๋‹ฌ์„ฑ
  3. ์บ์‹œ์˜ ์—ญ์„ค: ๊ฐ€์žฅ ๋А๋ฆฐ ์ปค๋„์ด ๊ฐ€์žฅ ๋†’์€ ์บ์‹œ ํžˆํŠธ์œจ์„ ๋ณด์ž„ - ๋†’์€ ์บ์‹œ ํžˆํŠธ๊ฐ€ ๋น„ํšจ์œจ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ํŒจํ„ด์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Œ์„ ์‹œ์‚ฌ
  4. ๋ฉ”๋ชจ๋ฆฌ ๋ฐ”์šด๋“œ GPU ์›Œํฌ๋กœ๋“œ์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ํŒจํ„ด์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ณต์žก๋„๋ณด๋‹ค ์ค‘์š”
์ƒ์„ธ ์†”๋ฃจ์…˜๊ณผ ์‹ฌ์ธต ์„ค๋ช…

์ด ํ”„๋กœํŒŒ์ผ๋ง ํƒ์ • ์‚ฌ๊ฑด์€ ์ปค๋„์ด ๋™์ผํ•œ ์ˆ˜ํ•™ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋”๋ผ๋„ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ํŒจํ„ด์ด ์–ด๋–ป๊ฒŒ ์ˆ˜์‹ญ ๋ฐฐ์˜ ์„ฑ๋Šฅ ์ฐจ์ด๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

ํ”„๋กœํŒŒ์ผ๋ง์œผ๋กœ ํ™•์ธํ•œ ์„ฑ๋Šฅ ๊ทผ๊ฑฐ

NSight Systems ํƒ€์ž„๋ผ์ธ ๋ถ„์„:

  • Kernel 1: ์งง์€ ์‹คํ–‰ ์‹œ๊ฐ„ - ํšจ์œจ์ 
  • Kernel 3: Kernel 1๊ณผ ์œ ์‚ฌ - ํšจ์œจ์ 
  • Kernel 2: ๊ทน์ ์œผ๋กœ ๊ธด ์‹คํ–‰ ์‹œ๊ฐ„ - ๋น„ํšจ์œจ์ 

NSight Compute ๋ฉ”๋ชจ๋ฆฌ ๋ถ„์„ (ํ•˜๋“œ์›จ์–ด ๋ฌด๊ด€ํ•œ ํŒจํ„ด):

  • ํšจ์œจ์ ์ธ ์ปค๋„ (1 & 3): ๋†’์€ ๋ฉ”๋ชจ๋ฆฌ ์ฒ˜๋ฆฌ๋Ÿ‰, ์–‘ํ˜ธํ•œ ๋Œ€์—ญํญ ํ™œ์šฉ๋ฅ , ๋ณดํ†ต ์ˆ˜์ค€์˜ ์บ์‹œ ํžˆํŠธ์œจ
  • ๋น„ํšจ์œจ์ ์ธ ์ปค๋„ (2): ๋งค์šฐ ๋‚ฎ์€ ๋ฉ”๋ชจ๋ฆฌ ์ฒ˜๋ฆฌ๋Ÿ‰, ์—ด์•…ํ•œ ๋Œ€์—ญํญ ํ™œ์šฉ๋ฅ , ๊ทน๋„๋กœ ๋†’์€ ์บ์‹œ ํžˆํŠธ์œจ

์บ์‹œ์˜ ์—ญ์„ค ๊ทœ๋ช…

๐Ÿคฏ ๋ฐ˜์ง๊ด€์ ์ธ ๋ฐœ๊ฒฌ:

  • Kernel2๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ์บ์‹œ ํžˆํŠธ์œจ์„ ๋ณด์ด๋ฉด์„œ ์„ฑ๋Šฅ์€ ์ตœ์•…
  • ๊ธฐ์กด ์ƒ์‹์— ๋Œ€ํ•œ ๋„์ „: โ€œ๋†’์€ ์บ์‹œ ํžˆํŠธ = ์ข‹์€ ์„ฑ๋Šฅโ€
  • ์ง„์‹ค: ๋†’์€ ์บ์‹œ ํžˆํŠธ์œจ์€ ๋น„ํšจ์œจ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ํŒจํ„ด์˜ ์ฆ์ƒ์ผ ์ˆ˜ ์žˆ์Œ

์บ์‹œ์˜ ์—ญ์„ค์ด ๋ฐœ์ƒํ•˜๋Š” ์ด์œ :

์ „ํ†ต์ ์ธ CPU ์ง๊ด€ (GPU์—์„œ๋Š” ํ‹€๋ฆผ):

  • ์บ์‹œ ํžˆํŠธ์œจ์ด ๋†’์„์ˆ˜๋ก ํ•ญ์ƒ ์„ฑ๋Šฅ์ด ์ข‹๋‹ค
  • ์บ์‹œ ํžˆํŠธ๋Š” ๋ฉ”๋ชจ๋ฆฌ ํŠธ๋ž˜ํ”ฝ์„ ์ค„์—ฌ ํšจ์œจ์„ ๋†’์ธ๋‹ค

GPU ๋ฉ”๋ชจ๋ฆฌ์˜ ํ˜„์‹ค (์˜ฌ๋ฐ”๋ฅธ ์ดํ•ด):

  • ๋ฉ”๋ชจ๋ฆฌ ๋ฐ”์šด๋“œ ์›Œํฌ๋กœ๋“œ์—์„œ๋Š” ๋ณ‘ํ•ฉ์ด ์บ์‹ฑ๋ณด๋‹ค ์ค‘์š”
  • ๋น„ํšจ์œจ์ ์ธ ์ ‘๊ทผ ํŒจํ„ด์€ ์ธ์œ„์ ์œผ๋กœ ์บ์‹œ ํžˆํŠธ์œจ์„ ๋ถ€ํ’€๋ฆด ์ˆ˜ ์žˆ์Œ
  • ๋ฉ”๋ชจ๋ฆฌ ๋Œ€์—ญํญ ํ™œ์šฉ๋ฅ ์ด ์ง„์ •ํ•œ ์„ฑ๋Šฅ ์ง€ํ‘œ

๊ทผ๋ณธ ์›์ธ ๋ถ„์„ - ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ํŒจํ„ด

p30.mojo์˜ ์‹ค์ œ ์ปค๋„ ๊ตฌํ˜„:

Kernel 1 - ํšจ์œจ์ ์ธ ๋ณ‘ํ•ฉ ์ ‘๊ทผ:

fn kernel1[
    layout: Layout
](
    output: LayoutTensor[dtype, layout, MutAnyOrigin],
    a: LayoutTensor[dtype, layout, ImmutAnyOrigin],
    b: LayoutTensor[dtype, layout, ImmutAnyOrigin],
    size: Int,
):
    i = Int(block_dim.x * block_idx.x + thread_idx.x)
    if i < size:
        output[i] = a[i] + b[i]


ํ‘œ์ค€ ์Šค๋ ˆ๋“œ ์ธ๋ฑ์‹ฑ - ์ธ์ ‘ ์Šค๋ ˆ๋“œ๊ฐ€ ์ธ์ ‘ ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผ

Kernel 2 - ๋น„ํšจ์œจ์ ์ธ ์ŠคํŠธ๋ผ์ด๋“œ ์ ‘๊ทผ:

fn kernel2[
    layout: Layout
](
    output: LayoutTensor[dtype, layout, MutAnyOrigin],
    a: LayoutTensor[dtype, layout, ImmutAnyOrigin],
    b: LayoutTensor[dtype, layout, ImmutAnyOrigin],
    size: Int,
):
    tid = Int(block_idx.x * block_dim.x + thread_idx.x)
    stride = 512

    i = tid
    while i < size:
        output[i] = a[i] + b[i]
        i += stride


ํฐ stride=512๋กœ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ๊ฐ„๊ฒฉ ๋ฐœ์ƒ - ๋™์ผํ•œ ์—ฐ์‚ฐ์ด์ง€๋งŒ ํฉ์–ด์ง„ ์ ‘๊ทผ

Kernel 3 - ํšจ์œจ์ ์ธ ์—ญ์ˆœ ์ ‘๊ทผ:

fn kernel3[
    layout: Layout
](
    output: LayoutTensor[dtype, layout, MutAnyOrigin],
    a: LayoutTensor[dtype, layout, ImmutAnyOrigin],
    b: LayoutTensor[dtype, layout, ImmutAnyOrigin],
    size: Int,
):
    tid = Int(block_idx.x * block_dim.x + thread_idx.x)
    total_threads = (SIZE // 1024) * 1024

    for step in range(0, size, total_threads):
        forward_i = step + tid
        if forward_i < size:
            reverse_i = size - 1 - forward_i
            output[reverse_i] = a[reverse_i] + b[reverse_i]


์—ญ์ˆœ ์ธ๋ฑ์‹ฑ์ด์ง€๋งŒ ์—ฌ์ „ํžˆ ์˜ˆ์ธก ๊ฐ€๋Šฅ - ์ธ์ ‘ ์Šค๋ ˆ๋“œ๊ฐ€ ์ธ์ ‘ ์ฃผ์†Œ์— ์ ‘๊ทผ (๋ฐฉํ–ฅ๋งŒ ๋ฐ˜๋Œ€)

ํŒจํ„ด ๋ถ„์„:

  • Kernel 1: ์ „ํ˜•์ ์ธ ๋ณ‘ํ•ฉ ์ ‘๊ทผ - ์ธ์ ‘ ์Šค๋ ˆ๋“œ๊ฐ€ ์ธ์ ‘ ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผ
  • Kernel 2: ์น˜๋ช…์ ์ธ ์ŠคํŠธ๋ผ์ด๋“œ ์ ‘๊ทผ - ์Šค๋ ˆ๋“œ๊ฐ€ 512๊ฐœ ์š”์†Œ์”ฉ ๊ฑด๋„ˆ๋œ€
  • Kernel 3: ์—ญ์ˆœ์ด์ง€๋งŒ ์›Œํ”„ ๋‚ด์—์„œ๋Š” ๋ณ‘ํ•ฉ ์œ ์ง€ - ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ํŒจํ„ด

๋ฉ”๋ชจ๋ฆฌ ์‹œ์Šคํ…œ ์ดํ•ด

GPU ๋ฉ”๋ชจ๋ฆฌ ์•„ํ‚คํ…์ฒ˜ ๊ธฐ์ดˆ:

  • ์›Œํ”„ ์‹คํ–‰: 32๊ฐœ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•จ๊ป˜ ์‹คํ–‰
  • ์บ์‹œ ๋ผ์ธ ํฌ๊ธฐ: 128๋ฐ”์ดํŠธ (float32 ๊ฐ’ 32๊ฐœ)
  • ๋ณ‘ํ•ฉ ์š”๊ฑด: ์ธ์ ‘ ์Šค๋ ˆ๋“œ๊ฐ€ ์ธ์ ‘ ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ•ด์•ผ ํ•จ

p30.mojo ์„ค์ • ์ƒ์„ธ:

comptime SIZE = 16 * 1024 * 1024          # 16M ์š”์†Œ (float32 ๋ฐ์ดํ„ฐ 64MB)
comptime THREADS_PER_BLOCK = (1024, 1)    # ๋ธ”๋ก๋‹น 1024 ์Šค๋ ˆ๋“œ
comptime BLOCKS_PER_GRID = (SIZE // 1024, 1)  # ์ด 16,384 ๋ธ”๋ก
comptime dtype = DType.float32             # ์š”์†Œ๋‹น 4๋ฐ”์ดํŠธ

์ด ์„ค์ •์ด ์ค‘์š”ํ•œ ์ด์œ :

  • ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ์…‹ (16M): ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ํŒจํ„ด์˜ ์ฐจ์ด๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ๋“œ๋Ÿฌ๋‚จ
  • ๋ธ”๋ก๋‹น 1024 ์Šค๋ ˆ๋“œ: CUDA ์ตœ๋Œ€ ์Šค๋ ˆ๋“œ ์ˆ˜
  • ๋ธ”๋ก๋‹น 32๊ฐœ ์›Œํ”„: ๊ฐ ๋ธ”๋ก์— 32๊ฐœ์˜ ์›Œํ”„(๊ฐ 32 ์Šค๋ ˆ๋“œ)๊ฐ€ ํฌํ•จ

๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ํšจ์œจ ์‹œ๊ฐํ™”:

KERNEL 1 (๋ณ‘ํ•ฉ):                KERNEL 2 (stride 512):
์›Œํ”„ ์Šค๋ ˆ๋“œ 0-31:               ์›Œํ”„ ์Šค๋ ˆ๋“œ 0-31:
  Thread 0: Memory[0]            Thread 0: Memory[0]
  Thread 1: Memory[1]            Thread 1: Memory[512]
  Thread 2: Memory[2]            Thread 2: Memory[1024]
  ...                           ...
  Thread 31: Memory[31]          Thread 31: Memory[15872]

๊ฒฐ๊ณผ: ์บ์‹œ ๋ผ์ธ 1ํšŒ fetch          ๊ฒฐ๊ณผ: ๋ณ„๋„์˜ ์บ์‹œ ๋ผ์ธ 32ํšŒ fetch
์ƒํƒœ: ~308 GB/s ์ฒ˜๋ฆฌ๋Ÿ‰            ์ƒํƒœ: ~6 GB/s ์ฒ˜๋ฆฌ๋Ÿ‰
์บ์‹œ: ํšจ์œจ์  ํ™œ์šฉ                  ์บ์‹œ: ๊ฐ™์€ ๋ผ์ธ์„ ๋ฐ˜๋ณต ํžˆํŠธ!

KERNEL 3 (์—ญ์ˆœ์ด์ง€๋งŒ ๋ณ‘ํ•ฉ):

์›Œํ”„ ์Šค๋ ˆ๋“œ 0-31 (์ฒซ ๋ฒˆ์งธ ๋ฐ˜๋ณต):
  Thread 0: Memory[SIZE-1]     (reverse_i = SIZE-1-0)
  Thread 1: Memory[SIZE-2]     (reverse_i = SIZE-1-1)
  Thread 2: Memory[SIZE-3]     (reverse_i = SIZE-1-2)
  ...
  Thread 31: Memory[SIZE-32]   (reverse_i = SIZE-1-31)

๊ฒฐ๊ณผ: ์ธ์ ‘ํ•œ ์ฃผ์†Œ (๋ฐฉํ–ฅ๋งŒ ๋ฐ˜๋Œ€)
์ƒํƒœ: ~310 GB/s ์ฒ˜๋ฆฌ๋Ÿ‰ (Kernel 1๊ณผ ๊ฑฐ์˜ ๋™์ผ)
์บ์‹œ: ์—ญ์ˆœ์ž„์—๋„ ํšจ์œจ์  ํ™œ์šฉ

์บ์‹œ์˜ ์—ญ์„ค ์„ค๋ช…

Kernel2 (stride=512)๊ฐ€ ๋†’์€ ์บ์‹œ ํžˆํŠธ์œจ์—๋„ ์„ฑ๋Šฅ์ด ๋‚˜์œ ์ด์œ :

stride=512์˜ ์žฌ์•™ ์„ค๋ช…:

# ๊ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ํฐ ๊ฐ„๊ฒฉ์œผ๋กœ ์—ฌ๋Ÿฌ ์š”์†Œ๋ฅผ ์ฒ˜๋ฆฌ:
Thread 0: elements [0, 512, 1024, 1536, 2048, ...]
Thread 1: elements [1, 513, 1025, 1537, 2049, ...]
Thread 2: elements [2, 514, 1026, 1538, 2050, ...]
...

์ด๊ฒƒ์ด ์บ์‹œ์˜ ์—ญ์„ค์„ ๋งŒ๋“œ๋Š” ์ด์œ :

  1. ์บ์‹œ ๋ผ์ธ ๋ฐ˜๋ณต: 512๊ฐœ ์š”์†Œ๋ฅผ ๊ฑด๋„ˆ๋›ฐ์–ด๋„ ๊ฒน์น˜๋Š” ์บ์‹œ ๋ผ์ธ ์˜์—ญ ์•ˆ์— ๋จธ๋ฌด๋ฆ„
  2. ๊ฑฐ์ง“ ํšจ์œจ์˜ ํ™˜์ƒ: ๊ฐ™์€ ์บ์‹œ ๋ผ์ธ์— ๋ฐ˜๋ณต ์ ‘๊ทผ = ์ธ์œ„์ ์œผ๋กœ ๋†’์€ โ€œํžˆํŠธ์œจโ€
  3. ๋Œ€์—ญํญ ์žฌ์•™: 32๊ฐœ ์Šค๋ ˆ๋“œ ร— 32๊ฐœ ๋ณ„๋„ ์บ์‹œ ๋ผ์ธ = ๋ง‰๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ ํŠธ๋ž˜ํ”ฝ
  4. ์›Œํ”„ ์‹คํ–‰ ๋ถˆ์ผ์น˜: GPU๋Š” ๋ณ‘ํ•ฉ ์ ‘๊ทผ์— ๋งž๊ฒŒ ์„ค๊ณ„๋˜์—ˆ์ง€๋งŒ, ํฉ์–ด์ง„ ์ ‘๊ทผ์„ ๋ฐ›์Œ

float32 (๊ฐ 4๋ฐ”์ดํŠธ) ๊ตฌ์ฒด ์˜ˆ์‹œ:

  • ์บ์‹œ ๋ผ์ธ: 128๋ฐ”์ดํŠธ = float32 ๊ฐ’ 32๊ฐœ
  • stride 512: ์Šค๋ ˆ๋“œ๊ฐ€ 512ร—4 = 2048๋ฐ”์ดํŠธ = 16 ์บ์‹œ ๋ผ์ธ ๊ฐ„๊ฒฉ์œผ๋กœ ์ ํ”„!
  • ์›Œํ”„ ์˜ํ–ฅ: 32๊ฐœ ์Šค๋ ˆ๋“œ๊ฐ€ 1๊ฐœ ๋Œ€์‹  32๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ์บ์‹œ ๋ผ์ธ์„ ํ•„์š”๋กœ ํ•จ

ํ•ต์‹ฌ ํ†ต์ฐฐ: Kernel2์˜ ๋†’์€ ์บ์‹œ ํžˆํŠธ๋Š” ๋น„ํšจ์œจ์ ์œผ๋กœ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋ฐ˜๋ณต ์ ‘๊ทผ์ด์ง€, ํ˜„๋ช…ํ•œ ์บ์‹ฑ์ด ์•„๋‹™๋‹ˆ๋‹ค!

ํ”„๋กœํŒŒ์ผ๋ง ๋ฐฉ๋ฒ•๋ก  ํ†ต์ฐฐ

์ฒด๊ณ„์  ํƒ์ • ์ ‘๊ทผ๋ฒ•:

1๋‹จ๊ณ„: NSight Systems (์ „์ฒด ๊ทธ๋ฆผ)

  • ์–ด๋–ค ์ปค๋„์ด ๋А๋ฆฐ์ง€ ์‹๋ณ„
  • ๋ช…๋ฐฑํ•œ ๋ณ‘๋ชฉ ๋ฐฐ์ œ (๋ฉ”๋ชจ๋ฆฌ ์ „์†ก, API ์˜ค๋ฒ„ํ—ค๋“œ)
  • ์ปค๋„ ์‹คํ–‰ ์‹œ๊ฐ„ ์ฐจ์ด์— ์ง‘์ค‘

2๋‹จ๊ณ„: NSight Compute (์‹ฌ์ธต ๋ถ„์„)

  • ๋ฉ”๋ชจ๋ฆฌ ์ฒ˜๋ฆฌ๋Ÿ‰ ์ง€ํ‘œ ๋ถ„์„
  • ๋Œ€์—ญํญ ํ™œ์šฉ๋ฅ  ๋ฐฑ๋ถ„์œจ ๋น„๊ต
  • ์บ์‹œ ํžˆํŠธ์œจ๊ณผ ํŒจํ„ด ์กฐ์‚ฌ

3๋‹จ๊ณ„: ๊ทผ๊ฑฐ๋ฅผ ์ด๋ก ์œผ๋กœ ์—ฐ๊ฒฐ

ํ”„๋กœํŒŒ์ผ๋ง ๊ทผ๊ฑฐ โ†’ ์ฝ”๋“œ ๋ถ„์„:

NSight Compute ๊ฒฐ๊ณผ:              ์‹ค์ œ ์ฝ”๋“œ ํŒจํ„ด:
- Kernel1: ~308 GB/s            โ†’ i = block_idx*block_dim + thread_idx (๋ณ‘ํ•ฉ)
- Kernel2: ~6 GB/s, 99% L2 hits โ†’ i += 512 (์น˜๋ช…์  stride)
- Kernel3: ~310 GB/s            โ†’ reverse_i = size-1-forward_i (์—ญ์ˆœ ๋ณ‘ํ•ฉ)

ํ”„๋กœํŒŒ์ผ๋Ÿฌ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ํšจ์œจ์„ ์ง์ ‘ ๋“œ๋Ÿฌ๋ƒ…๋‹ˆ๋‹ค!

๊ทผ๊ฑฐ์—์„œ ์ฝ”๋“œ๋กœ์˜ ์—ฐ๊ฒฐ:

  • ๋†’์€ ์ฒ˜๋ฆฌ๋Ÿ‰ + ๋ณดํ†ต ์บ์‹œ ํžˆํŠธ์œจ = ๋ณ‘ํ•ฉ ์ ‘๊ทผ (Kernel 1 & 3)
  • ๋‚ฎ์€ ์ฒ˜๋ฆฌ๋Ÿ‰ + ๋†’์€ ์บ์‹œ ํžˆํŠธ์œจ = ๋น„ํšจ์œจ์  ์ŠคํŠธ๋ผ์ด๋“œ ์ ‘๊ทผ (Kernel 2)
  • ๋ฉ”๋ชจ๋ฆฌ ๋Œ€์—ญํญ ํ™œ์šฉ๋ฅ ์ด ์บ์‹œ ํ†ต๊ณ„์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ์ง„์ •ํ•œ ํšจ์œจ์„ ๋“œ๋Ÿฌ๋ƒ„

์‹ค๋ฌด ์„ฑ๋Šฅ ์‹œ์‚ฌ์ 

์ด ํŒจํ„ด์ด ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” GPU ์‘์šฉ ๋ถ„์•ผ:

๊ณผํ•™ ์ปดํ“จํŒ…:

  • ์Šคํ…์‹ค ์—ฐ์‚ฐ: ๊ทธ๋ฆฌ๋“œ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์—์„œ์˜ ์ด์›ƒ ์ ‘๊ทผ ํŒจํ„ด
  • ์„ ํ˜• ๋Œ€์ˆ˜: ํ–‰๋ ฌ ์ˆœํšŒ ์ˆœ์„œ (ํ–‰ ์šฐ์„  vs ์—ด ์šฐ์„ )
  • ํŽธ๋ฏธ๋ถ„ ๋ฐฉ์ •์‹ ํ’€์ด: ์œ ํ•œ ์ฐจ๋ถ„๋ฒ•์—์„œ์˜ ๊ฒฉ์ž์  ์ ‘๊ทผ ํŒจํ„ด

๊ทธ๋ž˜ํ”ฝ์Šค ๋ฐ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ:

  • ํ…์Šค์ฒ˜ ํ•„ํ„ฐ๋ง: ์…ฐ์ด๋”์—์„œ์˜ ์ƒ˜ํ”Œ ์ ‘๊ทผ ํŒจํ„ด
  • ์ด๋ฏธ์ง€ ํ•ฉ์„ฑ๊ณฑ: ํ•„ํ„ฐ ์ปค๋„์˜ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ
  • ์ƒ‰ ๊ณต๊ฐ„ ๋ณ€ํ™˜: ์ฑ„๋„ ์ธํ„ฐ๋ฆฌ๋น™ ์ „๋žต

๋จธ์‹ ๋Ÿฌ๋‹:

  • ํ–‰๋ ฌ ์—ฐ์‚ฐ: GEMM์—์„œ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ ์ตœ์ ํ™”
  • ํ…์„œ ์ถ•์•ฝ: ๋‹ค์ฐจ์› ๋ฐฐ์—ด ์ ‘๊ทผ ํŒจํ„ด
  • ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ: ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ์™€ ์ „์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ

GPU ์ตœ์ ํ™”์˜ ๊ทผ๋ณธ ์›์น™

๋ฉ”๋ชจ๋ฆฌ ์šฐ์„  ์ตœ์ ํ™” ์ „๋žต:

  1. ๋ฉ”๋ชจ๋ฆฌ ํŒจํ„ด์ด ์ง€๋ฐฐ: ์ ‘๊ทผ ํŒจํ„ด์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ณต์žก๋„๋ณด๋‹ค ๋” ์ค‘์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Œ
  2. ๋ณ‘ํ•ฉ์ด ํ•ต์‹ฌ: ์ธ์ ‘ ์Šค๋ ˆ๋“œ๊ฐ€ ์ธ์ ‘ ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ•˜๋„๋ก ์„ค๊ณ„
  3. ๋Œ€์—ญํญ ํ™œ์šฉ๋ฅ  ์ธก์ •: ์บ์‹œ ํ†ต๊ณ„๊ฐ€ ์•„๋‹Œ ์‹ค์ œ ์ฒ˜๋ฆฌ๋Ÿ‰์— ์ง‘์ค‘
  4. ์ฒด๊ณ„์  ํ”„๋กœํŒŒ์ผ๋ง: NSight ๋„๊ตฌ๋กœ ์‹ค์ œ ๋ณ‘๋ชฉ์„ ํŒŒ์•…

ํ•ต์‹ฌ ๊ธฐ์ˆ  ํ†ต์ฐฐ:

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

ํ•ต์‹ฌ ๊ตํ›ˆ

์ด๋ฒˆ์— ํƒ๊ตฌํ•œ ์‚ฌ๋ก€๋Š” GPU ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ CPU ์ง๊ด€์„ ๋ฒ„๋ฆฌ๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์ค‘์‹ฌ ์‚ฌ๊ณ ๋กœ ์ „ํ™˜ํ•  ๊ฒƒ์„ ์š”๊ตฌํ•œ๋‹ค๋Š” ์ ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค:

ํ•ต์‹ฌ ํ†ต์ฐฐ:

  • ๋†’์€ ์บ์‹œ ํžˆํŠธ์œจ์€ ์ข‹์€ ์„ฑ๋Šฅ์ด ์•„๋‹ˆ๋ผ ๋น„ํšจ์œจ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ํŒจํ„ด์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Œ
  • ๋ฉ”๋ชจ๋ฆฌ ๋Œ€์—ญํญ ํ™œ์šฉ๋ฅ ์ด ์บ์‹œ ํ†ต๊ณ„๋ณด๋‹ค ์ค‘์š”
  • ๋‹จ์ˆœํ•œ ๋ณ‘ํ•ฉ ํŒจํ„ด์ด ๋ณต์žกํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋ณด๋‹ค ๋” ๋น ๋ฅธ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Œ
  • ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ๊ฐ€ ์ง๊ด€์œผ๋กœ๋Š” ์•Œ ์ˆ˜ ์—†๋Š” ์„ฑ๋Šฅ์˜ ์ง„์‹ค์„ ๋“œ๋Ÿฌ๋ƒ„

์‹ค์ „ ๋ฐฉ๋ฒ•๋ก :

  • NSight Systems์™€ NSight Compute๋กœ ์ฒด๊ณ„์ ์œผ๋กœ ํ”„๋กœํŒŒ์ผ๋ง
  • ์ธ์ ‘ ์Šค๋ ˆ๋“œ๊ฐ€ ์ธ์ ‘ ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ•˜๋„๋ก ์„ค๊ณ„ (๋ณ‘ํ•ฉ)
  • ์ง๊ด€์ด ์•„๋‹Œ ํ”„๋กœํŒŒ์ผ๋Ÿฌ ๊ทผ๊ฑฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ตœ์ ํ™” ๊ฒฐ์ •

์บ์‹œ์˜ ์—ญ์„ค์€ ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•œ ์ดํ•ด ์—†์ด ๊ณ ์ˆ˜์ค€ ์ง€ํ‘œ์— ์˜์กดํ•˜๋ฉด ์ž˜๋ชป๋œ ๊ฒฐ๋ก ์— ์ด๋ฅผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค - GPU ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋„˜์–ด ๋‘๋ฃจ ์ ์šฉ๋˜๋Š” ๊ตํ›ˆ์ž…๋‹ˆ๋‹ค.