๊ฐœ์š”

ํ–‰๋ ฌ a์˜ ๊ฐ ์œ„์น˜์— 10์„ ๋”ํ•ด output์— ์ €์žฅํ•˜๋Š” ์ปค๋„์„ ๊ตฌํ˜„ํ•ด ๋ณด์„ธ์š”.

์ฐธ๊ณ : ๋ธ”๋ก๋‹น ์Šค๋ ˆ๋“œ ์ˆ˜๊ฐ€ a์˜ ํ–‰๊ณผ ์—ด ํฌ๊ธฐ๋ณด๋‹ค ๋ชจ๋‘ ์ž‘์Šต๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ๊ฐœ๋…

์ด ํผ์ฆ์—์„œ ๋ฐฐ์šธ ๋‚ด์šฉ:

  • 2D ๋ธ”๋ก๊ณผ ์Šค๋ ˆ๋“œ ๋ฐฐ์น˜ ๋‹ค๋ฃจ๊ธฐ
  • ๋ธ”๋ก ํฌ๊ธฐ๋ณด๋‹ค ํฐ ํ–‰๋ ฌ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌํ•˜๊ธฐ
  • 2D ์ธ๋ฑ์Šค์™€ ์„ ํ˜• ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ๊ฐ„ ๋ณ€ํ™˜ํ•˜๊ธฐ

ํ•ต์‹ฌ์€ ํ•˜๋‚˜์˜ ๋ธ”๋ก๋ณด๋‹ค ํฐ 2D ํ–‰๋ ฌ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์—ฌ๋Ÿฌ ๋ธ”๋ก์˜ ์Šค๋ ˆ๋“œ๋“ค์ด ์–ด๋–ป๊ฒŒ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ตฌ์„ฑ

  • ํ–‰๋ ฌ ํฌ๊ธฐ: \(5 \times 5\) ์›์†Œ
  • 2D ๋ธ”๋ก: ๊ฐ ๋ธ”๋ก์ด \(3 \times 3\) ์˜์—ญ ์ฒ˜๋ฆฌ
  • ๊ทธ๋ฆฌ๋“œ ๋ ˆ์ด์•„์›ƒ: \(2 \times 2\) ๊ทธ๋ฆฌ๋“œ์— ๋ธ”๋ก ๋ฐฐ์น˜
  • ์ด ์Šค๋ ˆ๋“œ ์ˆ˜: \(25\)๊ฐœ ์›์†Œ์— ๋Œ€ํ•ด \(36\)๊ฐœ
  • ๋ฉ”๋ชจ๋ฆฌ ํŒจํ„ด: 2D ๋ฐ์ดํ„ฐ๋ฅผ ํ–‰ ์šฐ์„ ์œผ๋กœ ์ €์žฅ
  • ์ปค๋ฒ„๋ฆฌ์ง€: ๋ชจ๋“  ํ–‰๋ ฌ ์›์†Œ๊ฐ€ ๋น ์ง์—†์ด ์ฒ˜๋ฆฌ๋˜๋„๋ก ๋ณด์žฅ

์™„์„ฑํ•  ์ฝ”๋“œ

comptime SIZE = 5
comptime BLOCKS_PER_GRID = (2, 2)
comptime THREADS_PER_BLOCK = (3, 3)
comptime dtype = DType.float32


fn add_10_blocks_2d(
    output: UnsafePointer[Scalar[dtype], MutAnyOrigin],
    a: UnsafePointer[Scalar[dtype], MutAnyOrigin],
    size: UInt,
):
    row = block_dim.y * block_idx.y + thread_idx.y
    col = block_dim.x * block_idx.x + thread_idx.x
    # FILL ME IN (roughly 2 lines)


์ „์ฒด ์ฝ”๋“œ ๋ณด๊ธฐ: problems/p07/p07.mojo

ํŒ
  1. ์ „์—ญ ์ธ๋ฑ์Šค ๊ณ„์‚ฐ: row = block_dim.y * block_idx.y + thread_idx.y, col = block_dim.x * block_idx.x + thread_idx.x
  2. ๊ฐ€๋“œ ์ถ”๊ฐ€: if row < size and col < size
  3. ๊ฐ€๋“œ ๋‚ด๋ถ€: ํ–‰ ์šฐ์„  ๋ฐฉ์‹์œผ๋กœ 10์„ ๋”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด ๋ณด์„ธ์š”!

์ฝ”๋“œ ์‹คํ–‰

์†”๋ฃจ์…˜์„ ํ…Œ์ŠคํŠธํ•˜๋ ค๋ฉด ํ„ฐ๋ฏธ๋„์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”:

pixi run p07
pixi run -e amd p07
pixi run -e apple p07
uv run poe p07

ํผ์ฆ์„ ์•„์ง ํ’€์ง€ ์•Š์•˜๋‹ค๋ฉด ์ถœ๋ ฅ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค:

