์ด ๋ฌธ์์ ์๋ณธ์ ์ธ๋ถ ์ํค์์ ๊ฐ์ ธ์์ต๋๋ค.
SIMD์์ ๋์ด์ด
ํ๋ฆฐ ๋ถ๋ฅ
Flynn's Taxonomy
Flynn's Taxonomy
๋จ์ผ ๋ช
๋ น์ด ์คํธ๋ฆผ Single instruction stream | ๋ค์ค ๋ช
๋ น์ด ์คํธ๋ฆผ Multiple instruction streams | ๋จ์ผ ํ๋ก๊ทธ๋จ Single program | ๋ค์ค ํ๋ก๊ทธ๋จ Multiple programs | |
๋จ์ผ ๋ฐ์ดํฐ ์คํธ๋ฆผ Single data stream | ||||
๋ค์ค ๋ฐ์ดํฐ ์คํธ๋ฆผ Multiple data streams |
1. ๊ฐ์[ํธ์ง]
์คํ ํผ๋ ๋ํ์ ๊ต์์ธ ๋ง์ดํด J. ํ๋ฆฐ์ด 1966๋
์ ์ ์ํ ์ปดํจํฐ ๊ตฌ์กฐ ๋ถ๋ฅ์ด๋ค.
๋ช ๋ น์ด(Instruction)์ ๋ฐ์ดํฐ ์ ๋ ฅ(Data stream)์ ๊ฐ์์ ๋ฐ๋ผ ๊ตฌ๋ถํ๋ค.
๋ช ๋ น์ด(Instruction)์ ๋ฐ์ดํฐ ์ ๋ ฅ(Data stream)์ ๊ฐ์์ ๋ฐ๋ผ ๊ตฌ๋ถํ๋ค.
2. ๋ถ๋ฅ[ํธ์ง]
2.1. SISD[ํธ์ง]
Single instruction stream, single data stream.
ํ ๋ฒ์ ๋ฐ์ดํฐ ํ๋๋ฅผ ๋ช ๋ น์ด ํ๋๋ก ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฒ. ํฐ ๋ ธ์ด๋ง ๊ตฌ์กฐ์ ์ปดํจํฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด ๊ธฐ๋ฒ์ ๋ฐ๋ฅธ๋ค. ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ด๊ณ ๊ฐ๋จํ ๊ตฌ์กฐ์ด์ง๋ง ๋ช ๋ น์ด๋ฅผ ์คํํ ๋๋ง๋ค ๋ช ๋ น์ด์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ ์ฒ๋ฆฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ ํจ์จ์ด ๋จ์ด์ง๋ค.
ํ ๋ฒ์ ๋ฐ์ดํฐ ํ๋๋ฅผ ๋ช ๋ น์ด ํ๋๋ก ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฒ. ํฐ ๋ ธ์ด๋ง ๊ตฌ์กฐ์ ์ปดํจํฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด ๊ธฐ๋ฒ์ ๋ฐ๋ฅธ๋ค. ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ด๊ณ ๊ฐ๋จํ ๊ตฌ์กฐ์ด์ง๋ง ๋ช ๋ น์ด๋ฅผ ์คํํ ๋๋ง๋ค ๋ช ๋ น์ด์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ ์ฒ๋ฆฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ ํจ์จ์ด ๋จ์ด์ง๋ค.
2.2. SIMD[ํธ์ง]
Single instruction stream, multiple data streams.
ํ ๋ฒ์ ๋ฐ์ดํฐ ์ฌ๋ฌ ๊ฐ๋ฅผ ๋ช ๋ น์ด ํ๋๋ก ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฒ.
ํ์ฌ ๋๋ถ๋ถ์ ํ๋ก๊ทธ๋จ์ SISD๋ฐฉ์์ผ๋ก ๋์ํ๋ค. ์ฆ ํ๋์ ๋ช ๋ น์ผ๋ก ํ๋์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ด๊ณ 2๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ค๋ฉด 2๋ฒ ์ฐ์ฐํ๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ค์ ํ๋ก๊ทธ๋จ์ด ์๋ ๊ฒฝ์ฐ์๋ ๋ฐฑ์ด๋ฉด ๋ฐฑ SISD๋ก ๊ตฌํ๋๋๋ฐ CPU์ ์ฑ๋ฅ์ 100% ํ์ฉํ์ง ๋ชปํ๋ ๊ฒ์ด๋ค. ๋คํํ ์์ฆ ์ปดํ์ผ๋ฌ๋ค์ ๋๋ํด์ ์ผ๊ด๊ณ์ฐ ๋ฃจํ๋ฌธ ์ ๋๋ SIMD๋ก ์ ๋ฐ๊ฟ์ฃผ๋ ํธ์ด๋ค.
CPU ์ ๋ณด๋ฅผ ๋ณผ ์ ์๋(CPU-Z ๊ฐ์) ํ๋ก๊ทธ๋จ์์ MMX, SSE, SSE2, SSE3 ๊ฐ์ ๊ฑธ ๋ณธ ์ ์ด ์์ ๊ฒ์ด๋ค. ์ด๊ฒ์ด ๋ฐ๋ก SIMD๋ฅผ ํ์ฉํ ๋ช ๋ น์ด ์ธํธ์ธ๋ฐ ๊ตฌ์ฒด์ ์ผ๋ก๋ ์ด๋ฅผ CPU์์ ํ๋์จ์ด์ ์ผ๋ก ์ง์ํ๋ค๋ ๊ฒ์ด๋ค. 2011๋ ์๋๋ธ๋ฆฟ์ง ๊ธฐ๋ฐ ์ดํ, ๋ถ๋์ ๊ธฐ๋ฐ ์ดํ CPU๋ผ๋ฉด AVX๋ ์ง์ํ๋ค. ์ด ๊ธฐ์ ์ ์ฌ์ฉํ๋ ค๋ฉด ํน์ํ ๋ ์ง์คํฐ์ ํน์ํ ๋ช ๋ น์ ์ฌ์ฉํด์ผ ํ๋๋ฐ ์ต์ ์ปดํ์ผ๋ฌ๋ค์ Loop Unrolling ๋ฑ์ ๊ธฐ์ ์ ํตํด ์์ฒด์ ์ผ๋ก SIMD instruction์ ์ฌ์ฉํ ์ฝ๋๋ก ๋ณํํด์ค๋ค. ๋จ, ์ฝ๋๋ฅผ ์ปดํ์ผ๋ฌ๊ฐ ๋ฒกํฐ ์ฐ์ฐ์ผ๋ก ์ธ์ํ๊ธฐ ์ฝ๊ฒ ์์ฑํด์ฃผ์ด์ผ ํ๋ค. ์ธํ ์ icc, ๋ง์ดํฌ๋ก์ํํธ์ CL, GNU gcc, LLVM clang ๋ฑ์ด ์ปดํ์ผ๋ฌ ์ต์ ์ ํตํด ๋ฃจํ๋ฅผ SIMD๋ก ๋ณํํ๋ ๊ฒ์ ์ง์ํ๋ฉฐ, icc์ ๊ฒฝ์ฐ์ #pragma simd๋ผ๋ ํน์ํ ์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ง์ํ๋ค. ์ด๋ฐ ๊ฑฐ ์ ๊ฒฝ์ฐ๊ณ ์ถ์ง ์์๋ฐ SIMD์ ๊ณ ์ฑ๋ฅ์ ์ํ๋ ํ๋ก๊ทธ๋๋จธ๋ ์ด๋ฐ ๊ธฐ์ ๋ค์ ๊ตฌํํ ์์น ์ฐ์ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ ธ๋ค ์ฐ๋ฉด ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๊ตฌํ๋ ์ ์ถ๋ ฅ ๋ฐ์ดํฐ ํฌ๋งท์๋ง ๋ง๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ค๋นํด์ ๋์ ธ ์ฃผ๋ฉด ๋๋จธ์ง๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ปดํ์ผ๋ฌ๊ฐ ์์์ ํ ๊ฒ์ด๋ค.
Intel ์ง์๊ณผ ๋ฌ๋ฆฌ, ARM ์ง์์์๋ NEON์ด๋ผ๋ SIMD ๋ช ๋ น์ด ์ ์ ์ง์ํ๋ค. Intel ์ง์๊ณผ ๋น์ทํ ๋ถ๋ถ๋ ์์ง๋ง, CPU ์ ์ฑ ์ด๋ ๊ตฌ์กฐ๊ฐ ๋ค๋ฅธ ๋ถ๋ถ๋ค๋ ๋ง์ผ๋ฏ๋ก ์ฃผ์ํ์ฌ ํ๋ก๊ทธ๋๋ฐํด์ผ ํ๋ค.
icc์ ๊ฒฝ์ฐ์๋ ์ต์ ์ ํตํด SIMD๋ฟ๋ง์ด ์๋๋ผ ๋ฃจํ๋ฅผ ์์ฒด์ ์ผ๋ก ๋ฉํฐ์ฐ๋ ๋ฉ์ผ๋ก ์ฒ๋ฆฌํด์ฃผ๋ ๊ธฐ๋ฅ์ด ์์ผ๋ฉฐ, ์ต์ ๋ฒ์ ์ OpenMP์์๋ SIMD ๊ด๋ จ ์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ถ๊ฐํ์ฌ ๋ฉํฐ์ฐ๋ ๋ฉ๊ณผ SIMD์ ๋ ๋ง๋ฆฌ ํ ๋ผ๋ฅผ ๋์์ ์ก์ผ๋ ค๋ ์๋๋ฅผ ํ๊ณ ์๋ค. ์ด๋ฐ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์ฝ๋ ์ต์ ํ๋ฅผ ํ ๊ฒฝ์ฐ, ์์น์ฐ์ฐ์ด ๋ง์ ์ฝ๋๋ ์ปดํ์ผ๋ฌ๊ฐ 400% x ์ฝ์ด ๊ฐ์ ์ด์์ผ๋ก ์ฑ๋ฅ์ ๋ฝ์๋ผ ์๋ ์๋ค. ํ์ง๋ง ๋ฐ์ดํฐ ์์กด์ฑ ๋ฑ์ ์ด์๋ค์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด์ง ์๊ณ ์์ฑ๋ ์ฝ๋๋ฅผ ์ปดํ์ผ๋ฌ๊ฐ ์ฑ๋ฅ ํฅ์์ ์ํด Reordering ๋ฑ์ ์ ์ฉํ์ ๋, ์ฝ๋ ์์ฑ์์ ์๋์ ์ฝ๋์ ๊ฒฐ๊ณผ ๊ฐ์ด ํญ์ ๋ง๋๋ค๋ ๋ณด์ฅ์ ์๋ค. ํ ์์ ์์๋ ๋จ์ผ ์ค๋ ๋ ๊ธฐ๋ฐ์ ์ฝ๋์์๋ง ๋ณด์ฅ๋๋ค. ์๋ จ๋ ํ๋ก๊ทธ๋๋จธ๋ค์ ์ด๋ฌํ ์ด์๋ฅผ ํํผํ๊ธฐ ์ํด ๋ฝ์ ๊ฑธ๊ฑฐ๋ Atomic Type์ ํ์ฉํ๊ฑฐ๋, ๋ถ๋ณ ๋ณ์๋ฅผ ์ ์ ํ ์ฌ์ฉํ๋ค. ๋ฐ์ดํฐ ์์กด์ฑ์ด ๊ฑฐ์ ์๊ณ ์ค๋ ๋๊ฐ ํต์ ๋ ๊ฑฐ์ ์์ด์ ๋ณ๋ฌ๋ฆฌ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด์ง ์์๋ ๋ฉํฐ์ค๋ ๋๋ก ์ฑ๋ฅ์ด ๋งค์ฐ ์ ํฅ์๋๋ ์๊ณ ๋ฆฌ์ฆ๋ค์ embarrassingly parallel(์ฒ์น ๊ณค๋ ๋ณ๋ ฌ)ํ๋ค๊ณ ํ๋ค. ์๋ฅผ ๋ค์ด ๊ฑฐ๋ํ ์ ์๋ฐฐ์ด์ ํ๊ท ๊ฐ์ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ์ดํฐ ํค์ ๋(Data Hazard)๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ค๋ ๋ ์์ฑ ์ค๋ฒํค๋๋ฅผ ์ ์ธํ๋ฉด ๋ณ๋ ฌํํ๋๋งํผ ์ฑ๋ฅ์ด ์ฌ๋ผ๊ฐ๋ค. ํ๊ตญ์ด๋ก๋ '์ฒ์น ๊ณค๋'์ด๋ผ๊ณ ๋ฒ์ญํ๋๋ฐ, ์๋ฏธ์์ผ๋ก๋ '์ด๋ฆฌ๋ฅ์ ํ ์ ๋๋ก, ํฉ๋นํ ์ ๋๋ก ๋ณ๋ ฌํ๊ฐ ์ ๋๋ค'๋ผ๊ณ ์ดํดํ ์ ์๋ค.
๋น์ฐํ CPU์ ์ข ๋ฅ์ ๋ฐ๋ผ SIMD ๋ช ๋ น์ด๋ ๋ฌ๋ผ์ง๋ค. ์์์ ์๊ฐํ ๋ด์ฉ์ ์ฃผ๋ก Intel CPU๋ค์ ๊ตญํ๋ ๊ฒ์ด๋ฉฐ, ์๋ฅผ ๋ค์ด ๋ชจ๋ฐ์ผ์ ๋ค์ด๊ฐ๋ ARM์ ๊ฒฝ์ฐ, NEON์ด๋ผ ๋ถ๋ฆฌ๋ ๋ค๋ฅธ SIMD๋ฅผ ์ ๊ณตํ๋ค. ๊ณตํต์ ์ผ๋ก SIMD๋ผ๋ ๊ธฐ๋ณธ์ ์ธ ๊ฐ๋ ์ ๋์ผํ์ง๋ง ์ธ์ธํ ๋ถ๋ถ์ผ๋ก ๋ค์ด๊ฐ๋ฉด ํ๋ซํผ์ ํฌ๊ฒ ์์กด์ ์ด๋ผ ๊ฐ์ฃผํด๋ ์ข์๋งํผ ํฐ ์ฐจ์ด๋ฅผ ๋ณด์ธ๋ค.
ํ ๋ฒ์ ๋ฐ์ดํฐ ์ฌ๋ฌ ๊ฐ๋ฅผ ๋ช ๋ น์ด ํ๋๋ก ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฒ.
ํ์ฌ ๋๋ถ๋ถ์ ํ๋ก๊ทธ๋จ์ SISD๋ฐฉ์์ผ๋ก ๋์ํ๋ค. ์ฆ ํ๋์ ๋ช ๋ น์ผ๋ก ํ๋์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ด๊ณ 2๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ค๋ฉด 2๋ฒ ์ฐ์ฐํ๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ค์ ํ๋ก๊ทธ๋จ์ด ์๋ ๊ฒฝ์ฐ์๋ ๋ฐฑ์ด๋ฉด ๋ฐฑ SISD๋ก ๊ตฌํ๋๋๋ฐ CPU์ ์ฑ๋ฅ์ 100% ํ์ฉํ์ง ๋ชปํ๋ ๊ฒ์ด๋ค. ๋คํํ ์์ฆ ์ปดํ์ผ๋ฌ๋ค์ ๋๋ํด์ ์ผ๊ด๊ณ์ฐ ๋ฃจํ๋ฌธ ์ ๋๋ SIMD๋ก ์ ๋ฐ๊ฟ์ฃผ๋ ํธ์ด๋ค.
CPU ์ ๋ณด๋ฅผ ๋ณผ ์ ์๋(CPU-Z ๊ฐ์) ํ๋ก๊ทธ๋จ์์ MMX, SSE, SSE2, SSE3 ๊ฐ์ ๊ฑธ ๋ณธ ์ ์ด ์์ ๊ฒ์ด๋ค. ์ด๊ฒ์ด ๋ฐ๋ก SIMD๋ฅผ ํ์ฉํ ๋ช ๋ น์ด ์ธํธ์ธ๋ฐ ๊ตฌ์ฒด์ ์ผ๋ก๋ ์ด๋ฅผ CPU์์ ํ๋์จ์ด์ ์ผ๋ก ์ง์ํ๋ค๋ ๊ฒ์ด๋ค. 2011๋ ์๋๋ธ๋ฆฟ์ง ๊ธฐ๋ฐ ์ดํ, ๋ถ๋์ ๊ธฐ๋ฐ ์ดํ CPU๋ผ๋ฉด AVX๋ ์ง์ํ๋ค. ์ด ๊ธฐ์ ์ ์ฌ์ฉํ๋ ค๋ฉด ํน์ํ ๋ ์ง์คํฐ์ ํน์ํ ๋ช ๋ น์ ์ฌ์ฉํด์ผ ํ๋๋ฐ ์ต์ ์ปดํ์ผ๋ฌ๋ค์ Loop Unrolling ๋ฑ์ ๊ธฐ์ ์ ํตํด ์์ฒด์ ์ผ๋ก SIMD instruction์ ์ฌ์ฉํ ์ฝ๋๋ก ๋ณํํด์ค๋ค. ๋จ, ์ฝ๋๋ฅผ ์ปดํ์ผ๋ฌ๊ฐ ๋ฒกํฐ ์ฐ์ฐ์ผ๋ก ์ธ์ํ๊ธฐ ์ฝ๊ฒ ์์ฑํด์ฃผ์ด์ผ ํ๋ค. ์ธํ ์ icc, ๋ง์ดํฌ๋ก์ํํธ์ CL, GNU gcc, LLVM clang ๋ฑ์ด ์ปดํ์ผ๋ฌ ์ต์ ์ ํตํด ๋ฃจํ๋ฅผ SIMD๋ก ๋ณํํ๋ ๊ฒ์ ์ง์ํ๋ฉฐ, icc์ ๊ฒฝ์ฐ์ #pragma simd๋ผ๋ ํน์ํ ์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ง์ํ๋ค. ์ด๋ฐ ๊ฑฐ ์ ๊ฒฝ์ฐ๊ณ ์ถ์ง ์์๋ฐ SIMD์ ๊ณ ์ฑ๋ฅ์ ์ํ๋ ํ๋ก๊ทธ๋๋จธ๋ ์ด๋ฐ ๊ธฐ์ ๋ค์ ๊ตฌํํ ์์น ์ฐ์ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ ธ๋ค ์ฐ๋ฉด ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๊ตฌํ๋ ์ ์ถ๋ ฅ ๋ฐ์ดํฐ ํฌ๋งท์๋ง ๋ง๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ค๋นํด์ ๋์ ธ ์ฃผ๋ฉด ๋๋จธ์ง๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ปดํ์ผ๋ฌ๊ฐ ์์์ ํ ๊ฒ์ด๋ค.
Intel ์ง์๊ณผ ๋ฌ๋ฆฌ, ARM ์ง์์์๋ NEON์ด๋ผ๋ SIMD ๋ช ๋ น์ด ์ ์ ์ง์ํ๋ค. Intel ์ง์๊ณผ ๋น์ทํ ๋ถ๋ถ๋ ์์ง๋ง, CPU ์ ์ฑ ์ด๋ ๊ตฌ์กฐ๊ฐ ๋ค๋ฅธ ๋ถ๋ถ๋ค๋ ๋ง์ผ๋ฏ๋ก ์ฃผ์ํ์ฌ ํ๋ก๊ทธ๋๋ฐํด์ผ ํ๋ค.
icc์ ๊ฒฝ์ฐ์๋ ์ต์ ์ ํตํด SIMD๋ฟ๋ง์ด ์๋๋ผ ๋ฃจํ๋ฅผ ์์ฒด์ ์ผ๋ก ๋ฉํฐ์ฐ๋ ๋ฉ์ผ๋ก ์ฒ๋ฆฌํด์ฃผ๋ ๊ธฐ๋ฅ์ด ์์ผ๋ฉฐ, ์ต์ ๋ฒ์ ์ OpenMP์์๋ SIMD ๊ด๋ จ ์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ถ๊ฐํ์ฌ ๋ฉํฐ์ฐ๋ ๋ฉ๊ณผ SIMD์ ๋ ๋ง๋ฆฌ ํ ๋ผ๋ฅผ ๋์์ ์ก์ผ๋ ค๋ ์๋๋ฅผ ํ๊ณ ์๋ค. ์ด๋ฐ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์ฝ๋ ์ต์ ํ๋ฅผ ํ ๊ฒฝ์ฐ, ์์น์ฐ์ฐ์ด ๋ง์ ์ฝ๋๋ ์ปดํ์ผ๋ฌ๊ฐ 400% x ์ฝ์ด ๊ฐ์ ์ด์์ผ๋ก ์ฑ๋ฅ์ ๋ฝ์๋ผ ์๋ ์๋ค. ํ์ง๋ง ๋ฐ์ดํฐ ์์กด์ฑ ๋ฑ์ ์ด์๋ค์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด์ง ์๊ณ ์์ฑ๋ ์ฝ๋๋ฅผ ์ปดํ์ผ๋ฌ๊ฐ ์ฑ๋ฅ ํฅ์์ ์ํด Reordering ๋ฑ์ ์ ์ฉํ์ ๋, ์ฝ๋ ์์ฑ์์ ์๋์ ์ฝ๋์ ๊ฒฐ๊ณผ ๊ฐ์ด ํญ์ ๋ง๋๋ค๋ ๋ณด์ฅ์ ์๋ค. ํ ์์ ์์๋ ๋จ์ผ ์ค๋ ๋ ๊ธฐ๋ฐ์ ์ฝ๋์์๋ง ๋ณด์ฅ๋๋ค. ์๋ จ๋ ํ๋ก๊ทธ๋๋จธ๋ค์ ์ด๋ฌํ ์ด์๋ฅผ ํํผํ๊ธฐ ์ํด ๋ฝ์ ๊ฑธ๊ฑฐ๋ Atomic Type์ ํ์ฉํ๊ฑฐ๋, ๋ถ๋ณ ๋ณ์๋ฅผ ์ ์ ํ ์ฌ์ฉํ๋ค. ๋ฐ์ดํฐ ์์กด์ฑ์ด ๊ฑฐ์ ์๊ณ ์ค๋ ๋๊ฐ ํต์ ๋ ๊ฑฐ์ ์์ด์ ๋ณ๋ฌ๋ฆฌ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด์ง ์์๋ ๋ฉํฐ์ค๋ ๋๋ก ์ฑ๋ฅ์ด ๋งค์ฐ ์ ํฅ์๋๋ ์๊ณ ๋ฆฌ์ฆ๋ค์ embarrassingly parallel(์ฒ์น ๊ณค๋ ๋ณ๋ ฌ)ํ๋ค๊ณ ํ๋ค. ์๋ฅผ ๋ค์ด ๊ฑฐ๋ํ ์ ์๋ฐฐ์ด์ ํ๊ท ๊ฐ์ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ์ดํฐ ํค์ ๋(Data Hazard)๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ค๋ ๋ ์์ฑ ์ค๋ฒํค๋๋ฅผ ์ ์ธํ๋ฉด ๋ณ๋ ฌํํ๋๋งํผ ์ฑ๋ฅ์ด ์ฌ๋ผ๊ฐ๋ค. ํ๊ตญ์ด๋ก๋ '์ฒ์น ๊ณค๋'์ด๋ผ๊ณ ๋ฒ์ญํ๋๋ฐ, ์๋ฏธ์์ผ๋ก๋ '์ด๋ฆฌ๋ฅ์ ํ ์ ๋๋ก, ํฉ๋นํ ์ ๋๋ก ๋ณ๋ ฌํ๊ฐ ์ ๋๋ค'๋ผ๊ณ ์ดํดํ ์ ์๋ค.
๋น์ฐํ CPU์ ์ข ๋ฅ์ ๋ฐ๋ผ SIMD ๋ช ๋ น์ด๋ ๋ฌ๋ผ์ง๋ค. ์์์ ์๊ฐํ ๋ด์ฉ์ ์ฃผ๋ก Intel CPU๋ค์ ๊ตญํ๋ ๊ฒ์ด๋ฉฐ, ์๋ฅผ ๋ค์ด ๋ชจ๋ฐ์ผ์ ๋ค์ด๊ฐ๋ ARM์ ๊ฒฝ์ฐ, NEON์ด๋ผ ๋ถ๋ฆฌ๋ ๋ค๋ฅธ SIMD๋ฅผ ์ ๊ณตํ๋ค. ๊ณตํต์ ์ผ๋ก SIMD๋ผ๋ ๊ธฐ๋ณธ์ ์ธ ๊ฐ๋ ์ ๋์ผํ์ง๋ง ์ธ์ธํ ๋ถ๋ถ์ผ๋ก ๋ค์ด๊ฐ๋ฉด ํ๋ซํผ์ ํฌ๊ฒ ์์กด์ ์ด๋ผ ๊ฐ์ฃผํด๋ ์ข์๋งํผ ํฐ ์ฐจ์ด๋ฅผ ๋ณด์ธ๋ค.
2.2.1. SIMD ๋ ์ง์คํฐ[ํธ์ง]
CPU์์ ์ ๋ณด๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด์๋ ๋ฐ๋์ ๋ ์ง์คํฐ๋ผ๊ณ ํ๋ CPU๋ด๋ถ์ ์์ ๊ธฐ์ต์ฅ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฌํด์ผ ํ๋ค. ์ผ๋ฐ ๋ฒ์ฉ ๋ ์ง์คํฐ๋ก EAX, EBX, ECX, EDX ๊ฐ์ ๊ฒ ์๊ณ ํน์ ์ฉ๋ ๋ ์ง์คํฐ๋ก ESP, EBP ๊ฐ์๊ฒ ์๋๋ฐ ์ด๋ฐ ๊ฒ๋ค์ด ๋ชจ๋ SISD์ฉ ๋ ์ง์คํฐ๋ค. SIMD์ฉ์ผ๋ก๋ ๋ ์ง์คํฐ๊ฐ ์กด์ฌํ๋ฉฐ ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฅผ ํ๋ฒ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ผ๋ฐ ๋ฒ์ฉ ๋ ์ง์คํฐ๋ณด๋ค ์ฉ๋์ด ํฌ๋ค. XMM0, XMM1 ๊ฐ์ ์ด๋ฆ์ด ๋ถ์ด์๊ณ CPU๊ฐ ์ง์ํ๋ ๊ธฐ์ ์ด ๋ญ๋์ ๋ฐ๋ผ ์ด ๋ ์ง์คํฐ๋ ๋ฌ๋ผ์ง๋ค. CPU ๋ ์ง์คํฐ ๋ ๋ฒจ์ SIMD๋ฅผ SWAR(SIMD Within A Register)๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค.
2.2.2. SIMD ๋ช ๋ น์ด[ํธ์ง]
์์ SIMD ๋ ์ง์คํฐ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ์ด์
๋ธ๋ฆฌ ๋ช
๋ น์ด์ด๋ค. ์ด๊ฒ ํ๋๋ง ์คํํ๋ฉด SIMD ๋ ์ง์คํฐ์ ์ ์ฅ๋ ๋ฐ์ดํฐ ์ ๋ถ๊ฐ ์ฒ๋ฆฌ๋ผ์ ๋๋ค๋ฅธ SIMD ๋ ์ง์คํฐ์ ๊ฒฐ๊ณผ๊ฐ์ด ์ ์ฅ๋๋ค. ์๋ฅผ ๋ค์ด
์ ๋ ๋ช ๋ น์ eax += ebx, xmm0 += xmm1์ผ๋ก ์๋ก ๊ฐ์๋ณด์ธ๋ค.
ํ์ง๋ง xmm0 ์์ฒด๊ฐ 128๋นํธ SIMD ๋ ์ง์คํฐ์ด๊ณ paddd ๋ช ๋ น์ด๋ 128๋นํธ SIMD ๋ ์ง์คํฐ๋ฅผ 32๋นํธ ์ ์ ๋ค ๊ฐ์ ๋ฐฐ์ด๋ก ๊ฐ์ฃผํ๊ณ ์ฐ์ฐํ๋ผ๋ ๋ป์ด๋ค.[1] 2๋ฒ ์ฐ์ฐ์ ํ์ด์ ์ฐ์๋ฉด
์ ๊ฐ์ด ๋ค ๋ฒ ๋ฐ๋ณตํ๋ ์ฐ์ฐ์ด๋ค.[2] ์ฆ ๊ณ์ฐ ์๋๋ฅผ ์ด๋ก ์ ์ผ๋ก 4๋ฐฐ ๋์ด์ฌ๋ฆฐ๋ค.[3]
AVX๋ YMM ๋ ์ง์คํฐ๋ฅผ ์ฌ์ฉํ๋ฉฐ ์ฐ์ฐ ๋ช ๋ น์ด๋ ๋ค๋ฅด๋ค. YMM ๋ ์ง์คํฐ๋ 256๋นํธ๋ก XMM์ 2๋ฐฐ. ์ฆ, 8๋ฐฐ ๋น ๋ฅด๊ฒ ์ฐ์ฐ์ด ๊ฐ๋ฅํ๋ค.
AVX-512๋ AVX์ ํ์ฅ ๋ช ๋ น์ด ์ธํธ์ด๋ฉฐ, ์ ์จ ํ์ด ๋์ด์ธ ๋๋ฉ(72์ฝ์ด 288์ฐ๋ ๋์ CPU)๊ณผ ์ค์นด์ด๋ ์ดํฌ-SP, ์ค์นด์ด๋ ์ดํฌ-X๋ถํฐ ์ ์ฉ๋ SIMD ๋ช ๋ น์ด ์ธํธ์ด๋ค. ์ด๋ฆ๋๋ก 512๋นํธ๋ก, ์ด๋ก ์ ๊ธฐ์กด AVX์ 2๋ฐฐ์ ์๋ ์ฆ, 16๋ฐฐ๋ก ์ฐ์ฐ์ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
1. add eax, ebx
2. paddd xmm0, xmm1
์ ๋ ๋ช ๋ น์ eax += ebx, xmm0 += xmm1์ผ๋ก ์๋ก ๊ฐ์๋ณด์ธ๋ค.
ํ์ง๋ง xmm0 ์์ฒด๊ฐ 128๋นํธ SIMD ๋ ์ง์คํฐ์ด๊ณ paddd ๋ช ๋ น์ด๋ 128๋นํธ SIMD ๋ ์ง์คํฐ๋ฅผ 32๋นํธ ์ ์ ๋ค ๊ฐ์ ๋ฐฐ์ด๋ก ๊ฐ์ฃผํ๊ณ ์ฐ์ฐํ๋ผ๋ ๋ป์ด๋ค.[1] 2๋ฒ ์ฐ์ฐ์ ํ์ด์ ์ฐ์๋ฉด
1. add xmm0[ 00.. 31], xmm1[ 00.. 31]
2. add xmm0[ 32.. 63], xmm1[ 32.. 63]
3. add xmm0[ 64.. 95], xmm1[ 64.. 95]
4. add xmm0[ 96..127], xmm1[ 96..127]
์ ๊ฐ์ด ๋ค ๋ฒ ๋ฐ๋ณตํ๋ ์ฐ์ฐ์ด๋ค.[2] ์ฆ ๊ณ์ฐ ์๋๋ฅผ ์ด๋ก ์ ์ผ๋ก 4๋ฐฐ ๋์ด์ฌ๋ฆฐ๋ค.[3]
AVX๋ YMM ๋ ์ง์คํฐ๋ฅผ ์ฌ์ฉํ๋ฉฐ ์ฐ์ฐ ๋ช ๋ น์ด๋ ๋ค๋ฅด๋ค. YMM ๋ ์ง์คํฐ๋ 256๋นํธ๋ก XMM์ 2๋ฐฐ. ์ฆ, 8๋ฐฐ ๋น ๋ฅด๊ฒ ์ฐ์ฐ์ด ๊ฐ๋ฅํ๋ค.
AVX-512๋ AVX์ ํ์ฅ ๋ช ๋ น์ด ์ธํธ์ด๋ฉฐ, ์ ์จ ํ์ด ๋์ด์ธ ๋๋ฉ(72์ฝ์ด 288์ฐ๋ ๋์ CPU)๊ณผ ์ค์นด์ด๋ ์ดํฌ-SP, ์ค์นด์ด๋ ์ดํฌ-X๋ถํฐ ์ ์ฉ๋ SIMD ๋ช ๋ น์ด ์ธํธ์ด๋ค. ์ด๋ฆ๋๋ก 512๋นํธ๋ก, ์ด๋ก ์ ๊ธฐ์กด AVX์ 2๋ฐฐ์ ์๋ ์ฆ, 16๋ฐฐ๋ก ์ฐ์ฐ์ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
2.2.3. SIMD Intrinsics[ํธ์ง]
์์์ ์๊ฐํ ์ด์
๋ธ๋ฆฌ ๋ช
๋ น์ด๋ ์ถฉ๋ถํ ๊ฐ๋ ฅํ์ง๋ง ์ฌ์ฉ์์ ์
์ฅ์์๋ ๊ทธ๋ฆฌ ์ง๊ด์ ์ด์ง๋ ์๋ค. ๊ฒ๋ค๊ฐ ๊ด๋ฆฌํ๊ธฐ๋ ์ด๋ ต๋ค. ๊ทธ๋์ ๋ณด๋ค ์ง๊ด์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ์ด์
๋ธ๋ฆฌ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ๋์์ฃผ๋ ๊ฒ ๋ฐ๋ก Intrinsics๋ค. C/C++ ๊ณ์ด์ด ๋ฉ์ด์ ์ด๋ฉด์๋ ํ๋์จ์ด์ ์๋์ ์ผ๋ก ์น์ํ ์ธ์ด์ด๋ฏ๋ก Intrinsics๋ ์ฃผ๋ก C๋ C++ ํ์์ ๋ฐ๋ฅธ๋ค. ๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋์ค์ด์
๋ธ ํด๋ณด๋ฉด ๋ญ๋น๋๋ Instruction๋ ์์ง๋ง, ์์ฐ์ฑ์ด๋ ์ ์ง, ๋ณด์์ ์ธก๋ฉด์์๋ ํจ์ฌ ๋ฐ์ด๋๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ ์ด์๊ฐ ๊ทธ ๋ฏธ์ธํ ์ฐจ์ด๊ฐ ์ ์๋ฏธํ ์ ๋๋ก ์ค์ํ ๊ฒ ์๋๋ผ๋ฉด ์ผ๋ฐ์ ์ผ๋ก๋ Intrinsics๋ฅผ ์ฌ์ฉํ๋ค.
์๋ฅผ ๋ค์ด AVX-128 (SSE)๋ฅผ Intrinsic์ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํํํ ์ ์๋ค.
์ ์ฝ๋๋ ๋๋ชจ๋๊ณผ์ 1:1 ๋งค์นญ์ ์ํด ํ์ด์ ์ด ๊ฒ์ผ๋ก ์ค์ ๋ก๋ ๋ก๋ ๋ช ๋ น์ ์๋ตํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๊ณ ์ด์ ๋ธ๋ฆฌ์ ๊ฒฝ์ฐ ๋ํ ๋ก๋ ๋ช ๋ น์ ํ ์ฐจ๋ก๋ง ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ฐ, ์ผ๋ฐ์ ์ผ๋ก ์์ ์ด์ ๋ธ๋ฆฌ๋ก ์์ฑ๋ ์ฝ๋์ ๋นํด Intrinsic์ ์ฌ์ฉํ ์ฝ๋์ ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ๊ฐ ์ฝ๋ ํ๋ฆ์ ๋ฐ๋ผ ์ต์ ํ๊ฐ ๊ฐ๋ฅํ๋ค๋ ์ฅ์ ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๋น์ฐํ์ง๋ง ์ด๋ ๊ฒ Intrinsic ์ ์ฌ์ฉํด ์ง์ ์ต์ ํ ํ๋ ๊ฒฝ์ฐ ์ด์ ๋ธ๋ฆฌ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด๊ธฐ์ข ํ๋ก์ธ์์์ ํธํ์ฑ์ด ์๋ค. (ARM Neon != Intel AVX)
์๋ฅผ ๋ค์ด AVX-128 (SSE)๋ฅผ Intrinsic์ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํํํ ์ ์๋ค.
#include <immintrin.h>
extern void int32x4add(int *src1, int *src2, int *dest)
{
__m128i a = _mm_load_si128((__m128i *)src1); // vmovdqa xmm0, *src1
__m128i b = _mm_load_si128((__m128i *)src2); // vmovdqa xmm1, *src2
__m128i c = _mm_add_epi32(a, b); // vpaddd xmm2, xmm0, xmm1
_mm_store_si128((__m128i *)dest, c); // vmovdqa *dest, xmm2
return; // ret
}์ ์ฝ๋๋ ๋๋ชจ๋๊ณผ์ 1:1 ๋งค์นญ์ ์ํด ํ์ด์ ์ด ๊ฒ์ผ๋ก ์ค์ ๋ก๋ ๋ก๋ ๋ช ๋ น์ ์๋ตํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๊ณ ์ด์ ๋ธ๋ฆฌ์ ๊ฒฝ์ฐ ๋ํ ๋ก๋ ๋ช ๋ น์ ํ ์ฐจ๋ก๋ง ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ฐ, ์ผ๋ฐ์ ์ผ๋ก ์์ ์ด์ ๋ธ๋ฆฌ๋ก ์์ฑ๋ ์ฝ๋์ ๋นํด Intrinsic์ ์ฌ์ฉํ ์ฝ๋์ ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ๊ฐ ์ฝ๋ ํ๋ฆ์ ๋ฐ๋ผ ์ต์ ํ๊ฐ ๊ฐ๋ฅํ๋ค๋ ์ฅ์ ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๋น์ฐํ์ง๋ง ์ด๋ ๊ฒ Intrinsic ์ ์ฌ์ฉํด ์ง์ ์ต์ ํ ํ๋ ๊ฒฝ์ฐ ์ด์ ๋ธ๋ฆฌ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด๊ธฐ์ข ํ๋ก์ธ์์์ ํธํ์ฑ์ด ์๋ค. (ARM Neon != Intel AVX)
2.2.4. GPU์์์ SIMD[ํธ์ง]
GPU์ ์์ญ์์๋ SIMD๊ฐ ๋น์ฐ์๋๊ณ ์์๋ค. ๊ฑฐ๊ธฐ๋ ์ ์ด์ ์ฝ์ด๊ฐ ๋ช์ฒ ๊ฐ์ฉ ๋ฌ๋ ค์๋ ๋ค์คํ๋ก์ธ์ ํ๊ฒฝ์ด๋ผ์ ์ฒ์๋ถํฐ SIMDํ์์ผ๋ก ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด์๋ค. ๊ทธ ๊ธฐ๋ฅ์ ๊ณ ์คํ ๊ฒ์๊ณผ ์ํผ์ปดํจํฐ ๋ฑ์์ ๋ฒ์ฉ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด ๊ฐ๋ฐ๋ ๊ธฐ์ ์ด GPGPU. NVIDIA๊ฐ 2006๋
์ CUDA๋ฅผ ์ฒ์ ์๊ฐํ์ ๋ ๋ฉํฐ์ค๋ ๋ฉ๊ณผ ๊ฒฐํฉ๋ SIMT(Single Instruction, Multiple Thread) ๊ฐ๋
์ ๊ฐ์กฐํ ๋ฐ ์๋ค.
2.2.5. Web์์์ SIMD[ํธ์ง]
๋ง์ด๋ํ ์ฌ์ค์ด๊ธด ํ์ง๋ง Web์์๋ ์ด ๊ธฐ๋ฒ์ด ์ฐ์ธ๋ค. Dart๊ฐ ๋ํ์ .
2.2.6. SIMD์ ํ๊ณ[ํธ์ง]
ํ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฌถ์ด์ ์ฒ๋ฆฌํ๋ ๊ฐ๋
์ด๋ค๋ณด๋ ์๋ฌด๋๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ ๊ฒฝ์ธ๊ฒ ๋ง์์ง๋ค. ์๋ฅผ ๋ค์ด ๋ฐ์ดํฐ ๊ฐ์๊ฐ 4 ํน์ 8๋ก ๋ฑ ๋๋ ๋จ์ด์ง์ง ์๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ์ง ์๊ฒ ๊ตฌ์กฐ์ฒด์ ํจ๋ฉ ๋ฐ์ดํธ๋ฅผ ๋ฃ์ด์ ์ํ๋ ๋ฒกํฐ ํฌ๊ธฐ์ ๋ง์ถ๋ค๊ฑฐ๋, malloc์ ํธ์ถ ํ ๋ ๋ฒกํฐ ํฌ๊ธฐ์ ๋ฐฐ์๋งํผ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ํ๊ฒ ํ๋ ๊ธฐ์ ์ ์ตํ์ผ ํ๋ค.
ํ๋ CPU๋ค์ ๋น์ ๋ ฌ๋ ๋ฐ์ดํฐ๋ค๋ x86์ vlddqu์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋์ง ์๊ฒ ์ฒ๋ฆฌํ ์ ์๋ ๊ธฐ๋ฅ๋ค์ ์ ๊ณตํ๊ณ ์์ผ๋ ๋น์ ๋ ฌ๋ ํ์ด์ง ํน์ฑ์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ ์ฌ์ดํด์ ์ข๋ ์๋ชจํ๊ฒ ๋๋ฏ๋ก ํต์์ ์ผ๋ก unaligned load ์ 5%์ ์ฑ๋ฅ ์ ํ๊ฐ ์๋ค.
๋ํ ์ฝ๋๋ฅผ ์์ฑํ ๋, ๋ฃจํ๋ฅผ ์์๊ฒ ์์ฑํ ์๋ก(CPU์ ์บ์ ํฌ๊ธฐ๋ฅผ ๊ณ ๋ คํ๋ค๊ฑฐ๋) ํ๋ก๊ทธ๋จ์ด ๋นจ๋ผ์ง๊ธฐ์ ๊ด๋ จ๋ ์ง์(CPU ์ํคํ ์ฒ ์์ค)์ ๋น ์ญํ๊ฒ ์์์ผ CPU์ ์ง์ ํ ์ฑ๋ฅ์ ๋์ด๋ผ ์ ์๋ค๋ ๊ฒ์ด ๋จ์ ์ด๋ค. CPU์ SIMD์ ๋๋น๋๋ GPGPU๋ ๊ทธ๋ฐ๊ฑฐ ์์ด ์ฝ๋๋ฅผ ์์ฑํด๋ ์ ๋งํด์ ์์ฑํ ์๊ณ ๋ฆฌ์ฆ์ ๊ทนํ๊น์ง ์ฑ๋ฅ์ด ๋์ค๋ ๊ฒ์ ๋นํ๋ฉด ํ์คํ ๋จ์ . ๋์ GPGPU๋ฅผ ๋จ์ฉํ๊ฒ ๋๋ฉด ์์ฒญ๋ ์ ๋ ฅ ์์ค์ ์๋ฌ๋ฆฌ๊ฒ ๋๋ ๊ฒ์ ๋ฌผ๋ก ์ด๊ณ , ์ฌ์ง์ด ๊ธฐ๋ํ๋ ์ฑ๋ฅ ํฅ์์ด ์๊ฐ๋ณด๋ค ์ด๋ค์ง์ง ์์ ์๋ ์์ผ๋ ์ฃผ์ํด์ผ ํ๋ค. ์๋ฅผ ๋ค์ด ๋ชจ๋ฐ์ผ ํ๊ฒฝ์์ GPGPU์ ํฌ๊ฒ ์์กดํ๊ฒ ๋๋ฉด ์ ๋ ฅ ์๋ชจ๋ก ์ธํ ์ด ๋ฐ์์ผ๋ก ์ธํด, ๊ธฐ๊ธฐ์ ์ฐ๋กํ๋ง์ด ๊ฑธ๋ ค ๊ฐ์ ๋ก ์ฑ๋ฅ์ ์ ์ฝํ๋ ๋ชจ๋๋ก ์ง์ ํ๊ฑฐ๋ ๊ฐ์ ์ฌ๋ถํ ํ ์๋ ์๋ค.
ํ๋ CPU๋ค์ ๋น์ ๋ ฌ๋ ๋ฐ์ดํฐ๋ค๋ x86์ vlddqu์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋์ง ์๊ฒ ์ฒ๋ฆฌํ ์ ์๋ ๊ธฐ๋ฅ๋ค์ ์ ๊ณตํ๊ณ ์์ผ๋ ๋น์ ๋ ฌ๋ ํ์ด์ง ํน์ฑ์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ ์ฌ์ดํด์ ์ข๋ ์๋ชจํ๊ฒ ๋๋ฏ๋ก ํต์์ ์ผ๋ก unaligned load ์ 5%์ ์ฑ๋ฅ ์ ํ๊ฐ ์๋ค.
๋ํ ์ฝ๋๋ฅผ ์์ฑํ ๋, ๋ฃจํ๋ฅผ ์์๊ฒ ์์ฑํ ์๋ก(CPU์ ์บ์ ํฌ๊ธฐ๋ฅผ ๊ณ ๋ คํ๋ค๊ฑฐ๋) ํ๋ก๊ทธ๋จ์ด ๋นจ๋ผ์ง๊ธฐ์ ๊ด๋ จ๋ ์ง์(CPU ์ํคํ ์ฒ ์์ค)์ ๋น ์ญํ๊ฒ ์์์ผ CPU์ ์ง์ ํ ์ฑ๋ฅ์ ๋์ด๋ผ ์ ์๋ค๋ ๊ฒ์ด ๋จ์ ์ด๋ค. CPU์ SIMD์ ๋๋น๋๋ GPGPU๋ ๊ทธ๋ฐ๊ฑฐ ์์ด ์ฝ๋๋ฅผ ์์ฑํด๋ ์ ๋งํด์ ์์ฑํ ์๊ณ ๋ฆฌ์ฆ์ ๊ทนํ๊น์ง ์ฑ๋ฅ์ด ๋์ค๋ ๊ฒ์ ๋นํ๋ฉด ํ์คํ ๋จ์ . ๋์ GPGPU๋ฅผ ๋จ์ฉํ๊ฒ ๋๋ฉด ์์ฒญ๋ ์ ๋ ฅ ์์ค์ ์๋ฌ๋ฆฌ๊ฒ ๋๋ ๊ฒ์ ๋ฌผ๋ก ์ด๊ณ , ์ฌ์ง์ด ๊ธฐ๋ํ๋ ์ฑ๋ฅ ํฅ์์ด ์๊ฐ๋ณด๋ค ์ด๋ค์ง์ง ์์ ์๋ ์์ผ๋ ์ฃผ์ํด์ผ ํ๋ค. ์๋ฅผ ๋ค์ด ๋ชจ๋ฐ์ผ ํ๊ฒฝ์์ GPGPU์ ํฌ๊ฒ ์์กดํ๊ฒ ๋๋ฉด ์ ๋ ฅ ์๋ชจ๋ก ์ธํ ์ด ๋ฐ์์ผ๋ก ์ธํด, ๊ธฐ๊ธฐ์ ์ฐ๋กํ๋ง์ด ๊ฑธ๋ ค ๊ฐ์ ๋ก ์ฑ๋ฅ์ ์ ์ฝํ๋ ๋ชจ๋๋ก ์ง์ ํ๊ฑฐ๋ ๊ฐ์ ์ฌ๋ถํ ํ ์๋ ์๋ค.
2.2.7. .Net Framework ์ง์[ํธ์ง]
Microsoft๊ฐ ์ํํ์ธ ์ต์ JIT์ ๋ฐํํ๋ฉด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํํ๋ก SIMD์ ์ฌ์ฉํ ์ ์๋๋ก Nuget์์ Microsoft.Bcl.Simd์ ๋ฐฐํฌํ๊ณ ์๋ค.
2.3. MISD[ํธ์ง]
Multiple instruction streams, single data stream.
ํ ๋ฒ์ ๋ฐ์ดํฐ ํ ๊ฐ๋ฅผ ์ฌ๋ฌ ๋ช ๋ น์ด๋ก ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฒ. ์๋ฅผ ๋ค์ด ๊ณฑ์ ์ ํ๊ณ ์ถ์๋ฐ ๋ช ๋ น์ด๋ SHIFT ์ฐ์ฐ๊ณผ ADD ์ฐ์ฐ๋ง์ด ์๋ค๊ณ ํ๋ฉด, SHIFT์ ADD๋ฅผ ๋ฐ๋ณตํ์ฌ ๊ณฑ์ ์ ๊ตฌํํ ์ ์๋ค. ์ด๊ฒ์ ์ํํธ์จ์ด ๋ ๋ฒจ์ด ์๋ ํ๋์จ์ด(ํ๋ก์ธ์) ๋ ๋ฒจ๋ก ๊ตฌํํ ๊ฒ์ด MISD์ด๋ค. CPU์์ ํํ ์ฌ์ฉํ๋ ํ์ดํ๋ผ์ธ ๊ธฐ๋ฒ์ด ์ด์ ํด๋นํ๋ค. CPU ๋ฐ์์ ๋ณด์๋ฉด ๋ฐ์ดํฐ ํ ๊ฐ๋ฅผ ๋ฃ์ด ๊ฒฐ๊ณผ ํ ๊ฐ๋ฅผ ์ป์ด๋ด๋ฏ๋ก SISD์ ํฌ๊ฒ ๊ตฌ๋ณํ์ง ์๋ ๊ฒฝํฅ์ด ์๋ค.
ํ ๋ฒ์ ๋ฐ์ดํฐ ํ ๊ฐ๋ฅผ ์ฌ๋ฌ ๋ช ๋ น์ด๋ก ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฒ. ์๋ฅผ ๋ค์ด ๊ณฑ์ ์ ํ๊ณ ์ถ์๋ฐ ๋ช ๋ น์ด๋ SHIFT ์ฐ์ฐ๊ณผ ADD ์ฐ์ฐ๋ง์ด ์๋ค๊ณ ํ๋ฉด, SHIFT์ ADD๋ฅผ ๋ฐ๋ณตํ์ฌ ๊ณฑ์ ์ ๊ตฌํํ ์ ์๋ค. ์ด๊ฒ์ ์ํํธ์จ์ด ๋ ๋ฒจ์ด ์๋ ํ๋์จ์ด(ํ๋ก์ธ์) ๋ ๋ฒจ๋ก ๊ตฌํํ ๊ฒ์ด MISD์ด๋ค. CPU์์ ํํ ์ฌ์ฉํ๋ ํ์ดํ๋ผ์ธ ๊ธฐ๋ฒ์ด ์ด์ ํด๋นํ๋ค. CPU ๋ฐ์์ ๋ณด์๋ฉด ๋ฐ์ดํฐ ํ ๊ฐ๋ฅผ ๋ฃ์ด ๊ฒฐ๊ณผ ํ ๊ฐ๋ฅผ ์ป์ด๋ด๋ฏ๋ก SISD์ ํฌ๊ฒ ๊ตฌ๋ณํ์ง ์๋ ๊ฒฝํฅ์ด ์๋ค.
2.4. MIMD[ํธ์ง]
Multiple instruction streams, multiple data streams.
ํ ๋ฒ์ ๋ฐ์ดํฐ ์ฌ๋ฌ ๊ฐ๋ฅผ ์ฌ๋ฌ ๋ช ๋ น์ด๋ก ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฒ. SIMD์์ ์ฐจ์ด์ ์ SIMD๋ ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ์ธ์คํธ๋ญ์ ์ผ๋ก ํ๊บผ๋ฒ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด๊ณ MIMD๋ ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ์ธ์คํธ๋ญ์ ์ผ๋ก ํ๊บผ๋ฒ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด๋ค.[4] ํ๋์ ๋์์ ๋ฉํฐ์ค๋ ๋ ํ๋ก๊ทธ๋จ๋ค์ ๋ชจ๋ MIMD๋ผ๊ณ ๋ณผ ์ ์๋ค. SPMD์ MPMD๋ ์ด MIMD์์ ๋์ฑ ์ธ๋ถํ๋ ๋ถ๋ฅ์ด๋ค.
์ธํ ์ ์จ ํ์ด, ์ํผ์ค์นผ๋ผ๋ฅผ ์ง์ํ๋ ๋ชจ๋ ๋ฉํฐ์ฝ์ด ํ๋ก์ธ์, ๊ทธ๋ฆฌ๊ณ ํ์ฌ ๊ฑฐ์ ๋ชจ๋ ์ํผ์ปดํจํฐ๋ค์ ์ด MIMD๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ํ๋ค.
ํ ๋ฒ์ ๋ฐ์ดํฐ ์ฌ๋ฌ ๊ฐ๋ฅผ ์ฌ๋ฌ ๋ช ๋ น์ด๋ก ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฒ. SIMD์์ ์ฐจ์ด์ ์ SIMD๋ ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ์ธ์คํธ๋ญ์ ์ผ๋ก ํ๊บผ๋ฒ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด๊ณ MIMD๋ ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ์ธ์คํธ๋ญ์ ์ผ๋ก ํ๊บผ๋ฒ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด๋ค.[4] ํ๋์ ๋์์ ๋ฉํฐ์ค๋ ๋ ํ๋ก๊ทธ๋จ๋ค์ ๋ชจ๋ MIMD๋ผ๊ณ ๋ณผ ์ ์๋ค. SPMD์ MPMD๋ ์ด MIMD์์ ๋์ฑ ์ธ๋ถํ๋ ๋ถ๋ฅ์ด๋ค.
์ธํ ์ ์จ ํ์ด, ์ํผ์ค์นผ๋ผ๋ฅผ ์ง์ํ๋ ๋ชจ๋ ๋ฉํฐ์ฝ์ด ํ๋ก์ธ์, ๊ทธ๋ฆฌ๊ณ ํ์ฌ ๊ฑฐ์ ๋ชจ๋ ์ํผ์ปดํจํฐ๋ค์ ์ด MIMD๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ํ๋ค.
2.4.1. SPMD[ํธ์ง]
Single programs, multiple data streams.
๋จ์ผ ํ๋ก์ธ์๊ฐ ์ต์ 2๊ฐ ์ด์์ ํ๋ก๊ทธ๋จ์ ์คํํ๋ค.
๋จ์ผ ํ๋ก์ธ์๊ฐ ์ต์ 2๊ฐ ์ด์์ ํ๋ก๊ทธ๋จ์ ์คํํ๋ค.
2.4.2. MPMD[ํธ์ง]
Multiple programs, multiple data streams.
๋ค์์ ํ๋ก์ธ์๊ฐ ์ต์ 2๊ฐ ์ด์์ ํ๋ก๊ทธ๋จ์ ์คํํ๋ค.
์ด๊ฒ์ ์๋ ํ๋ ์ด์คํ ์ด์ 3์ CELL ํ๋ก์ธ์์์ ์ ์ฉ๋ ๋ฐฉ์์ด๋ค.
๋ค์์ ํ๋ก์ธ์๊ฐ ์ต์ 2๊ฐ ์ด์์ ํ๋ก๊ทธ๋จ์ ์คํํ๋ค.
์ด๊ฒ์ ์๋ ํ๋ ์ด์คํ ์ด์ 3์ CELL ํ๋ก์ธ์์์ ์ ์ฉ๋ ๋ฐฉ์์ด๋ค.
3. ๊ด๋ จ ๋ถ๋ฅ[ํธ์ง]
- ํญ์ ๋ถ๋ฅ (Feng's Classification) : ๋นํธ ๋ฐ ์๋ ๋ ๋ฒจ์ ์์ฐจ์ ๋ฐ ๋ณ๋ ฌ ์ฐ์ฐ ์ฌ๋ถ๋ก ๊ตฌ๋ถํ์ง๋ง, ํ์ดํ๋ผ์ธ์ ํตํ ๋์ ์ฒ๋ฆฌ๋ฅผ ์ค๋ช ํ ์ ์๋ ๋จ์ ์ด ์๋ค.
- WSBS (Word Serial Bit Serial)
- WSBP (Word Serial Bit Parallel)
- WPBS (Word Parallel Bit Serial)
- WPBP (Word Parallel Bit Parallel)
[1] x86 ๋ ์ง์คํฐ ์ค r๋ก ์์ํ๋ ๊ฒ๋ค์ 64๋นํธ, e๋ก ์์ํ๋ ๊ฒ๋ค์ 32๋นํธ์ด๋ค.
[2] 32๋นํธ ์ด์ธ์ 16๋นํธ, 8๋นํธ ๋จ์ ์ฐ์ฐ๋ ๊ฐ๋ฅ.
[3] ๋ฌผ๋ก ์ค์ ๋ก๋ ๋งค์ฐ ๋ง์ ๋ณ์๊ฐ ์์ผ๋ฏ๋ก 4๋ฐฐ ๋์ด์ฌ๋ฆฐ๋ค๋ ๋ณด์ฅ์ด ์๋ค. ์๋ฅผ ๋ค์ด ๋ช
๋ น ์์ฒด๊ฐ ์ค์ ๋ก๋ ์คํ ์๊ฐ(ํด๋ญ ์)์ด ๋ ๊ฑธ๋ฆฌ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด ์ค๋๋ฐ ์๊ฐ์ด ๋ ๊ฑธ๋ฆฌ๋ ๋ฑ์ ์ด์ ๋ก ์๋ ๋ช
๋ น 1๊ฐ๋ฅผ ์คํ์ํค๋ ๊ฒ์ ๋นํด ์๊ฐ์ด ๋ ๊ฑธ๋ฆฌ๋ ๊ฒฝ์ฐ๋ ์๊ณ , ํ์ฌ์ ์ด์์ฒด์ ๋ ๋ฉํฐํ์คํน์ผ๋ก ์ฌ๋ฌ ํ๋ก๊ทธ๋จ์ด ๋ฒ๊ฐ์๊ฐ๋ฉฐ ์๋ํ๋ฉฐ ํ๋ก๊ทธ๋จ์ด ๊ณ์ฐ์ ํ๋ฒ๋ง ํ๊ณ ๋๋๋ ๊ฒ์ด ์๋๋ฏ๋ก ์ด์ ์ ์ฒ๋ฆฌํ ๋ช
๋ น ๋ฐ ๋ฐ์ดํฐ์ ์ํด CPU์ ํ์ดํ๋ผ์ธ, ์บ์ ๋ฑ์ ๋ด์ฉ์ด ๋ฌ๋ผ์ ธ์ ์คํ ์๊ฐ์ด ๋ฌ๋ผ์ง ์๋ ์๋ค. ๋ํ CPU๋ ์นฉ์
, ๋ฉ๋ชจ๋ฆฌ, ๋ฒ์ค ๋ฑ๋ฑ์ ๊ตฌ์กฐ ๋ฐ ์ฑ๋ฅ์ ์ํด์๋ ์ํฅ์ ๋ฐ์ ์ ์๋ค. ๊ฒฐ๋ก ์ ์ผ๋ก ์ฃผ์ด์ง ํ๊ฒฝ ๋ฐ ๊ฐ๋ฐ์์ ์ ๋ต์ ๋ฐ๋ผ ์ฒ์ฐจ๋ง๋ณ์ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ ์๋ค.
[4] ๊ฐ๋จํ ์ค๋ช
ํ์๋ฉด SIMD๋ (10, 10, 10, 10)โ(2, -4, 5, 3)โ(4, 7, 2, 9)์ ๊ฐ์ ๋ฐ์ดํฐ ์
๋ ฅ ์คํธ๋ฆผ์ (+), (-)์ ๊ฐ์ ๋ช
๋ น์ด ์คํธ๋ฆผ์ด ์๋ค๋ฉด ์ฐ์ฐ ๊ฒฐ๊ณผ๋ก (12, 6, 15, 13)โ(8, -1, 13, 4)๊ฐ ๋์จ๋ค. ์ฆ, ์ฌ๋ฌ ๋ฐ์ดํฐ์ ๋ํด ๋ชจ๋ ๋์ผํ ์ฐ์ฐ๋ง์ ์ ์ฉํ ์ ์๋ค. ๋ฐ๋ฉด MIMD๋ (10, 10, 10, 10)โ(2, -4, 5, 3)โ(4, 7, 2, 9)๊ฐ ์์ผ๋ฉด ์ฌ๊ธฐ์ (+, -, *, %)โ(-, +, %, *)๋ฅผ ์ ์ฉํ ์ ์๊ณ ๊ฒฐ๊ณผ๋ก (12, 14, 50, 1)โ(8, 13, 0, 9)์ ์ป์ ์ ์๋ค. MIMD๋ฅผ ํ์ฉํ๋ฉด ๋ณ๋ ฌ๋ก ์ ์ฉํ ์ ์๋ ์ฐ์ฐ์ ๋ชจ๋ ๋ค๋ฅด๊ฒ ์ค ์ ์๋ ๊ฒ์ด๋ค. MIMD๋ก SIMD๋ฅผ ์๋ฎฌ๋ ์ด์
ํ ์ ์์ผ๋ ๊ทธ ์ญ์ ๋ถ๊ฐ๋ฅํ๋ฉฐ ๊ฐ๋
์ ์ผ๋ก๋ SIMD๋ฅผ MIMD์ ํน์ํ ํ๊ฐ์ง ํํ๋ก ๊ฐ์ฃผํ ์ ์๋ค.