๐Ÿ“Š Mojo ๋ฒค์น˜๋งˆํ‚น - ์„ฑ๋Šฅ ๋ถ„์„๊ณผ ์ตœ์ ํ™”

๊ฐœ์š”

์š”์†Œ๋ณ„, ํƒ€์ผ๋ง, ์ˆ˜๋™ ๋ฒกํ„ฐํ™”, Mojo vectorize ํŒจํ„ด์„ ํ•™์Šตํ•œ ํ›„, ์ด์ œ ์‹ค์ œ ์„ฑ๋Šฅ์„ ์ธก์ •ํ•  ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค. p21.mojo์— ๋‚ด์žฅ๋œ ๋ฒค์น˜๋งˆํ‚น ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์ ‘๊ทผ๋ฒ•์„ ๊ณผํ•™์ ์œผ๋กœ ๋น„๊ตํ•˜๊ณ  ์„ฑ๋Šฅ ํŠน์„ฑ์„ ์ดํ•ดํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ํ†ต์ฐฐ: ์ด๋ก ์  ๋ถ„์„์€ ๊ฐ€์น˜ ์žˆ์ง€๋งŒ, ์‹ค์ฆ์  ๋ฒค์น˜๋งˆํ‚น์ด ํŠน์ • ํ•˜๋“œ์›จ์–ด์—์„œ์˜ ์‹ค์ œ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

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

์ „์ฒด ๋ฒค์น˜๋งˆํฌ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด:

pixi run p23 --benchmark
pixi run -e amd p23 --benchmark
pixi run -e apple p23 --benchmark
uv run poe p23 --benchmark

๊ฐ ํŒจํ„ด์— ๋Œ€ํ•œ ์„ฑ๋Šฅ ์ธก์ • ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค:

SIZE: 1024
simd_width: 4
Running P21 GPU Benchmarks...
SIMD width: 4
--------------------------------------------------------------------------------
Testing SIZE=16, TILE=4
Running elementwise_16_4
Running tiled_16_4
Running manual_vectorized_16_4
Running vectorized_16_4
--------------------------------------------------------------------------------
Testing SIZE=128, TILE=16
Running elementwise_128_16
Running tiled_128_16
Running manual_vectorized_128_16
--------------------------------------------------------------------------------
Testing SIZE=128, TILE=16, Vectorize within tiles
Running vectorized_128_16
--------------------------------------------------------------------------------
Testing SIZE=1048576 (1M), TILE=1024
Running elementwise_1M_1024
Running tiled_1M_1024
Running manual_vectorized_1M_1024
Running vectorized_1M_1024
| name                      | met (ms)              | iters |
| ------------------------- | --------------------- | ----- |
| elementwise_16_4          | 0.0033248             | 100   |
| tiled_16_4                | 0.00327392            | 100   |
| manual_vectorized_16_4    | 0.0036169600000000002 | 100   |
| vectorized_16_4           | 0.0037209599999999997 | 100   |
| elementwise_128_16        | 0.00351999            | 100   |
| tiled_128_16              | 0.00370431            | 100   |
| manual_vectorized_128_16  | 0.0043696             | 100   |
| vectorized_128_16         | 0.00378048            | 100   |
| elementwise_1M_1024       | 0.03130143            | 100   |
| tiled_1M_1024             | 0.6892189000000001    | 100   |
| manual_vectorized_1M_1024 | 0.5923888             | 100   |
| vectorized_1M_1024        | 0.1876688             | 100   |

Benchmarks completed!

๋ฒค์น˜๋งˆํฌ ์„ค์ •

๋ฒค์น˜๋งˆํ‚น ์‹œ์Šคํ…œ์€ Mojo์˜ ๋‚ด์žฅ benchmark ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:

