๊ฐ์
๋ฒกํฐ a์ b๋ฅผ ๋ธ๋ก๋์บ์คํธ๋ก ๋ํด 2D ํ๋ ฌ output์ ์ ์ฅํ๋ ์ปค๋์ ๊ตฌํํด ๋ณด์ธ์.
์ฐธ๊ณ : ์ค๋ ๋ ์๊ฐ ํ๋ ฌ์ ์์น ์๋ณด๋ค ๋ง์ต๋๋ค.
ํต์ฌ ๊ฐ๋
์ด ํผ์ฆ์์ ๋ฐฐ์ธ ๋ด์ฉ:
- 1D ๋ฒกํฐ๋ฅผ ๊ฐ๊ฐ ๋ค๋ฅธ ์ฐจ์ ๋ฐฉํฅ์ผ๋ก ๋ธ๋ก๋์บ์คํธํ๊ธฐ
- 2D ์ค๋ ๋ ์ธ๋ฑ์ค๋ก ๋ธ๋ก๋์บ์คํธ ์ฐ์ฐ ์ํํ๊ธฐ
- ๋ธ๋ก๋์บ์คํธ ํจํด์์ ๊ฒฝ๊ณ ์กฐ๊ฑด ์ฒ๋ฆฌํ๊ธฐ
ํต์ฌ์ ๋ 1D ๋ฒกํฐ์ ์์๋ค์ ๋ธ๋ก๋์บ์คํธ๋ก 2D ์ถ๋ ฅ ํ๋ ฌ์ ๋งคํํ๋ ๋ฐฉ๋ฒ์ ์ดํดํ๊ณ , ์ค๋ ๋ ๊ฒฝ๊ณ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋๋ค.
- ๋ธ๋ก๋์บ์คํธ:
a์ ๊ฐ ์์๊ฐb์ ๊ฐ ์์์ ๊ฒฐํฉ - ์ค๋ ๋ ๋งคํ: \(2 \times 2\) ์ถ๋ ฅ์ \((3 \times 3)\) ์ค๋ ๋ ๊ทธ๋ฆฌ๋ ์ฌ์ฉ
- ๋ฒกํฐ ์ ๊ทผ:
a์b๋ ์๋ก ๋ค๋ฅธ ์ ๊ทผ ํจํด ์ฌ์ฉ - ๊ฒฝ๊ณ ๊ฒ์ฌ: ํ๋ ฌ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ์ค๋ ๋๋ฅผ ๊ฐ๋๋ก ์ฒ๋ฆฌ
์์ฑํ ์ฝ๋
comptime SIZE = 2
comptime BLOCKS_PER_GRID = 1
comptime THREADS_PER_BLOCK = (3, 3)
comptime dtype = DType.float32
fn broadcast_add(
output: UnsafePointer[Scalar[dtype], MutAnyOrigin],
a: UnsafePointer[Scalar[dtype], MutAnyOrigin],
b: UnsafePointer[Scalar[dtype], MutAnyOrigin],
size: UInt,
):
row = thread_idx.y
col = thread_idx.x
# FILL ME IN (roughly 2 lines)
์ ์ฒด ์ฝ๋ ๋ณด๊ธฐ: problems/p05/p05.mojo
ํ
- 2D ์ธ๋ฑ์ค ๊ฐ์ ธ์ค๊ธฐ:
row = thread_idx.y,col = thread_idx.x - ๊ฐ๋ ์ถ๊ฐ:
if row < size and col < size - ๊ฐ๋ ๋ด๋ถ:
a์b๊ฐ์ ์ด๋ป๊ฒ ๋ธ๋ก๋์บ์คํธํ ์ง ์๊ฐํด ๋ณด์ธ์
์ฝ๋ ์คํ
์๋ฃจ์ ์ ํ ์คํธํ๋ ค๋ฉด ํฐ๋ฏธ๋์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ธ์:
pixi run p05
pixi run -e amd p05
pixi run -e apple p05
uv run poe p05
ํผ์ฆ์ ์์ง ํ์ง ์์๋ค๋ฉด ์ถ๋ ฅ์ด ๋ค์๊ณผ ๊ฐ์ด ๋ํ๋ฉ๋๋ค:
out: HostBuffer([0.0, 0.0, 0.0, 0.0])
expected: HostBuffer([1.0, 2.0, 11.0, 12.0])
์๋ฃจ์
fn broadcast_add(
output: UnsafePointer[Scalar[dtype], MutAnyOrigin],
a: UnsafePointer[Scalar[dtype], MutAnyOrigin],
b: UnsafePointer[Scalar[dtype], MutAnyOrigin],
size: UInt,
):
row = thread_idx.y
col = thread_idx.x
if row < size and col < size:
output[row * size + col] = a[col] + b[row]
LayoutTensor ์ถ์ํ ์์ด GPU ๋ธ๋ก๋์บ์คํธ์ ๊ธฐ๋ณธ ๊ฐ๋ ์ ๋ณด์ฌ์ฃผ๋ ์๋ฃจ์ ์ ๋๋ค:
-
์ค๋ ๋์์ ํ๋ ฌ๋ก ๋งคํ
thread_idx.y๋ก ํ,thread_idx.x๋ก ์ด์ ์ ๊ทผ- 2D ์ค๋ ๋ ๊ทธ๋ฆฌ๋๋ฅผ ์ถ๋ ฅ ํ๋ ฌ ์์์ ์ง์ ๋งคํ
- 3ร3 ๊ทธ๋ฆฌ๋์ ์ด๊ณผ ์ค๋ ๋๋ฅผ 2ร2 ์ถ๋ ฅ์ ๋ง๊ฒ ์ฒ๋ฆฌ
-
๋ธ๋ก๋์บ์คํธ ์๋ ๋ฐฉ์
- ๋ฒกํฐ
a๋ ์ํ ๋ฐฉํฅ์ผ๋ก ๋ธ๋ก๋์บ์คํธ: ๊ฐ ํ์์ ๋์ผํa[col]์ฌ์ฉ - ๋ฒกํฐ
b๋ ์์ง ๋ฐฉํฅ์ผ๋ก ๋ธ๋ก๋์บ์คํธ: ๊ฐ ์ด์์ ๋์ผํb[row]์ฌ์ฉ - ๋ ๋ฒกํฐ๋ฅผ ๋ํด ์ถ๋ ฅ ์์ฑ
[ a0 a1 ] + [ b0 ] = [ a0+b0 a1+b0 ] [ b1 ] [ a0+b1 a1+b1 ] - ๋ฒกํฐ
-
๊ฒฝ๊ณ ๊ฒ์ฌ
- ๋จ์ผ ๊ฐ๋ ์กฐ๊ฑด
row < size and col < size๋ก ๋ ์ฐจ์ ๋ชจ๋ ์ฒ๋ฆฌ - ์ ๋ ฅ ๋ฒกํฐ์ ์ถ๋ ฅ ํ๋ ฌ์ ๋ฒ์ ์ด๊ณผ ์ ๊ทผ ๋ฐฉ์ง
- 3ร3 ์ค๋ ๋ ๊ทธ๋ฆฌ๋๊ฐ 2ร2 ๋ฐ์ดํฐ๋ณด๋ค ํฌ๋ฏ๋ก ๋ฐ๋์ ํ์
- ๋จ์ผ ๊ฐ๋ ์กฐ๊ฑด
LayoutTensor ๋ฒ์ ๊ณผ ๋น๊ตํด์ ๋์ผํ ๊ธฐ๋ณธ ๊ฐ๋ ์ ์ ์งํ๋ฉด์ ์ถ์ํ๊ฐ ๋ธ๋ก๋์บ์คํธ ์ฐ์ฐ์ ์ผ๋ง๋ ๋จ์ํ๊ฒ ๋ง๋๋์ง ํ์ธํด ๋ณด์ธ์.