Puzzle 14: ๋์ ํฉ
๊ฐ์
๋์ ํฉ(prefix sum, scan ์ด๋ผ๊ณ ๋ ํฉ๋๋ค)์ ์ํ์ค์ ๊ฐ์ ์ฐจ๋ก๋ก ๋ํด ๋๊ฐ๋ ๊ธฐ๋ณธ์ ์ธ ๋ณ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค. ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ๋ถํฐ ๊ณผํ ์๋ฎฌ๋ ์ด์ ๊น์ง ์๋ง์ ๋ณ๋ ฌ ์์ฉ์ ํต์ฌ์ ์๋ฆฌํ๊ณ ์์ผ๋ฉฐ, ์ซ์ ์ํ์ค๋ฅผ ๋์ ํฉ๊ณ๋ก ๋ณํํ๋ ์ญํ ์ ํฉ๋๋ค. ์์ฐจ์ ์ผ๋ก ๊ณ์ฐํ๊ธฐ๋ ๊ฐ๋จํ์ง๋ง, GPU์์ ํจ์จ์ ์ผ๋ก ๋ง๋ค๋ ค๋ฉด ๊ธฐ๋ฐํ ๋ณ๋ ฌ์ ์ฌ๊ณ ๊ฐ ํ์ํฉ๋๋ค!
1D LayoutTensor a์ ๋ํด ๋์ ํฉ์ ๊ณ์ฐํ๊ณ ๊ฒฐ๊ณผ๋ฅผ 1D LayoutTensor output์ ์ ์ฅํ๋ ์ปค๋์ ๊ตฌํํ์ธ์.
์ฐธ๊ณ : a์ ํฌ๊ธฐ๊ฐ ๋ธ๋ก ํฌ๊ธฐ๋ณด๋ค ํฐ ๊ฒฝ์ฐ, ๊ฐ ๋ธ๋ก์ ํฉ๊ณ๋ง ์ ์ฅํฉ๋๋ค.
ํต์ฌ ๊ฐ๋
์ด ํผ์ฆ์์ ๋ฐฐ์ธ ๋ด์ฉ:
- ๋ก๊ทธ ๋ณต์ก๋๋ฅผ ๊ฐ์ง ๋ณ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
- ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ํ๋ ฅ ํจํด
- ๋ค๋จ๊ณ ์ฐ์ฐ ์ ๋ต
ํต์ฌ ํต์ฐฐ์ ์์ฐจ ์ฐ์ฐ์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ฉํ ํจ์จ์ ์ธ ๋ณ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ์ ์ดํดํ๋ ๊ฒ์ ๋๋ค.
์๋ฅผ ๋ค์ด, ์ ๋ ฅ ์ํ์ค \([3, 1, 4, 1, 5, 9]\) ๊ฐ ์ฃผ์ด์ง๋ฉด, ๋์ ํฉ์ ๋ค์๊ณผ ๊ฐ์ด ๋ง๋ค์ด์ง๋๋ค:
- \([3]\) (์ฒซ ๋ฒ์งธ ์์ ๊ทธ๋๋ก)
- \([3, 4]\) (3 + 1)
- \([3, 4, 8]\) (์ด์ ํฉ + 4)
- \([3, 4, 8, 9]\) (์ด์ ํฉ + 1)
- \([3, 4, 8, 9, 14]\) (์ด์ ํฉ + 5)
- \([3, 4, 8, 9, 14, 23]\) (์ด์ ํฉ + 9)
์ํ์ ์ผ๋ก, ์ํ์ค \([x_0, x_1, โฆ, x_n]\) ์ ๋์ ํฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค: \[ [x_0, x_0+x_1, x_0+x_1+x_2, โฆ, \sum_{i=0}^n x_i] \]
์์ฐจ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๋ฉด \(O(n)\) ๋จ๊ณ๊ฐ ํ์ํ๊ฒ ์ง๋ง, ์ฌ๊ธฐ์๋ ์๋ฆฌํ 2๋จ๊ณ ๋ณ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก \(O(\log n)\) ๋จ๊ณ๋ง์ ์๋ฃํฉ๋๋ค! ์์ ์ ๋๋ฉ์ด์ ์์ ์ด ๊ณผ์ ์ ํ์ธํ ์ ์์ต๋๋ค.
์ด ํผ์ฆ์ ๊ฐ๋ ์ ๋จ๊ณ์ ์ผ๋ก ์ตํ ์ ์๋๋ก ๋ ํํธ๋ก ๋๋ฉ๋๋ค:
-
๐ฐ ๊ธฐ๋ณธ ๋ฒ์ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ๋ค์ด๊ฐ๋ ๋จ์ผ ๋ธ๋ก ๊ตฌํ๋ถํฐ ์์ํฉ๋๋ค. ํต์ฌ ๋ณ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์๋ฆฌ๋ฅผ ํ์ ํ๋ ๋ฐ ์ข์ต๋๋ค.
-
โญ ์์ฑ ๋ฒ์ ์ด์ด์ ์ฌ๋ฌ ๋ธ๋ก์ ๊ฑธ์น๋ ํฐ ๋ฐฐ์ด์ ์ฒ๋ฆฌํ๋ ๋ ๊น๋ค๋ก์ด ๊ฒฝ์ฐ์ ๋์ ํฉ๋๋ค. ๋ธ๋ก ๊ฐ ์กฐ์จ์ด ํ์ํฉ๋๋ค.
๊ฐ ๋ฒ์ ์ ์ด์ ๋ฒ์ ์์ ์์ ์ฌ๋ฆฌ๋ ๋ฐฉ์์ผ๋ก, ๋ณ๋ ฌ ๋์ ํฉ ์ฐ์ฐ์ ๋ํ ์ดํด๋ฅผ ๊น์ด ์๊ฒ ๋ฐ์ ์์ผ ์ค๋๋ค. ๊ธฐ๋ณธ ๋ฒ์ ์์ ํต์ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋ค์ง๊ณ , ์์ฑ ๋ฒ์ ์์๋ ๋ ํฐ ๋ฐ์ดํฐ์ ์ผ๋ก ํ์ฅํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋๋ค โ ์ค์ GPU ์ ํ๋ฆฌ์ผ์ด์ ์์ ์์ฃผ ๋ง์ฃผ์น๋ ๊ณผ์ ์ ๋๋ค.