from benchmark import Bench, BenchConfig, Bencher, BenchId, keep
bench_config = BenchConfig(max_iters=10, num_warmup_iters=1)
  • max_iters=10: ํ†ต๊ณ„์  ์‹ ๋ขฐ์„ฑ์„ ์œ„ํ•ด ์ตœ๋Œ€ 10ํšŒ ๋ฐ˜๋ณต
  • num_warmup_iters=1: ์ธก์ • ์ „ GPU ์›Œ๋ฐ์—…
  • Benchmark ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”

๋ฒค์น˜๋งˆํ‚น ๊ตฌํ˜„์˜ ํ•ต์‹ฌ

ํ•ต์‹ฌ ์›Œํฌํ”Œ๋กœ์šฐ ํŒจํ„ด

๊ฐ ๋ฒค์น˜๋งˆํฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ„๊ฒฐํ•œ ํŒจํ„ด์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค:

@parameter
fn benchmark_pattern_parameterized[test_size: Int, tile_size: Int](mut b: Bencher) raises:
    bench_ctx = DeviceContext()
    # ์…‹์—…: ๋ฒ„ํผ ์ƒ์„ฑ ๋ฐ ๋ฐ์ดํ„ฐ ์ดˆ๊ธฐํ™”
    @parameter
    fn pattern_workflow(ctx: DeviceContext) raises:
      # ์—ฐ์‚ฐ: ์ธก์ • ๋Œ€์ƒ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‹คํ–‰

    b.iter_custom[pattern_workflow](bench_ctx)
    # ์ตœ์ ํ™” ๋ฐฉ์ง€: keep(out.unsafe_ptr())
    # ๋™๊ธฐํ™”: ctx.synchronize()

์ฃผ์š” ๋‹จ๊ณ„:

  1. ์…‹์—…: ๋ฒ„ํผ ํ• ๋‹น ๋ฐ ๋ฐ์ดํ„ฐ ์ดˆ๊ธฐํ™”
  2. ์—ฐ์‚ฐ: ๋ฒค์น˜๋งˆํฌ ๋Œ€์ƒ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‹คํ–‰
  3. ์ตœ์ ํ™” ๋ฐฉ์ง€: ์ •ํ™•ํ•œ ์ธก์ •์„ ์œ„ํ•ด ํ•„์ˆ˜
  4. ๋™๊ธฐํ™”: GPU ์ž‘์—… ์™„๋ฃŒ ํ™•์ธ

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

์ปค์Šคํ…€ ๋ฐ˜๋ณต์ด GPU์— ํ•„์š”ํ•œ ์ด์œ 

์ผ๋ฐ˜์ ์ธ ๋ฒค์น˜๋งˆํ‚น์€ CPU ์Šคํƒ€์ผ์˜ ๋™๊ธฐ ์‹คํ–‰์„ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. GPU ์ปค๋„์€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฏ€๋กœ ๋‹ค์Œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

  • GPU ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ: ์ ์ ˆํ•œ DeviceContext ์ƒ๋ช…์ฃผ๊ธฐ
  • ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ: ๋ฐ˜๋ณต ๊ฐ„ ๋ฒ„ํผ ์ •๋ฆฌ
  • ๋™๊ธฐํ™” ์ฒ˜๋ฆฌ: ๋น„๋™๊ธฐ ์—ฐ์‚ฐ์˜ ์ •ํ™•ํ•œ ํƒ€์ด๋ฐ
  • ์˜ค๋ฒ„ํ—ค๋“œ ๋ถ„๋ฆฌ: ์…‹์—… ๋น„์šฉ๊ณผ ์—ฐ์‚ฐ ๋น„์šฉ์˜ ๋ถ„๋ฆฌ

ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค์™€ ์Šค๋ ˆ๋“œ ๋ถ„์„

๋ฒค์น˜๋งˆํฌ ๋ชจ์Œ์€ ์„ฑ๋Šฅ ํŠน์„ฑ์„ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ์„ธ ๊ฐ€์ง€ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค:

