์ LayoutTensor๋ฅผ ๊ณ ๋ คํด์ผ ํ ๊น์?
์๋ ๊ธฐ์กด ๊ตฌํ์ ๋ณด๋ฉด ๋ช ๊ฐ์ง ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ ์ ์์ต๋๋ค:
ํ์ฌ ๋ฐฉ์
i = thread_idx.x
output[i] = a[i] + 10.0
1D ๋ฐฐ์ด์์๋ ์ ์๋ํ์ง๋ง, ๋ค์๊ณผ ๊ฐ์ ์ํฉ์์๋ ์ด๋จ๊น์?
- 2D๋ 3D ๋ฐ์ดํฐ๋ฅผ ๋ค๋ค์ผ ํ ๋
- ๋ค์ํ ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์์ ์ฒ๋ฆฌํด์ผ ํ ๋
- ๋ณํฉ(coalesced) ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ ๋ณด์ฅํด์ผ ํ ๋
์์ผ๋ก์ ๋์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
ํผ์ฆ์ ์งํํ๋ฉด์ ๋ฐฐ์ด ์ธ๋ฑ์ฑ์ ์ ์ ๋ณต์กํด์ง๋๋ค:
# ์ดํ ํผ์ฆ์์ ๋ค๋ฃฐ 2D ์ธ๋ฑ์ฑ
idx = row * WIDTH + col
# 3D ์ธ๋ฑ์ฑ
idx = (batch * HEIGHT + row) * WIDTH + col
# ํจ๋ฉ์ด ์๋ ๊ฒฝ์ฐ
idx = (batch * padded_height + row) * padded_width + col
LayoutTensor ๋ฏธ๋ฆฌ๋ณด๊ธฐ
LayoutTensor๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฐ ๊ฒฝ์ฐ๋ฅผ ํจ์ฌ ๊น๋ํ๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค:
# ๋ฏธ๋ฆฌ๋ณด๊ธฐ - ์ง๊ธ์ ์ด ๋ฌธ๋ฒ์ ๋ชฐ๋ผ๋ ๊ด์ฐฎ์ต๋๋ค!
output[i, j] = a[i, j] + 10.0 # 2D ์ธ๋ฑ์ฑ
output[b, i, j] = a[b, i, j] + 10.0 # 3D ์ธ๋ฑ์ฑ
Puzzle 4์์ LayoutTensor๋ฅผ ์์ธํ ๋ฐฐ์ธ ์์ ์ ๋๋ค. ๊ทธ๋ ์ด ๊ฐ๋ ๋ค์ด ํ์๊ฐ ๋ฉ๋๋ค. ์ง๊ธ์ ๋ค์ ๋ด์ฉ์ ์ดํดํ๋ ๋ฐ ์ง์คํ์ธ์:
- ๊ธฐ๋ณธ ์ค๋ ๋ ์ธ๋ฑ์ฑ
- ๊ฐ๋จํ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ํจํด
- ์ค๋ ๋์ ๋ฐ์ดํฐ์ ์ผ๋์ผ ๋งคํ
๐ก ํต์ฌ ํฌ์ธํธ: ์ง์ ์ธ๋ฑ์ฑ์ ๊ฐ๋จํ ๊ฒฝ์ฐ์ ์ ์๋ํ์ง๋ง, ๋ณต์กํ GPU ํ๋ก๊ทธ๋๋ฐ ํจํด์์๋ ๊ณง ๋ ์ ๊ตํ ๋๊ตฌ๊ฐ ํ์ํด์ง๋๋ค.