๊ฐ์
ํ๋ ฌ 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
ํ
- ์ ์ญ ์ธ๋ฑ์ค ๊ณ์ฐ:
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 - ๊ฐ๋ ๋ด๋ถ: ํ ์ฐ์ ๋ฐฉ์์ผ๋ก 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 ๋ธ๋ก ๊ธฐ๋ฐ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ ๋์ ํต์ฌ ๊ฐ๋ ์ ๋ณด์ฌ์ฃผ๋ ์๋ฃจ์ ์ ๋๋ค:
-
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) * ] [ * * * ] [ * * * ](* = ์ค๋ ๋๋ ์กด์ฌํ์ง๋ง ํ๋ ฌ ๊ฒฝ๊ณ ๋ฐ)
-
-
๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์
-
ํ ์ฐ์ ์ ํ ๋ฉ๋ชจ๋ฆฌ:
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]
-
-
๊ฒฝ๊ณ ๊ฒ์ฌ
- ๊ฐ๋
row < size and col < size๊ฐ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ:- ๋ถ๋ถ ๋ธ๋ก์์ ๋จ๋ ์ค๋ ๋
- ํ๋ ฌ ๊ฒฝ๊ณ์ ์ฃ์ง ์ผ์ด์ค
- 3ร3 ์ค๋ ๋ ๋ธ๋ก์ 2ร2 ๊ทธ๋ฆฌ๋ = 25๊ฐ ์์์ 36๊ฐ ์ค๋ ๋
- ๊ฐ๋
-
๋ธ๋ก ์กฐ์จ
- ๊ฐ 3ร3 ๋ธ๋ก์ด 5ร5 ํ๋ ฌ์ ์ผ๋ถ๋ถ์ ๋ด๋น
- 2ร2 ๋ธ๋ก ๊ทธ๋ฆฌ๋๋ก ์ ์ฒด๋ฅผ ๋น ์ง์์ด ์ปค๋ฒ
- ๊ฒฝ๊ณ ๊ฒ์ฌ๋ก ๊ฒน์น๋ ์ค๋ ๋ ์ฒ๋ฆฌ
- ๋ธ๋ก๋ค์ด ํจ๊ป ํจ์จ์ ์ผ๋ก ๋ณ๋ ฌ ์ฒ๋ฆฌ
์ด ํจํด์ ๋ธ๋ก ํฌ๊ธฐ๋ณด๋ค ํฐ 2D ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ ํจ์จ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ๊ณผ ์ค๋ ๋ ์กฐ์จ์ ์ด๋ป๊ฒ ์ ์งํ๋์ง ๋ณด์ฌ์ค๋๋ค.