์Šค๋ ˆ๋“œ ํ™œ์šฉ ์š”์•ฝ

๋ฌธ์ œ ํฌ๊ธฐํŒจํ„ด์Šค๋ ˆ๋“œ ์ˆ˜์Šค๋ ˆ๋“œ๋‹น SIMD ์—ฐ์‚ฐ์ด SIMD ์—ฐ์‚ฐ
SIZE=16์š”์†Œ๋ณ„414
ํƒ€์ผ๋ง414
์ˆ˜๋™144
vectorize414
SIZE=128์š”์†Œ๋ณ„32132
ํƒ€์ผ๋ง8432
์ˆ˜๋™21632
vectorize8432
SIZE=1M์š”์†Œ๋ณ„262,1441262,144
ํƒ€์ผ๋ง1,024256262,144
์ˆ˜๋™2561,024262,144
vectorize1,024256262,144

๋ฌธ์ œ ํฌ๊ธฐ๋ณ„ ์„ฑ๋Šฅ ํŠน์„ฑ

์†Œ๊ทœ๋ชจ ๋ฌธ์ œ (SIZE=16):

  • ์‹คํ–‰ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ง€๋ฐฐ์  (~0.003ms ๊ธฐ์ค€์„ )
  • ์Šค๋ ˆ๋“œ ์ˆ˜ ์ฐจ์ด๋Š” ๊ฑฐ์˜ ๋ฌด์˜๋ฏธ
  • ํƒ€์ผ๋ง/vectorize๊ฐ€ ์•ฝ๊ฐ„ ๋‚ฎ์€ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ณด์ž„

์ค‘๊ทœ๋ชจ ๋ฌธ์ œ (SIZE=128):

  • ์—ฌ์ „ํžˆ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ง€๋ฐฐ์  (~0.003ms ์ „ ํŒจํ„ด)
  • ์„ฑ๋Šฅ ์ฐจ์ด๊ฐ€ ๊ฑฐ์˜ ์‚ฌ๋ผ์ง
  • ์˜ค๋ฒ„ํ—ค๋“œ ์ง€๋ฐฐ์—์„œ ์—ฐ์‚ฐ ์ง€๋ฐฐ๋กœ์˜ ์ „ํ™˜ ๊ตฌ๊ฐ„

๋Œ€๊ทœ๋ชจ ๋ฌธ์ œ (SIZE=1M):

  • ์‹ค์งˆ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ฐจ์ด๊ฐ€ ๋“œ๋Ÿฌ๋‚จ
  • ๋น„๋ณ‘ํ•ฉ ๋กœ๋“œ์˜ ์˜ํ–ฅ์ด ๋ช…ํ™•ํ•ด์ง
  • ๋šœ๋ ทํ•œ ์„ฑ๋Šฅ ์ˆœ์œ„๊ฐ€ ๋‚˜ํƒ€๋‚จ

๋ฐ์ดํ„ฐ๊ฐ€ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ

๋‹ค์–‘ํ•œ ํ•˜๋“œ์›จ์–ด์—์„œ์˜ ์‹ค์ฆ์  ๋ฒค์น˜๋งˆํฌ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ:

์„ฑ๋Šฅ ์ˆœ์œ„ (๋Œ€๊ทœ๋ชจ ๋ฌธ์ œ)

