Puzzle 6: ๋ธ๋ก
๊ฐ์
๋ฒกํฐ a์ ๊ฐ ์์น์ 10์ ๋ํด output์ ์ ์ฅํ๋ ์ปค๋์ ๊ตฌํํด ๋ณด์ธ์.
์ฐธ๊ณ : ๋ธ๋ก๋น ์ค๋ ๋ ์๊ฐ a์ ํฌ๊ธฐ๋ณด๋ค ์์ต๋๋ค.
ํต์ฌ ๊ฐ๋
์ด ํผ์ฆ์์ ๋ค๋ฃจ๋ ๋ด์ฉ:
- ์ค๋ ๋ ๋ธ๋ก ํฌ๊ธฐ๋ณด๋ค ํฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
- ์ฌ๋ฌ ๋ธ๋ก์ ์ค๋ ๋ ์กฐ์จ
- ์ ์ญ ์ค๋ ๋ ์์น ๊ณ์ฐ
์ฌ๊ธฐ์ ํต์ฌ์ ์ฌ๋ฌ ์ค๋ ๋ ๋ธ๋ก์ด ํ๋ ฅํ์ฌ ๋จ์ผ ๋ธ๋ก ์ฉ๋๋ณด๋ค ํฐ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ฉด์๋, ์์์ ์ค๋ ๋ ๊ฐ ์ฌ๋ฐ๋ฅธ ๋งคํ์ ์ ์งํ๋ ์๋ฆฌ๋ฅผ ์ดํดํ๋ ๊ฒ์ ๋๋ค.
์์ฑํ ์ฝ๋
comptime SIZE = 9
comptime BLOCKS_PER_GRID = (3, 1)
comptime THREADS_PER_BLOCK = (4, 1)
comptime dtype = DType.float32
fn add_10_blocks(
output: UnsafePointer[Scalar[dtype], MutAnyOrigin],
a: UnsafePointer[Scalar[dtype], MutAnyOrigin],
size: UInt,
):
i = block_dim.x * block_idx.x + thread_idx.x
# FILL ME IN (roughly 2 lines)
์ ์ฒด ์ฝ๋ ๋ณด๊ธฐ: problems/p06/p06.mojo
์ฐธ๊ณ : ์ด ํผ์ฆ์
LayoutTensor๋ฒ์ ์ ๊ฑฐ์ ๋์ผํ๋ฏ๋ก ๋ ์์๊ฒ ๋งก๊น๋๋ค.
ํ
- ์ ์ญ ์ธ๋ฑ์ค ๊ณ์ฐ:
i = block_dim.x * block_idx.x + thread_idx.x - ๊ฐ๋ ์ถ๊ฐ:
if i < size - ๊ฐ๋ ๋ด๋ถ:
output[i] = a[i] + 10.0
์ฝ๋ ์คํ
์๋ฃจ์ ์ ํ ์คํธํ๋ ค๋ฉด ํฐ๋ฏธ๋์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ธ์:
pixi run p06
pixi run -e amd p06
pixi run -e apple p06
uv run poe p06
ํผ์ฆ์ ์์ง ํ์ง ์์๋ค๋ฉด ์ถ๋ ฅ์ด ๋ค์๊ณผ ๊ฐ์ด ๋ํ๋ฉ๋๋ค:
out: HostBuffer([0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])
expected: HostBuffer([10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0])
์๋ฃจ์
fn add_10_blocks(
output: UnsafePointer[Scalar[dtype], MutAnyOrigin],
a: UnsafePointer[Scalar[dtype], MutAnyOrigin],
size: UInt,
):
i = block_dim.x * block_idx.x + thread_idx.x
if i < size:
output[i] = a[i] + 10.0
์ด ์๋ฃจ์ ์ ๋ธ๋ก ๊ธฐ๋ฐ GPU ์ฒ๋ฆฌ์ ํต์ฌ ๊ฐ๋ ์ ๋ค๋ฃน๋๋ค:
-
์ ์ญ ์ค๋ ๋ ์ธ๋ฑ์ฑ
-
๋ธ๋ก ์ธ๋ฑ์ค์ ์ค๋ ๋ ์ธ๋ฑ์ค๋ฅผ ๊ฒฐํฉ:
block_dim.x * block_idx.x + thread_idx.x -
๊ฐ ์ค๋ ๋๋ฅผ ๊ณ ์ ํ ์ ์ญ ์์น์ ๋งคํ
-
๋ธ๋ก๋น 3๊ฐ ์ค๋ ๋ ์์:
Block 0: [0 1 2] Block 1: [3 4 5] Block 2: [6 7 8]
-
-
๋ธ๋ก ์กฐ์จ
-
๊ฐ ๋ธ๋ก์ ์ฐ์๋ ๋ฐ์ดํฐ ์ฒญํฌ๋ฅผ ์ฒ๋ฆฌ
-
๋ธ๋ก ํฌ๊ธฐ(3) < ๋ฐ์ดํฐ ํฌ๊ธฐ(9)์ด๋ฏ๋ก ์ฌ๋ฌ ๋ธ๋ก ํ์
-
๋ธ๋ก ๊ฐ ์๋ ์์ ๋ถ๋ฐฐ:
Data: [0 1 2 3 4 5 6 7 8] Block 0: [0 1 2] Block 1: [3 4 5] Block 2: [6 7 8]
-
-
๊ฒฝ๊ณ ๊ฒ์ฌ
- ๊ฐ๋ ์กฐ๊ฑด
i < size๋ก ๊ฒฝ๊ณ ์ผ์ด์ค ์ฒ๋ฆฌ - ๋ฐ์ดํฐ ํฌ๊ธฐ๊ฐ ๋ธ๋ก ํฌ๊ธฐ๋ก ๋๋์ด ๋จ์ด์ง์ง ์์ ๋ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ์ ๊ทผ ๋ฐฉ์ง
- ๋ฐ์ดํฐ ๋๋ถ๋ถ์ ๋ถ์์ ํ ๋ธ๋ก ์ฒ๋ฆฌ์ ํ์
- ๊ฐ๋ ์กฐ๊ฑด
-
๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ํจํด
- ๋ณํฉ(coalesced) ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ: ๋ธ๋ก ๋ด ์ค๋ ๋๋ค์ด ์ฐ์๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผ
- ๊ฐ ์ค๋ ๋๊ฐ ํ๋์ ์์ ์ฒ๋ฆฌ:
output[i] = a[i] + 10.0 - ๋ธ๋ก ์์ค ๋ณ๋ ฌ์ฑ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ๋์ญํญ์ ํจ์จ์ ์ผ๋ก ํ์ฉ
์ด ํจํด์ ๋จ์ผ ์ค๋ ๋ ๋ธ๋ก ํฌ๊ธฐ๋ฅผ ์ด๊ณผํ๋ ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ์ฒ๋ฆฌ์ ๊ธฐ์ด๊ฐ ๋ฉ๋๋ค.