out: HostBuffer([0.0, 0.0, 0.0, ... , 0.0])
expected: HostBuffer([10.0, 11.0, 12.0, ... , 34.0])

์†”๋ฃจ์…˜

fn add_10_blocks_2d(
    output: UnsafePointer[Scalar[dtype], MutAnyOrigin],
    a: UnsafePointer[Scalar[dtype], MutAnyOrigin],
    size: UInt,
):
    row = block_dim.y * block_idx.y + thread_idx.y
    col = block_dim.x * block_idx.x + thread_idx.x
    if row < size and col < size:
        output[row * size + col] = a[row * size + col] + 10.0


์›์‹œ ๋ฉ”๋ชจ๋ฆฌ๋กœ 2D ๋ธ”๋ก ๊ธฐ๋ฐ˜ ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ์˜ ํ•ต์‹ฌ ๊ฐœ๋…์„ ๋ณด์—ฌ์ฃผ๋Š” ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค:

  1. 2D ์Šค๋ ˆ๋“œ ์ธ๋ฑ์‹ฑ

    • ์ „์—ญ ํ–‰(row): block_dim.y * block_idx.y + thread_idx.y

    • ์ „์—ญ ์—ด(col): block_dim.x * block_idx.x + thread_idx.x

    • ์Šค๋ ˆ๋“œ ๊ทธ๋ฆฌ๋“œ๋ฅผ ํ–‰๋ ฌ ์›์†Œ์— ๋งคํ•‘:

      3ร—3 ๋ธ”๋ก์œผ๋กœ ๊ตฌ์„ฑ๋œ 5ร—5 ํ–‰๋ ฌ:
      
      Block (0,0)         Block (1,0)
      [(0,0) (0,1) (0,2)] [(0,3) (0,4)    *  ]
      [(1,0) (1,1) (1,2)] [(1,3) (1,4)    *  ]
      [(2,0) (2,1) (2,2)] [(2,3) (2,4)    *  ]
      
      Block (0,1)         Block (1,1)
      [(3,0) (3,1) (3,2)] [(3,3) (3,4)    *  ]
      [(4,0) (4,1) (4,2)] [(4,3) (4,4)    *  ]
      [  *     *     *  ] [  *     *      *  ]
      

      (* = ์Šค๋ ˆ๋“œ๋Š” ์กด์žฌํ•˜์ง€๋งŒ ํ–‰๋ ฌ ๊ฒฝ๊ณ„ ๋ฐ–)

  2. ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ

    • ํ–‰ ์šฐ์„  ์„ ํ˜• ๋ฉ”๋ชจ๋ฆฌ: index = row * size + col

    • 5ร—5 ํ–‰๋ ฌ ์˜ˆ์‹œ:

      2D ์ธ๋ฑ์Šค:       ์„ ํ˜• ๋ฉ”๋ชจ๋ฆฌ:
      (2,1) -> 11   [00 01 02 03 04]
                    [05 06 07 08 09]
                    [10 11 12 13 14]
                    [15 16 17 18 19]
                    [20 21 22 23 24]
      
  3. ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ

    • ๊ฐ€๋“œ row < size and col < size๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ:
      • ๋ถ€๋ถ„ ๋ธ”๋ก์—์„œ ๋‚จ๋Š” ์Šค๋ ˆ๋“œ
      • ํ–‰๋ ฌ ๊ฒฝ๊ณ„์˜ ์—ฃ์ง€ ์ผ€์ด์Šค
      • 3ร—3 ์Šค๋ ˆ๋“œ ๋ธ”๋ก์˜ 2ร—2 ๊ทธ๋ฆฌ๋“œ = 25๊ฐœ ์›์†Œ์— 36๊ฐœ ์Šค๋ ˆ๋“œ
  4. ๋ธ”๋ก ์กฐ์œจ

    • ๊ฐ 3ร—3 ๋ธ”๋ก์ด 5ร—5 ํ–‰๋ ฌ์˜ ์ผ๋ถ€๋ถ„์„ ๋‹ด๋‹น
    • 2ร—2 ๋ธ”๋ก ๊ทธ๋ฆฌ๋“œ๋กœ ์ „์ฒด๋ฅผ ๋น ์ง์—†์ด ์ปค๋ฒ„
    • ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ๋กœ ๊ฒน์น˜๋Š” ์Šค๋ ˆ๋“œ ์ฒ˜๋ฆฌ
    • ๋ธ”๋ก๋“ค์ด ํ•จ๊ป˜ ํšจ์œจ์ ์œผ๋กœ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ

์ด ํŒจํ„ด์€ ๋ธ”๋ก ํฌ๊ธฐ๋ณด๋‹ค ํฐ 2D ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ํšจ์œจ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ๊ณผ ์Šค๋ ˆ๋“œ ์กฐ์œจ์„ ์–ด๋–ป๊ฒŒ ์œ ์ง€ํ•˜๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.