์ˆœ์œ„ํŒจํ„ด์†Œ์š” ์‹œ๊ฐ„ํ•ต์‹ฌ ์ธ์‚ฌ์ดํŠธ
๐Ÿฅ‡์š”์†Œ๋ณ„~0.03ms๋ณ‘ํ•ฉ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์ด ๋ฉ”๋ชจ๋ฆฌ ๋ฐ”์šด๋“œ ์—ฐ์‚ฐ์—์„œ ์Šน๋ฆฌ
๐ŸฅˆMojo vectorize~0.19ms๋น„๋ณ‘ํ•ฉ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์ด ์„ฑ๋Šฅ์„ ์ €ํ•˜
๐Ÿฅ‰์ˆ˜๋™ ๋ฒกํ„ฐํ™”~0.59ms๋น„๋ณ‘ํ•ฉ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ๊ณผ ์ˆ˜๋™ ์ตœ์ ํ™”๊ฐ€ ์„ฑ๋Šฅ ๊ฐ์†Œ
4์œ„ํƒ€์ผ๋ง~0.69ms๋น„๋ณ‘ํ•ฉ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ, SIMD ๋กœ๋“œ ์—†๋Š” ์ˆ˜๋™ ์ตœ์ ํ™”๊ฐ€ ์„ฑ๋Šฅ์„ ๋” ์ €ํ•˜

ํ•ต์‹ฌ ์„ฑ๋Šฅ ์ธ์‚ฌ์ดํŠธ

๋‹จ์ˆœ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ”์šด๋“œ ์—ฐ์‚ฐ์˜ ๊ฒฝ์šฐ: ์ตœ๋Œ€ ๋ณ‘๋ ฌ์„ฑ(elementwise)์ด ๋Œ€๊ทœ๋ชจ์—์„œ ๋ณต์žกํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™”๋ณด๋‹ค ์šฐ์ˆ˜ํ•ฉ๋‹ˆ๋‹ค.

์š”์†Œ๋ณ„ ํŒจํ„ด์ด ์Šน๋ฆฌํ•˜๋Š” ์ด์œ :

  • 262,144๊ฐœ ์Šค๋ ˆ๋“œ๊ฐ€ ์šฐ์ˆ˜ํ•œ ์ง€์—ฐ ์‹œ๊ฐ„ ์€๋‹‰์„ ์ œ๊ณต
  • ๋‹จ์ˆœํ•œ ๋ฉ”๋ชจ๋ฆฌ ํŒจํ„ด์ด ์ข‹์€ ๋ณ‘ํ•ฉ์„ ๋‹ฌ์„ฑ
  • ์Šค๋ ˆ๋“œ๋‹น ์ตœ์†Œํ•œ์˜ ์˜ค๋ฒ„ํ—ค๋“œ
  • GPU ์ฝ”์–ด ์ˆ˜์— ๋”ฐ๋ผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ™•์žฅ

ํƒ€์ผ๋ง๊ณผ vectorize๊ฐ€ ๊ฒฝ์Ÿ๋ ฅ ์žˆ๋Š” ์ด์œ :

  • ๋ณ‘๋ ฌ์„ฑ๊ณผ ๋ฉ”๋ชจ๋ฆฌ ์ง€์—ญ์„ฑ ์‚ฌ์ด์˜ ๊ท ํ˜• ์žกํžŒ ์ ‘๊ทผ
  • ์ž๋™ ์ตœ์ ํ™”(vectorize)๊ฐ€ ์ˆ˜๋™ ํƒ€์ผ๋ง๊ณผ ๊ฑฐ์˜ ๋™๋“ฑํ•œ ์„ฑ๋Šฅ
  • ๊ณผ๋„ํ•œ ๋ณต์žก๋„ ์—†์ด ์–‘ํ˜ธํ•œ ์Šค๋ ˆ๋“œ ํ™œ์šฉ

์ˆ˜๋™ ๋ฒกํ„ฐํ™”๊ฐ€ ๊ณ ์ „ํ•˜๋Š” ์ด์œ :

  • 256๊ฐœ ์Šค๋ ˆ๋“œ๋งŒ์œผ๋กœ๋Š” ๋ณ‘๋ ฌ์„ฑ์ด ์ œํ•œ์ 
  • ๋ณต์žกํ•œ ์ธ๋ฑ์‹ฑ์ด ์—ฐ์‚ฐ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ถ”๊ฐ€
  • ์Šค๋ ˆ๋“œ๋‹น ๋Œ€ํ˜• ์ฒญํฌ๋กœ ์ธํ•œ ์บ์‹œ ๋ถ€๋‹ด
  • ๋‹จ์ˆœ ์‚ฐ์ˆ ์—์„œ ํšจ๊ณผ ์ฒด๊ฐ

