SIMD ์ต์ ํ
SIMD๋ Single Instruction Mutliple Data์ ์ค๋ง๋ก, ๊ทผ๋์ ์ฃผ๋ชฉ๋ฐ๋ ์ต์ ํ ๊ธฐ๋ฒ ์ค ํ๋๋ค.
Loop Vectorization์ด๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค.
๋ชจ๋ ์ด์
๋ธ๋ฆฌ ์ฒด๊ณ์์ ๋ค ๋์ํ์ง ์๊ณ , ๋ฉ์ด์ ํ ์ฃผ์ ์ํคํ
์ณ์์๋ง ์ง์๋๋ค.
x86_64์ ์ธํ
๊ณผ AMD๋ ๋๋ถ๋ถ ์ง์ํ๊ณ , Arm์์๋ Neon์ด๋ผ๋ ์ด๋ฆ์ผ๋ก ์ง์ํ๋ค.
Arm์ ๊ฒฝ์ฐ์๋ ๋ง์ดํฌ๋ก ํ๋ก์ธ์์๋ ์๊ณ , ์ผ๋ฐ์ ์ธ ๋ฐ์คํฌํฑ ๋ ๋ฒจ์์๋ง ์ง์๋๋ค.
์ด๋จ๋ ์ฐ๊ธฐ ์ข์๊ฐ?
์ฌ์ค ์ผ๋ฐ์ ์ธ ์ฌ์ฉ๋ก์์๋ ๊ทธ๋ ๊ฒ ์์ฃผ ๋์ ๋๋ ์ฑ๋ฅํฅ์์ ๋ณด์ด์ง๋ ์๋๋ค.
๊ฐ์ฅ ํจ๊ณผ๊ฐ ์ข์ ๋ถ๋ถ์ ๋ฒกํฐ์ฐ์ฐ์ ํ ๋๋ค. ๊ทธ๋ฌ๋๊น, 3D ์์ ์ ํ ๋ ์ข๋ค๋ ๊ฒ์ด๋ค.
์ด๋ด๋๋ 10๋ฐฐ๊ฐ ๋๋ ์ฑ๋ฅํฅ์์ ๋ณด์ฌ์ฃผ๊ธฐ๋ ํ๋ค๊ณ ํ๋ค.
๊ทธ๋์ ์ด๊ฒ ๋ญ๊ฐ?
๋ณต์์ ์ฐ์ฐ์ ๋ณ๋ ฌ๋ก ํ๋ฒ์ ์ฒ๋ฆฌํ์๋ ๊ฒ์ด๋ค.
๊ทธ๋์ ๋ณต์ ๋ฐ์ดํฐ์ ๋ํ ๋จ์ผ ๋ช
๋ น์ด(Single Instruction Mutliple Data)์ธ ๊ฒ์ด๋ค.
๊ฐ๋ น a+b, c+d, e+f, g+h๋ฑ์ ์ฐ์ฐ์ ์ฒ๋ฆฌํ๊ฒ ํ๋ค๋ฉด, ์ผ๋ฐ์ ์ธ cpu๊ตฌ์กฐ์์๋ a+b๋ฅผ ๋จผ์ ์ฐ์ฐํ๊ณ , ๊ทธ๋ค์์ c+d, e+f๋ฅผ ์ฐ์ฐํ๊ณ , ๋ง์ง๋ง์ผ๋ก g+h๋ฅผ ์ฐ์ฐํ๊ฒ ํ ๊ฒ์ด๋ค.
ํ์ดํ๋ผ์ด๋ ์ต์ ํ๋ฅผ ํตํ๋ค๋ฉด ์ด๊ฒ ํจ์ฌ ๋นจ๋ผ์ง ์๋ ์์ง๋ง, ๊ทธ๋๋ ํ ์ฝ์ด๊ฐ ํ๋ฒ์ ํ๋์ ๋ช ๋ น์ฉ๋ง ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋ณํจ์ด ์๋ค.
๊ทธ๋ฐ๋ฐ, ์ธํ
์์ ๋ง๋ SSE(Streaming SIMD Extensions)๋ผ๋ ๋ช
๋ น์ด ํ์ฅ ์งํฉ์ด ์๋ค.
์ฌ๊ธฐ์๋ ๋ช
๋ น์ด์ ์ต๋ ํฌ๊ธฐ๊ฐ 16๋ฐ์ดํธ๋ค.
์ด๊ฑธ ์ฌ์ฉํ๋ฉด ๋๋๊ฒ๋ 16๋ฐ์ดํธ ๋ด์ ์ฌ๋ฌ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ค์ ๋ฃ๊ณ ํ๋ฒ์ ์ฐ์ฐ์ ๋๋ฆด ์๊ฐ ์๋ค.
4๋ฐ์ดํธ ์ ์ 4๊ฐ๋, 8๋ฐ์ดํธ ์ค์ 2๊ฐ๋ฅผ 16๋ฐ์ดํธ ๊ณต๊ฐ์ ์ง์ด๋ฃ๊ณ , SIMD์ฉ ์ธ์คํธ๋ญ์
์ ์ฌ์ฉํ๋ฉด ๋๋ ๊ฒ์ด๋ค!
๊ทธ๋ผ ์ ๋ชฉ๋ก์ ํ๋ฒ์ ๋ํ๊ฑฐ๋, ๊ณฑํ ์ ์๋ค.
๊ทธ๋์ ์ด๋ป๊ฒ ์ฌ์ฉํ๋?
์ธ์ด์ ๋ฐ๋ผ ์ข ๋ค๋ฅด๋ค.
๋์ฒด๋ก๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋๊ฒ ๋ง์์ด ํธํ ๊ฒ์ด๋ค.
Rust์์๋ ์์ง unstableํ ๊ธฐ๋ฅ์ด์ง๋ง, simd ์ฐ์ฐ๊ธฐ๋ฅ์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํ๋ค.
๊ทธ๋์ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
๊ฝค๋ ๊น๋ํ๋ค. ์ ๊ฒฝ์ธ ๊ฒ๋ ์ ๊ณ .
c/c++ ํ๊ฒฝ์์๋ ์ปดํ์ผ๋ฌ๋ง๋ค ๋ค๋ฅด๋ค.
MSVC์ ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ ๋ด์ฅํจ์(intrinsic)์ ํตํด์ ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค.
GCC์ ๊ฒฝ์ฐ์ ์ปดํ์ผ ์ต์
์ ์ถ๊ฐ๋ก ์ค์ ์ฒ๋ฆฌํ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ๋๋ค ์ต์ ํ๋ฅผ ์ํด ๋ฉ๋ชจ๋ฆฌ ์ ๋ ฌ(alignment)์ด๋ผ๋ ๊ฒ์ด ํ์ํ๋ค. ๋ฐฐ์ด์ ์์๋ค์ด ์์๋๋ก ๋ฐฐ์น๋๊ฒ ํ๋ ๊ฒ์ด๋ค.
์ด๊ฒ๋ ์ปดํ์ผ๋ฌ ํค์๋๋ฅผ ํตํด ์ฒ๋ฆฌํ๋ฉด ๋๋ค.
์ฐธ์กฐ
https://velog.io/@kunshim/SIMD-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D