๊ฐ์
๋ฒกํฐ a์์ ๊ฐ ์์น์ ์ง์ 3๊ฐ ๊ฐ์ ํฉ์ ๊ณ์ฐํ์ฌ ๋ฒกํฐ output์ ์ ์ฅํ๋ ์ปค๋์ ๊ตฌํํ์ธ์.
์ฐธ๊ณ : ๊ฐ ์์น๋ง๋ค ์ค๋ ๋ 1๊ฐ๊ฐ ์์ต๋๋ค. ์ค๋ ๋๋น ์ ์ญ ์ฝ๊ธฐ 1ํ, ์ ์ญ ์ฐ๊ธฐ 1ํ๋ง ํ์ํฉ๋๋ค.
ํต์ฌ ๊ฐ๋
์ด ํผ์ฆ์์ ๋ฐฐ์ธ ๋ด์ฉ:
- ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ก ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ์ฐ์ฐ ๊ตฌํํ๊ธฐ
- ํ๋ง์ ๊ฒฝ๊ณ ์กฐ๊ฑด ์ฒ๋ฆฌ
- ์ด์ ๋ฐ์ดํฐ ์ ๊ทผ์ ์ํ ์ค๋ ๋ ๊ฐ ํ๋ ฅ
ํต์ฌ์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํด ์๋์ฐ ๋ด ๊ฐ๋ค์ ํจ์จ์ ์ผ๋ก ์ ๊ทผํ๋ ๊ฒ์ ๋๋ค. ์ํ์ค ์๋ถ๋ถ์ ํน๋ณํ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
๊ตฌ์ฑ
- ๋ฐฐ์ด ํฌ๊ธฐ:
SIZE = 8 - ๋ธ๋ก๋น ์ค๋ ๋ ์:
TPB = 8 - ์๋์ฐ ํฌ๊ธฐ: 3
- ๊ณต์ ๋ฉ๋ชจ๋ฆฌ:
TPB๊ฐ
์ฐธ๊ณ :
- ์๋์ฐ ์ ๊ทผ: ๊ฐ ์ถ๋ ฅ์ ์ด์ ์ต๋ 3๊ฐ ๊ฐ์ ์์กดํฉ๋๋ค
- ๊ฒฝ๊ณ ์ฒ๋ฆฌ: ์ฒ์ ๋ ์์น๋ ํน๋ณํ ์ฒ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค
- ๋ฉ๋ชจ๋ฆฌ ํจํด: ์ค๋ ๋๋น ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๋ก๋ 1ํ
- ์ค๋ ๋ ๋๊ธฐํ: ์๋์ฐ ์ฐ์ฐ ์ ์ ์กฐ์จ ํ์
์์ฑํ ์ฝ๋
comptime TPB = 8
comptime SIZE = 8
comptime BLOCKS_PER_GRID = (1, 1)
comptime THREADS_PER_BLOCK = (TPB, 1)
comptime dtype = DType.float32
fn pooling(
output: UnsafePointer[Scalar[dtype], MutAnyOrigin],
a: UnsafePointer[Scalar[dtype], MutAnyOrigin],
size: UInt,
):
shared = stack_allocation[
TPB,
Scalar[dtype],
address_space = AddressSpace.SHARED,
]()
global_i = block_dim.x * block_idx.x + thread_idx.x
local_i = thread_idx.x
# FILL ME IN (roughly 10 lines)
์ ์ฒด ํ์ผ ๋ณด๊ธฐ: problems/p11/p11.mojo
ํ
- ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๊ณ
barrier()ํธ์ถ - ํน์ ์ผ์ด์ค:
output[0] = shared[0],output[1] = shared[0] + shared[1] - ์ผ๋ฐ ์ผ์ด์ค:
if 1 < global_i < size - ์ธ ๊ฐ์ ํฉ:
shared[local_i - 2] + shared[local_i - 1] + shared[local_i]
์ฝ๋ ์คํ
์๋ฃจ์ ์ ํ ์คํธํ๋ ค๋ฉด ํฐ๋ฏธ๋์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ธ์:
pixi run p11
pixi run -e amd p11
pixi run -e apple p11
uv run poe p11
ํผ์ฆ์ ์์ง ํ์ง ์์๋ค๋ฉด ์ถ๋ ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
out: HostBuffer([0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])
expected: HostBuffer([0.0, 1.0, 3.0, 6.0, 9.0, 12.0, 15.0, 18.0])
์๋ฃจ์
fn pooling(
output: UnsafePointer[Scalar[dtype], MutAnyOrigin],
a: UnsafePointer[Scalar[dtype], MutAnyOrigin],
size: UInt,
):
shared = stack_allocation[
TPB,
Scalar[dtype],
address_space = AddressSpace.SHARED,
]()
global_i = block_dim.x * block_idx.x + thread_idx.x
local_i = thread_idx.x
if global_i < size:
shared[local_i] = a[global_i]
barrier()
if global_i == 0:
output[0] = shared[0]
elif global_i == 1:
output[1] = shared[0] + shared[1]
elif UInt(1) < global_i < size:
output[global_i] = (
shared[local_i - 2] + shared[local_i - 1] + shared[local_i]
)
๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ฉํ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ํฉ๊ณ ๊ตฌํ์ ๋๋ค. ์ฃผ์ ๋จ๊ณ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
-
๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์ค์
-
๊ณต์ ๋ฉ๋ชจ๋ฆฌ์
TPB๊ฐ ํ ๋น:Input array: [0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0] Block shared: [0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0] -
๊ฐ ์ค๋ ๋๊ฐ ์ ์ญ ๋ฉ๋ชจ๋ฆฌ์์ ํ๋์ฉ ๋ก๋
-
barrier()๋ก ๋ชจ๋ ๋ฐ์ดํฐ ๋ก๋ ์๋ฃ๋ฅผ ๋ณด์ฅ
-
-
๊ฒฝ๊ณ ์ผ์ด์ค
-
์์น 0: ํ๋๋ง
output[0] = shared[0] = 0.0 -
์์น 1: ์ฒ์ ๋ ๊ฐ์ ํฉ
output[1] = shared[0] + shared[1] = 0.0 + 1.0 = 1.0
-
-
๋ฉ์ธ ์๋์ฐ ์ฐ์ฐ
-
์์น 2 ์ดํ:
Position 2: shared[0] + shared[1] + shared[2] = 0.0 + 1.0 + 2.0 = 3.0 Position 3: shared[1] + shared[2] + shared[3] = 1.0 + 2.0 + 3.0 = 6.0 Position 4: shared[2] + shared[3] + shared[4] = 2.0 + 3.0 + 4.0 = 9.0 ... -
๋ก์ปฌ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์๋์ฐ ๊ณ์ฐ:
# 3๊ฐ์ง๋ฆฌ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ window_sum = shared[i-2] + shared[i-1] + shared[i]
-
-
๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ํจํด
- ์ค๋ ๋๋น ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ก ์ ์ญ ์ฝ๊ธฐ 1ํ
- ์ค๋ ๋๋น ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์์ ์ ์ญ ์ฐ๊ธฐ 1ํ
- ์ด์ ์ ๊ทผ์ ์ํด ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ํ์ฉ
- ๋ณํฉ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ํจํด ์ ์ง
์ด ๋ฐฉ์์ ์ฑ๋ฅ ์ต์ ํ ํฌ์ธํธ:
- ์ ์ญ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ์ต์ํ
- ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ก ๋น ๋ฅธ ์ด์ ์กฐํ
- ๊น๋ํ ๊ฒฝ๊ณ ์ฒ๋ฆฌ
- ํจ์จ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๋ณํฉ
์ต์ข ์ถ๋ ฅ์ ๋์ ์๋์ฐ ํฉ๊ณ๋ฅผ ๋ณด์ฌ์ค๋๋ค:
[0.0, 1.0, 3.0, 6.0, 9.0, 12.0, 15.0, 18.0]