ํ”„๋ ˆ์ž„์›Œํฌ ์ž๋™ํ™” ๊ธฐ๋Šฅ:

  • ์ž๋™ ๋ฐ˜๋ณต ํšŸ์ˆ˜ ์กฐ์ • (91-100ํšŒ ๋ฐ˜๋ณต)
  • ์„œ๋กœ ๋‹ค๋ฅธ ์‹คํ–‰ ์‹œ๊ฐ„์— ๊ฑธ์นœ ํ†ต๊ณ„์  ์‹ ๋ขฐ์„ฑ
  • ๋ฐœ์—ด ์ œํ•œ๊ณผ ์‹œ์Šคํ…œ ๋ณ€๋™์— ๋Œ€์‘

๊ฒฐ๊ณผ ํ•ด์„ํ•˜๊ธฐ

์ถœ๋ ฅ ํ…Œ์ด๋ธ” ์ฝ๊ธฐ

| name                     | met (ms)           | iters |
| elementwise_1M_1024      | 0.03130143         | 100   |
  • met (ms): ๋‹จ์ผ ๋ฐ˜๋ณต์˜ ์‹คํ–‰ ์‹œ๊ฐ„
  • iters: ์ˆ˜ํ–‰๋œ ๋ฐ˜๋ณต ํšŸ์ˆ˜
  • ๋™์ผ ๋ฌธ์ œ ํฌ๊ธฐ ๋‚ด์—์„œ ๋น„๊ต: ๊ฐ™์€ ํฌ๊ธฐ๋ผ๋ฆฌ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์˜๋ฏธ ์žˆ์Œ

์ตœ์ ํ™” ์˜์‚ฌ๊ฒฐ์ •

์‹ค์ฆ์  ์ฆ๊ฑฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํŒจํ„ด์„ ์„ ํƒํ•˜์„ธ์š”:

ํ”„๋กœ๋•์…˜ ์›Œํฌ๋กœ๋“œ์˜ ๊ฒฝ์šฐ:

  • ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ์…‹ (>100K ์š”์†Œ): ์š”์†Œ๋ณ„ ํŒจํ„ด์ด ์ผ๋ฐ˜์ ์œผ๋กœ ์ตœ์ 
  • ์†Œ๊ทœ๋ชจ/์‹œ์ž‘ ๋ฐ์ดํ„ฐ์…‹ (<1K ์š”์†Œ): ๋‚ฎ์€ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์œ„ํ•ด ํƒ€์ผ๋ง ๋˜๋Š” vectorize
  • ๊ฐœ๋ฐœ ์†๋„ ์šฐ์„ : ์ž๋™ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ Mojo vectorize
  • ์ˆ˜๋™ ๋ฒกํ„ฐํ™” ์ง€์–‘: ๋‹จ์ˆœ ์—ฐ์‚ฐ์—์„œ๋Š” ๋ณต์žก๋„๊ฐ€ ์„ฑ๋Šฅ์œผ๋กœ ๋ณด์ƒ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋“œ๋ฌพ

์„ฑ๋Šฅ ์ตœ์ ํ™” ์›Œํฌํ”Œ๋กœ์šฐ:

  1. ๋จผ์ € ํ”„๋กœํŒŒ์ผ๋ง: ์ตœ์ ํ™”ํ•˜๊ธฐ ์ „์— ์ธก์ •
  2. ๋Œ€๊ทœ๋ชจ์—์„œ ํ…Œ์ŠคํŠธ: ์†Œ๊ทœ๋ชจ ๋ฌธ์ œ๋Š” ์‹ค์ œ ์„ฑ๋Šฅ์— ๋Œ€ํ•ด ์˜คํ•ด๋ฅผ ์ค„ ์ˆ˜ ์žˆ์Œ
  3. ์ด๋น„์šฉ ๊ณ ๋ ค: ๊ฐœ๋ฐœ ๋ฐ ์œ ์ง€๋ณด์ˆ˜ ๋…ธ๋ ฅ์„ ํฌํ•จ
  4. ๊ฐœ์„  ์‚ฌํ•ญ ๊ฒ€์ฆ: ๋Œ€์ƒ ํ•˜๋“œ์›จ์–ด์—์„œ ๋ฒค์น˜๋งˆํฌ๋กœ ํ™•์ธ

