Puzzle 13: 1D ํฉ์ฑ๊ณฑ
LayoutTensor๋ก ์ ํํ๊ธฐ
์ง๊ธ๊น์ง GPU ํผ์ฆ ์ฌ์ ์์ GPU ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ๋ํ ๋ ๊ฐ์ง ์ ๊ทผ ๋ฐฉ์์ ํจ๊ป ์ดํด๋ณด์์ต๋๋ค:
- UnsafePointer๋ฅผ ์ฌ์ฉํ ํฌ์ธํฐ ์ง์ ์กฐ์ ๋ฐฉ์์ raw ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ
- ๊ฐ๋ ฅํ
address_spaceํ๋ผ๋ฏธํฐ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋, ๋ณด๋ค ๊ตฌ์กฐํ๋ LayoutTensor์ด ํผ์ฆ๋ถํฐ๋
LayoutTensor๋ก ์์ ํ ์ ํํฉ๋๋ค. ์ด ์ถ์ํ๋ ๋ค์๊ณผ ๊ฐ์ ์ด์ ์ ์ ๊ณตํฉ๋๋ค:
- ํ์ ์์ ํ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ํจํด
- ๋ฐ์ดํฐ ๋ ์ด์์์ ๋ช ํํ ํํ
- ์ฝ๋ ์ ์ง๋ณด์์ฑ ํฅ์
- ๋ฉ๋ชจ๋ฆฌ ๊ด๋ จ ๋ฒ๊ทธ ๋ฐ์ ๊ฐ๋ฅ์ฑ ๊ฐ์
- ๋ด๋ถ ์ฐ์ฐ์ ์๋๋ฅผ ๋ ์ ๋๋ฌ๋ด๋ ํํ๋ ฅ ์๋ ์ฝ๋
- ์์ผ๋ก ์ฐจ์ฐจ ์์๊ฐ ๋ ๋ง์ ๊ฒ๋ค!
์ด๋ฌํ ์ ํ์ Mojo ๐ฅ์ ํ๋์ GPU ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ฒ ์ฌ๋ก์ ๋ง๋ฟ์ ์์ต๋๋ค. ๋์ ์์ค์ ์ถ์ํ๋ก ๋ณต์ก์ฑ์ ๊ด๋ฆฌํ๋ฉด์๋ ์ฑ๋ฅ์ ๊ทธ๋๋ก ์ ์งํ ์ ์์ต๋๋ค.
๊ฐ์
์ ํธ ์ฒ๋ฆฌ์ ์ด๋ฏธ์ง ๋ถ์์์ ํฉ์ฑ๊ณฑ(convolution)์ ๋ ์ํ์ค๋ฅผ ๊ฒฐํฉํด ์๋ก์ด ์ํ์ค๋ฅผ ๋ง๋ค์ด๋ด๋ ํต์ฌ ์ฐ์ฐ์ ๋๋ค. ์ด ํผ์ฆ์์๋ ์ ๋ ฅ ๋ฐฐ์ด ์๋ก ์ปค๋์ ์ฌ๋ผ์ด๋ฉํ๋ฉด์ ๊ฐ ์ถ๋ ฅ ์์๋ฅผ ๊ณ์ฐํ๋ 1D ํฉ์ฑ๊ณฑ์ GPU์์ ๊ตฌํํด ๋ด ๋๋ค.
LayoutTensor ์ถ์ํ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒกํฐ a์ ๋ฒกํฐ b์ 1D ํฉ์ฑ๊ณฑ์ ๊ณ์ฐํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ output์ ์ ์ฅํ๋ ์ปค๋์ ๊ตฌํํ์ธ์.
์ฐธ๊ณ : ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. ์ค๋ ๋๋น ์ ์ญ ์ฝ๊ธฐ 2ํ, ์ ์ญ ์ฐ๊ธฐ 1ํ๋ง ํ์ํฉ๋๋ค.
ํฉ์ฑ๊ณฑ์ด ์ฒ์์ด๋ผ๋ฉด, ๊ฐ์ค์น๊ฐ ์ ์ฉ๋ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ์ฐ์ฐ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค. ๊ฐ ์์น์์ ์ปค๋ ๊ฐ๊ณผ ๋์ํ๋ ์ ๋ ฅ ๊ฐ์ ๊ณฑํ ๋ค ํฉ์ฐํฉ๋๋ค. ์ํ์ ํ๊ธฐ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
\[\Large output[i] = \sum_{j=0}^{\text{CONV}-1} a[i+j] \cdot b[j] \]
์์ฌ ์ฝ๋๋ก ํํํ 1D ํฉ์ฑ๊ณฑ:
for i in range(SIZE):
for j in range(CONV):
if i + j < SIZE:
ret[i] += a_host[i + j] * b_host[j]
์ด ํผ์ฆ์ ๋จ๊ณ์ ์ผ๋ก ์ดํด๋ฅผ ์์๊ฐ ์ ์๋๋ก ๋ ํํธ๋ก ๋๋ฉ๋๋ค:
-
๐ฐ ๊ธฐ๋ณธ ๋ฒ์ ์ฌ๊ธฐ์๋ถํฐ ์์ํ์ธ์. ๋จ์ผ ๋ธ๋ก์์ LayoutTensor์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ฉํ ํฉ์ฑ๊ณฑ ๊ตฌํ์ ๊ธฐ์ด๋ฅผ ์ตํ๋๋ค.
-
โญ ๋ธ๋ก ๊ฒฝ๊ณ ๋ฒ์ ์ด์ด์ ๋ธ๋ก ๊ฒฝ๊ณ๋ฅผ ๋์ด ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํด์ผ ํ๋ ๋ ๊น๋ค๋ก์ด ๊ฒฝ์ฐ์ ๋์ ํฉ๋๋ค. LayoutTensor์ ๊ธฐ๋ฅ์ ๋ณธ๊ฒฉ์ ์ผ๋ก ํ์ฉํฉ๋๋ค.
๊ฐ ๋ฒ์ ์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ํจํด๊ณผ ์ค๋ ๋ ๊ฐ ํ๋ ฅ ์ธก๋ฉด์์ ์๋ก ๋ค๋ฅธ ๋์ ๊ณผ์ ๋ฅผ ์ ์ํฉ๋๋ค. ๊ธฐ๋ณธ ๋ฒ์ ์์ ํฉ์ฑ๊ณฑ ์ฐ์ฐ์ ์๋ฆฌ๋ฅผ ์ตํ ๋ค์, ๋ธ๋ก ๊ฒฝ๊ณ ๋ฒ์ ์์๋ ์ค์ GPU ํ๋ก๊ทธ๋๋ฐ์์ ๋ง์ฃผ์น๋ ๋ณต์กํ ์ํฉ์ ๋ค๋ฃจ๋ ๋ฅ๋ ฅ์ ์ํํด ๋ด ๋๋ค.