Reduction์ ๋จ์ ๋ฐฐ์ด ํฉ ๊ณ์ฐ์ด ์๋๋ผ, ์ค์ AI ๋ชจ๋ธ ๋ด๋ถ์์๋ ๋งค์ฐ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด:
๋ฑ ๋๋ถ๋ถ์ ๋ฅ๋ฌ๋ ์ฐ์ฐ ๋ด๋ถ์๋ Reduction์ด ํฌํจ๋ฉ๋๋ค.
ํนํ ๋ฅ๋ฌ๋ ํ์ต์์๋ ์์ฒ~์๋ง ๊ฐ์ ๊ฐ๋ค์ ํฉ์น๊ฑฐ๋ ํ๊ท ๋ด๋ ๊ณผ์ ์ด ๋ฐ๋ณต๋๋๋ฐ, ์ด ์ฐ์ฐ์ด ๋๋ฆฌ๋ฉด ์ ์ฒด ํ์ต ์๋๋ ํฌ๊ฒ ๊ฐ์ํ๊ฒ ๋ฉ๋๋ค.
์ค๋์ GPU์์ AI ์ฐ์ฐ์ด ์ด๋ป๊ฒ ๋ณ๋ ฌ์ฒ๋ฆฌ ๋๋์ง ์ดํด๋ณด๊ณ ์ ๋ธ๋ก๊ทธ๊ธ์ ์์ฑํ๊ฒ ๋์์ต๋๋ค.
Reduction์ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ํ๋์ ๊ฐ์ผ๋ก ์ค์ด๋ ์ฐ์ฐ์ ๋๋ค.
์๋ฅผ ๋ค์ด ๋ฐฐ์ด ์์ ์ซ์๊ฐ ์ฌ๋ฌ ๊ฐ ์๋ค๊ณ ํด๋ณด๊ฒ ์ต๋๋ค.
[7.0, 2.1, 5.3, 9.0, 11.2]
์ด ์ซ์๋ค์ ๋ชจ๋ ๋ํ๋ฉด ์ต์ข
์ ์ผ๋ก 34.6์ด๋ผ๋ ํ๋์ ๊ฐ์ด ๋์ต๋๋ค.
7.0 + 2.1 + 5.3 + 9.0 + 11.2 = 34.6
์ด์ฒ๋ผ ์ฌ๋ฌ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ํ๋์ ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ๋ง๋๋ ๊ณผ์ ์ Reduction์ด๋ผ๊ณ ํฉ๋๋ค.
Reduction์ ๋ง์ ์๋ง ์ฌ์ฉ๋๋ ๊ฐ๋ ์ ์๋๊ณ , ๋ง์ ์ซ์๋ค์ ์ค์ด๋ ๊ณผ์ ๋ชจ๋ Reduction์ ๋๋ค. ๋ฐฐ์ด์์ ๊ฐ์ฅ ํฐ ๊ฐ์ ์ฐพ๋ ๊ฒ๋ Reduction์ด๊ณ , ๊ฐ์ฅ ์์ ๊ฐ์ ์ฐพ๋ ๊ฒ๋ Reduction์ ๋๋ค.
์๋ฅผ ๋ค์ด, [7, 2, 5, 9]
์ด ๋ฐฐ์ด์์ ์ต๋๊ฐ์ ์ฐพ์ผ๋ฉด ๊ฒฐ๊ณผ๋ 9์
๋๋ค.
๊ฒฐ๊ตญ ์ฌ๋ฌ ๊ฐ ์ค์์ ํ๋์ ์ต๋๊ฐ๋ง ๋จ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ๋ Reduction์
๋๋ค.
์ฆ, Reduction์ ์ฝ๊ฒ ๋งํด, ๋ง์ ๋ฐ์ดํฐ ์ค์์ ํ๋์ ๋ํ๊ฐ์ ๋ฝ์๋ด๋ ๊ณผ์ ์ด๋ผ๊ณ ์ดํดํ๋ฉด ๋ฉ๋๋ค.
์ฌ๊ธฐ์ ์ค์ํ ์ ์ Reduction์ด ๋ ๊ฐ์ ๊ฐ์ ๋น๊ตํ๊ฑฐ๋ ๊ณ์ฐํ๋ ์ฐ์ฐ์ ๋ฐ๋ณตํด์ ์ ์ฒด ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ ๋ค๋ ๊ฒ ์
๋๋ค.
์๋ฅผ ๋ค์ด ํฉ๊ณ๋ฅผ ๊ตฌํ ๋๋ ๋ ๊ฐ์ ๊ณ์ ๋ํ๊ณ , ์ต๋๊ฐ์ ๊ตฌํ ๋๋ ๋ ๊ฐ ์ค ๋ ํฐ ๊ฐ์ ๊ณ์ ์ ํํฉ๋๋ค.
์์ฐจ ๋ฐฉ์์์๋ 8๊ฐ์ ๊ฐ์ ์ฒ๋ฆฌํ๋ ค๋ฉด ๊ฑฐ์ 8๋ฒ์ ๊ฐ๊น์ด ๋จ๊ณ๊ฐ ํ์ํฉ๋๋ค.
reduction tree์์๋ 3๋จ๊ณ๋ฉด ๋๋ฉ๋๋ค.
์ฆ, ์๊ฐ๋ณต์ก๋๋ O(N) -> O(log N)์ผ๋ก ์ค์ด๋ ๋ค๋ ์ฅ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
๋จผ์ ๋งจ ์๋ฅผ ๋ณด๋ฉด Thread 0๋ถํฐ Thread 7๊น์ง ์ด 8๊ฐ์ thread๊ฐ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์๋์ 0~15 ์ซ์๋ input array์ index๋ฅผ ์๋ฏธํฉ๋๋ค. ์ฆ, ์ด 16๊ฐ์ ๋ฐ์ดํฐ๋ฅผ reductionํ๋ ์ํฉ์
๋๋ค.
๊ฐ thread๋ ์ง์ index ํ๋๋ฅผ ๋ด๋นํฉ๋๋ค.
์๋ฅผ ๋ค์ด:
Thread 0 โ input[0]
Thread 1 โ input[2]
Thread 2 โ input[4]
...
Thread 7 โ input[14]
์ด์ฒ๋ผ ๊ฐ thread๋ ์๊ธฐ ์์น๋ฅผ ๋ด๋นํ๊ณ , ์๊ธฐ ์์น๋ง ์์ ํฉ๋๋ค. ์ด๋ฅผ owner computes ๋ฐฉ์์ด๋ผ๊ณ ํฉ๋๋ค.
์ด ๊ทธ๋ฆผ์์ ํต์ฌ์ ์ธ ๊ฐ์ง์ธ๋ฐ์.
์ฌ๊ธฐ์ ๋ฌธ์ ์ ์ด ์์ต๋๋ค.
์์์ ๋ณธ ๊ทธ๋ฆผ์์๋ stride๊ฐ ์ด๋ ๊ฒ ์ฆ๊ฐํ์ต๋๋ค.
stride: 1 โ 2 โ 4 โ 8
๊ทธ๋ฌ๋ฉด active thread๋ ์ด๋ ๊ฒ ๋จ์ด์ ธ ์๊ฒ ๋๊ฒ ์ฃ .
1๋จ๊ณ: Thread 0, 1, 2, 3, 4, 5, 6, 7
2๋จ๊ณ: Thread 0, 2, 4, 6
3๋จ๊ณ: Thread 0, 4
4๋จ๊ณ: Thread 0
๋ฌธ์ ๋ GPU์์ thread๋ค์ด ๋ณดํต warp๋ผ๋ ๋จ์๋ก ๋ฌถ์ฌ ์คํ๋๋ค๋ ๊ฒ์ ๋๋ค. ๋ณดํต ํ warp๋ 32๊ฐ์ thread๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ๊ทธ๋ฐ๋ฐ ํ warp ์์์ ์ด๋ค thread๋ ๊ณ์ฐํ๊ณ , ์ด๋ค thread๋ ๊ณ์ฐํ์ง ์์ผ๋ฉด ๋ฌธ์ ๊ฐ ์๊น๋๋ค.
์ค์ ๋ก ๋ ผ๋ฌธ์์๋ input size๊ฐ 256์ผ ๋ ๊ธฐ์กด ๋ฐฉ์์ ์์ ํ์ฉ ํจ์จ์ด ์ฝ 35%๋ฐ์ ์ ๋๋ค๊ณ ์ค๋ช ํฉ๋๋ค.
๋ฐ๋ผ์ ๊ฐ์ ๋ ๋ฐฉ์์ด ๋์ค๋๋ฐ์.
์์ด๋์ด๋ active thread๋ค์ ๋ฉ๋ฆฌ ๋จ์ด๋จ๋ฆฌ์ง ๋ง๊ณ , ์์ชฝ์ ์ฐ์์ ์ผ๋ก ๋ชจ์๋์.์
๋๋ค.
์ฆ ๊ธฐ์กด ๋ฐฉ์์ active thread๊ฐ ์ด๋ ๊ฒ ๋๋ค๋ฉด:
๊ฐ์ ๋ฐฉ์์ ์ด๋ ๊ฒ ๋๊ฒ ๋ง๋๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ฉด warp ๋จ์๋ก ๋ดค์ ๋, ์ด๋ค warp๋ ์ ๋ถ ์ผํ๊ณ ์ด๋ค warp๋ ์ ๋ถ ์ฌ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ์ด๋ฌ๋ฉด ํ warp ์์์ ๊ณ์ฐํ๋ thread์ ์ฌ๋ thread๊ฐ ์์ด๋ ์ํฉ์ด ์ค์ด๋ญ๋๋ค.
global memory๋ฅผ ์์ฃผ ์ฐ์ง ์๊ณ , shared memory๋ฅผ ์์ฃผ ์ฌ์ฉํ์ฌ, memory ์ ๊ทผ ํจ์จ์ ๋๋ ค๋ณด์๋ ์์ด๋์ด๋ฅผ ๋ ์ฌ๋ฆด ์ ์์ต๋๋ค.
์ฒ์์ global memory๋ฅผ ํตํด์ input ๊ฐ์ ๋ถ๋ฌ์ต๋๋ค. ๊ทธ ์ดํ ๊ณ์ฐ ๋ถํฐ๋ global memory๊ฐ ์๋๋ผ shared memory์ ์ ์ฅํฉ๋๋ค. ์ฆ, ๋ค์ ๊ณผ์ reduction ๋ถํฐ๋ shared memory ์์์๋ง ์งํํ๋ ๊ฒ์ ๋๋ค.
๋ง์ง๋ง์ผ๋ก ์ต์ข ๊ฒฐ๊ณผ๋ง global memory์ output์ ํ ๋ฒ ์ ์ฅํ๋ฉด memory ์ ๊ทผ ํจ์จ์ฑ์ ์ฌ๋ฆด ์ ์์ต๋๋ค.
Reduction์ ๋จ์ํ ๋ฐฐ์ด ํฉ์ฐ ์๊ณ ๋ฆฌ์ฆ์ฒ๋ผ ๋ณด์ด์ง๋ง, ์ค์ ๋ก๋ AI ์ฐ์ฐ๊ณผ GPU ๋ณ๋ ฌ ์ฒ๋ฆฌ์ ํต์ฌ์ด ๋๋ ํจํด์ ๋๋ค.
ํนํ:
๊ฐ์ ๊ฐ๋ ๋ค์ CUDA ์ต์ ํ์์ ๋งค์ฐ ์ค์ํ ์์์ ๋๋ค.
๋ฅ๋ฌ๋ ๋ชจ๋ธ์ด ์ปค์ง์๋ก ์ฐ์ฐ๋๋ ํญ๋ฐ์ ์ผ๋ก ์ฆ๊ฐํ๊ธฐ ๋๋ฌธ์, ์์ผ๋ก์ AI ์์คํ ์์๋ ๋จ์ ๋ชจ๋ธ ๊ตฌ์กฐ๋ฟ ์๋๋ผ GPU ์ฐ์ฐ ์ต์ ํ ์ญ์ ๋์ฑ ์ค์ํด์ง ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.