๊ณ ๊ธ‰ ๋ฒค์น˜๋งˆํ‚น ๊ธฐ๋ฒ•

์ปค์Šคํ…€ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค

๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์กฐ๊ฑด์„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

# ๋‹ค์–‘ํ•œ ๋ฌธ์ œ ํฌ๊ธฐ
benchmark_elementwise_parameterized[1024, 32]  # ๋Œ€๊ทœ๋ชจ ๋ฌธ์ œ
benchmark_elementwise_parameterized[64, 8]     # ์†Œ๊ทœ๋ชจ ๋ฌธ์ œ

# ๋‹ค์–‘ํ•œ ํƒ€์ผ ํฌ๊ธฐ
benchmark_tiled_parameterized[256, 8]   # ์ž‘์€ ํƒ€์ผ
benchmark_tiled_parameterized[256, 64]  # ํฐ ํƒ€์ผ

ํ•˜๋“œ์›จ์–ด ๊ณ ๋ ค ์‚ฌํ•ญ

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค:

  • GPU ์•„ํ‚คํ…์ฒ˜: SIMD ํญ, ์ฝ”์–ด ์ˆ˜, ๋ฉ”๋ชจ๋ฆฌ ๋Œ€์—ญํญ
  • ์‹œ์Šคํ…œ ๊ตฌ์„ฑ: PCIe ๋Œ€์—ญํญ, CPU ์„ฑ๋Šฅ
  • ์—ด ์ƒํƒœ: GPU ๋ถ€์ŠคํŠธ ํด๋Ÿญ vs ์ง€์† ์„ฑ๋Šฅ
  • ๋™์‹œ ์›Œํฌ๋กœ๋“œ: GPU ํ™œ์šฉ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค

๋ชจ๋ฒ” ์‚ฌ๋ก€ ์š”์•ฝ

๋ฒค์น˜๋งˆํ‚น ์›Œํฌํ”Œ๋กœ์šฐ:

  1. ์ค‘์š”ํ•œ ์ธก์ • ์ „์— GPU ์›Œ๋ฐ์—…
  2. ํ†ต๊ณ„์  ์œ ์˜์„ฑ์„ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ˜๋ณต ์‹คํ–‰
  3. ํ™•์žฅ ํŠน์„ฑ์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ๋ฌธ์ œ ํฌ๊ธฐ ํ…Œ์ŠคํŠธ
  4. ์ตœ์ ํ™” ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด keep()์„ ์ผ๊ด€๋˜๊ฒŒ ์‚ฌ์šฉ
  5. ๋™์ผ ์กฐ๊ฑด์—์„œ ๋น„๊ต (๊ฐ™์€ ๋ฌธ์ œ ํฌ๊ธฐ, ๊ฐ™์€ ํ•˜๋“œ์›จ์–ด)

์„ฑ๋Šฅ ์˜์‚ฌ๊ฒฐ์ • ํ”„๋ ˆ์ž„์›Œํฌ:

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

๋‹ค์Œ ๋‹จ๊ณ„

๋ฒค์น˜๋งˆํ‚น ๊ธฐ์ˆ ์„ ๊ฐ–์ถ”์—ˆ๋‹ค๋ฉด:

  • ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœํŒŒ์ผ๋ง: ์ด ํŒจํ„ด๋“ค์„ ์‹ค์ œ ์›Œํฌ๋กœ๋“œ์— ์ ์šฉ
  • ๊ณ ๊ธ‰ GPU ํŒจํ„ด: ๋ฆฌ๋•์…˜, ํ•ฉ์„ฑ๊ณฑ, ํ–‰๋ ฌ ์—ฐ์‚ฐ ํƒ๊ตฌ
  • ๋ฉ€ํ‹ฐ GPU ํ™•์žฅ: ๋ถ„์‚ฐ GPU ์ปดํ“จํŒ… ํŒจํ„ด ์ดํ•ด
  • ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™”: ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์™€ ๊ณ ๊ธ‰ ์บ์‹ฑ์„ ๋” ๊นŠ์ด ํƒ๊ตฌ

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

์•ž์œผ๋กœ์˜ ๋ฐฉํ–ฅ: ๋” ๋งŽ์€ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•  ๋•Œ

Part VI์˜ ํ•จ์ˆ˜ํ˜• ํŒจํ„ด์€ ๋Œ€๋ถ€๋ถ„์˜ ์›Œํฌ๋กœ๋“œ์—์„œ ์šฐ์ˆ˜ํ•œ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ์ผ๋ถ€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ง์ ‘์ ์ธ ์Šค๋ ˆ๋“œ ๊ฐ„ ํ†ต์‹ ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

์›Œํ”„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์œ ์šฉํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜:

  • ๋ฆฌ๋•์…˜: ์Šค๋ ˆ๋“œ ๊ทธ๋ฃน์— ๊ฑธ์นœ ํ•ฉ๊ณ„, ์ตœ๋Œ“๊ฐ’, ์ตœ์†Ÿ๊ฐ’ ์—ฐ์‚ฐ
  • ๋ˆ„์  ์—ฐ์‚ฐ: ๋ˆ„์  ํ•ฉ, ์ด๋™ ์ตœ๋Œ“๊ฐ’
  • ๋ฐ์ดํ„ฐ ์…”ํ”Œ: ์Šค๋ ˆ๋“œ ๊ฐ„ ๋ฐ์ดํ„ฐ ์žฌ๋ฐฐ์น˜
  • ํ˜‘๋ ฅ ์•Œ๊ณ ๋ฆฌ์ฆ˜: ์Šค๋ ˆ๋“œ ๊ฐ„ ๊ธด๋ฐ€ํ•œ ์กฐ์ •์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ

์„ฑ๋Šฅ ๋ฏธ๋ฆฌ๋ณด๊ธฐ:

Part VII์—์„œ๋Š” Part III์˜ ์—ฌ๋Ÿฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋‹ค์‹œ ์‚ดํŽด๋ณด๋ฉฐ ์›Œํ”„ ์—ฐ์‚ฐ์ด ์–ด๋–ป๊ฒŒ:

  • ์ฝ”๋“œ๋ฅผ ๊ฐ„์†Œํ™”ํ•˜๋Š”์ง€: ๋ณต์žกํ•œ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ํŒจํ„ด์„ ๋‹จ์ผ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ๋Œ€์ฒด
  • ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š”์ง€: ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ ํŠธ๋ž˜ํ”ฝ์„ ๊ฐ์†Œ
  • ์ƒˆ๋กœ์šด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š”์ง€: ์ˆœ์ˆ˜ ํ•จ์ˆ˜ํ˜• ์ ‘๊ทผ์œผ๋กœ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•œ ํŒจํ„ด์„ ๊ตฌํ˜„

๋‹ค์Œ ๋‚ด์šฉ: Part VII: ์›Œํ”„ ๋ ˆ๋ฒจ ํ”„๋กœ๊ทธ๋ž˜๋ฐ - Puzzle 14์˜ ๋ˆ„์  ํ•ฉ์„ ์™„์ „ํžˆ ์ƒˆ๋กญ๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.