์น์ด์ ๋ธ๋ฆฌ์ ๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ๊ณผ SIMD ๋ช ๋ น์ด๋ฅผ ํ์ฉํ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ์ดํด๋ณด์ธ์. ์ด๋ฏธ์ง ์ฒ๋ฆฌ, ์ค๋์ค ์ธ์ฝ๋ฉ, ๊ณผํ ์ปดํจํ ๋ฑ ๋ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์ ์ธ๊ณ ํ๋ซํผ์์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
์น์ด์ ๋ธ๋ฆฌ ๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ ๋ฒกํฐํ: SIMD ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ
์น์ด์ ๋ธ๋ฆฌ(Wasm)๋ ์น๊ณผ ๊ทธ ์ด์์ ํ๊ฒฝ์์ ๋ค์ดํฐ๋ธ์ ๊ฐ๊น์ด ์ฑ๋ฅ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ฐ๋ ฅํ ๊ธฐ์ ๋ก ๋ถ์ํ์ต๋๋ค. ๋ฐ์ด๋๋ฆฌ ๋ช ๋ น์ด ํ์์ ๋ค์ํ ํ๋ซํผ๊ณผ ์ํคํ ์ฒ์์ ํจ์จ์ ์ธ ์คํ์ ์ง์ํฉ๋๋ค. ์น์ด์ ๋ธ๋ฆฌ ์ฝ๋๋ฅผ ์ต์ ํํ๋ ํต์ฌ์ ๋ฒกํฐํ ๊ธฐ์ , ํนํ ๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ๊ณผ ํจ๊ป SIMD(๋จ์ผ ๋ช ๋ น์ด, ๋ค์ค ๋ฐ์ดํฐ) ๋ช ๋ น์ด๋ฅผ ํ์ฉํ๋ ๊ฒ์ ๋๋ค. ์ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์์๋ ์น์ด์ ๋ธ๋ฆฌ์ ๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ๋ณต์ก์ฑ๊ณผ ์ด๋ฅผ SIMD์ ๊ฒฐํฉํ์ฌ ์๋นํ ์ฑ๋ฅ ํฅ์์ ๋ฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ์์ธํ ์ดํด๋ณด๋ฉฐ, ์ ์ธ๊ณ์ ์ธ ์ ์ฉ ๊ฐ๋ฅ์ฑ๊ณผ ์ด์ ์ ๋ณด์ฌ์ค๋๋ค.
์น์ด์ ๋ธ๋ฆฌ์ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ ์ดํดํ๊ธฐ
์น์ด์ ๋ธ๋ฆฌ๋ ์ ํ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ๋ก ์๋ํฉ๋๋ค. ์ด ๋ฉ๋ชจ๋ฆฌ๋ ์น์ด์ ๋ธ๋ฆฌ ๋ช ๋ น์ด๋ก ์ ๊ทผํ๊ณ ์กฐ์ํ ์ ์๋ ์ฐ์์ ์ธ ๋ฐ์ดํธ ๋ธ๋ก์ ๋๋ค. ์ด ๋ฉ๋ชจ๋ฆฌ์ ์ด๊ธฐ ํฌ๊ธฐ๋ ๋ชจ๋ ์ธ์คํด์คํ ์ค์ ์ง์ ํ ์ ์์ผ๋ฉฐ, ํ์์ ๋ฐ๋ผ ๋์ ์ผ๋ก ํ์ฅ๋ ์ ์์ต๋๋ค. ์ด ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ ์ดํดํ๋ ๊ฒ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ จ ์ฐ์ฐ์ ์ต์ ํํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
์ฃผ์ ๊ฐ๋ :
- ์ ํ ๋ฉ๋ชจ๋ฆฌ(Linear Memory): ์น์ด์ ๋ธ๋ฆฌ ๋ชจ๋์ ์ฃผ์ ์ง์ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ํ๋ด๋ ์ฐ์์ ์ธ ๋ฐ์ดํธ ๋ฐฐ์ด์ ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ํ์ด์ง(Memory Pages): ์น์ด์ ๋ธ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ ํ์ด์ง ๋จ์๋ก ๋๋๋ฉฐ, ๊ฐ ํ์ด์ง๋ ์ผ๋ฐ์ ์ผ๋ก 64KB ํฌ๊ธฐ์ ๋๋ค.
- ์ฃผ์ ๊ณต๊ฐ(Address Space): ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ๋ฒ์์ ๋๋ค.
์น์ด์ ๋ธ๋ฆฌ์ ๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ
์น์ด์ ๋ธ๋ฆฌ๋ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์กฐ์์ ์ํด ์ค๊ณ๋ ๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ๋ช ๋ น์ด ์ธํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด ๋ช ๋ น์ด๋ค์ ์ต์ํ์ ์ค๋ฒํค๋๋ก ๋๋์ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ๋ณต์ฌ, ์ฑ์ฐ๊ธฐ ๋ฐ ์ด๊ธฐํํ ์ ์๊ฒ ํด์ค๋๋ค. ์ด๋ฌํ ์ฐ์ฐ์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ, ์ด๋ฏธ์ง ์กฐ์, ์ค๋์ค ์ธ์ฝ๋ฉ๊ณผ ๊ด๋ จ๋ ์๋๋ฆฌ์ค์์ ํนํ ์ ์ฉํฉ๋๋ค.
ํต์ฌ ๋ช ๋ น์ด:
memory.copy: ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ํ ์์น์์ ๋ค๋ฅธ ์์น๋ก ๋ณต์ฌํฉ๋๋ค.memory.fill: ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์ง์ ๋ ๋ฐ์ดํธ ๊ฐ์ผ๋ก ์ฑ์๋๋ค.memory.init: ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ๋ก๋ถํฐ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์ด๊ธฐํํฉ๋๋ค.- ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ(Data Segments): ์น์ด์
๋ธ๋ฆฌ ๋ชจ๋ ๋ด์ ์ ์ฅ๋ ๋ฏธ๋ฆฌ ์ ์๋ ๋ฐ์ดํฐ ๋ธ๋ก์ผ๋ก,
memory.init์ ์ฌ์ฉํ์ฌ ์ ํ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ณต์ฌํ ์ ์์ต๋๋ค.
์ด๋ฌํ ๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ๋ฉ๋ชจ๋ฆฌ ์์น๋ฅผ ์๋์ผ๋ก ๋ฐ๋ณตํ๋ ๊ฒ๋ณด๋ค ์๋นํ ์ด์ ์ ์ ๊ณตํฉ๋๋ค. ์์ง ์์ค์์ ์ต๊ณ ์ฑ๋ฅ์ ์ํด ์ต์ ํ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ ํฌ๋ก์คํ๋ซํผ ํจ์จ์ฑ์ ํนํ ์ค์ํ๋ฉฐ, ์ ์ธ๊ณ์ ๋ค์ํ ๋ธ๋ผ์ฐ์ ์ ์ฅ์น์์ ์ผ๊ด๋ ์ฑ๋ฅ์ ๋ณด์ฅํฉ๋๋ค.
์์ : memory.copy ์ฌ์ฉํ๊ธฐ
memory.copy ๋ช
๋ น์ด๋ ์ธ ๊ฐ์ ํผ์ฐ์ฐ์๋ฅผ ๋ฐ์ต๋๋ค:
- ๋์ ์ฃผ์.
- ์์ค ์ฃผ์.
- ๋ณต์ฌํ ๋ฐ์ดํธ ์.
๊ฐ๋ ์ ์ธ ์์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
(module
(memory (export "memory") 1)
(func (export "copy_data") (param $dest i32) (param $src i32) (param $size i32)
local.get $dest
local.get $src
local.get $size
memory.copy
)
)
์ด ์น์ด์
๋ธ๋ฆฌ ํจ์ copy_data๋ ์ง์ ๋ ์์ ๋ฐ์ดํธ๋ฅผ ์ ํ ๋ฉ๋ชจ๋ฆฌ ๋ด์ ์์ค ์ฃผ์์์ ๋์ ์ฃผ์๋ก ๋ณต์ฌํฉ๋๋ค.
์์ : memory.fill ์ฌ์ฉํ๊ธฐ
memory.fill ๋ช
๋ น์ด๋ ์ธ ๊ฐ์ ํผ์ฐ์ฐ์๋ฅผ ๋ฐ์ต๋๋ค:
- ์์ ์ฃผ์.
- ์ฑ์ธ ๊ฐ (๋จ์ผ ๋ฐ์ดํธ).
- ์ฑ์ธ ๋ฐ์ดํธ ์.
๊ฐ๋ ์ ์ธ ์์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
(module
(memory (export "memory") 1)
(func (export "fill_data") (param $start i32) (param $value i32) (param $size i32)
local.get $start
local.get $value
local.get $size
memory.fill
)
)
์ด ํจ์ fill_data๋ ์ง์ ๋ ๋ฉ๋ชจ๋ฆฌ ๋ฒ์๋ฅผ ์ฃผ์ด์ง ๋ฐ์ดํธ ๊ฐ์ผ๋ก ์ฑ์๋๋ค.
์์ : memory.init๊ณผ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ ์ฌ์ฉํ๊ธฐ
๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์น์ด์
๋ธ๋ฆฌ ๋ชจ๋ ๋ด์ ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ์ ์ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด memory.init ๋ช
๋ น์ด๊ฐ ์ด ๋ฐ์ดํฐ๋ฅผ ์ ํ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ณต์ฌํฉ๋๋ค.
(module
(memory (export "memory") 1)
(data (i32.const 0) "Hello, WebAssembly!") ; Data segment
(func (export "init_data") (param $dest i32) (param $offset i32) (param $size i32)
(data.drop $0) ; Drop the data segment after initialization
local.get $dest
local.get $offset
local.get $size
i32.const 0 ; data segment index
memory.init
)
)
์ด ์์ ์์ init_data ํจ์๋ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ(์ธ๋ฑ์ค 0)์ ๋ฐ์ดํฐ๋ฅผ ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์ง์ ๋ ์์น๋ก ๋ณต์ฌํฉ๋๋ค.
๋ฒกํฐํ๋ฅผ ์ํ SIMD(๋จ์ผ ๋ช ๋ น์ด, ๋ค์ค ๋ฐ์ดํฐ)
SIMD๋ ๋จ์ผ ๋ช ๋ น์ด๊ฐ ์ฌ๋ฌ ๋ฐ์ดํฐ ํฌ์ธํธ๋ฅผ ๋์์ ์ฐ์ฐํ๋ ๋ณ๋ ฌ ์ปดํจํ ๊ธฐ์ ์ ๋๋ค. ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ ์ง์ฝ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๋นํ ์ฑ๋ฅ ํฅ์์ ์ด๋ฃฐ ์ ์์ต๋๋ค. ์น์ด์ ๋ธ๋ฆฌ๋ SIMD ์ ์์ ํตํด SIMD ๋ช ๋ น์ด๋ฅผ ์ง์ํ์ฌ ๊ฐ๋ฐ์๊ฐ ์ด๋ฏธ์ง ์ฒ๋ฆฌ, ์ค๋์ค ์ธ์ฝ๋ฉ, ๊ณผํ ์ปดํจํ ๊ณผ ๊ฐ์ ์์ ์ ๋ฒกํฐํ๋ฅผ ํ์ฉํ ์ ์๋๋ก ํฉ๋๋ค.
SIMD ๋ช ๋ น์ด ์นดํ ๊ณ ๋ฆฌ:
- ์ฐ์ ์ฐ์ฐ: ๋ํ๊ธฐ, ๋นผ๊ธฐ, ๊ณฑํ๊ธฐ, ๋๋๊ธฐ.
- ๋น๊ต ์ฐ์ฐ: ๊ฐ์, ๊ฐ์ง ์์, ์์, ํผ.
- ๋นํธ ์ฐ์ฐ: AND, OR, XOR.
- ์ ํ ๋ฐ ์ค์์ฆ: ๋ฒกํฐ ๋ด ์์ ์ฌ๋ฐฐ์ด.
- ๋ก๋ ๋ฐ ์คํ ์ด: ๋ฉ๋ชจ๋ฆฌ์์/๋ก ๋ฒกํฐ ๋ก๋ ๋ฐ ์ ์ฅ.
๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ๊ณผ SIMD ๊ฒฐํฉํ๊ธฐ
์ง์ ํ ํ์ ๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ SIMD ๋ช ๋ น์ด์ ๊ฒฐํฉํ ๋ ๋์ต๋๋ค. ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐ์ดํธ ๋จ์๋ก ๋ณต์ฌํ๊ฑฐ๋ ์ฑ์ฐ๋ ๋์ , ์ฌ๋ฌ ๋ฐ์ดํธ๋ฅผ SIMD ๋ฒกํฐ๋ก ๋ก๋ํ๊ณ ๋ณ๋ ฌ๋ก ์ฐ์ฐ์ ์ํํ ํ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ ์ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ํ์ํ ๋ช ๋ น์ด ์๋ฅผ ๊ทน์ ์ผ๋ก ์ค์ฌ ์๋นํ ์ฑ๋ฅ ํฅ์์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
์์ : SIMD ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๋ณต์ฌ
SIMD๋ฅผ ์ฌ์ฉํ์ฌ ํฐ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ๋ณต์ฌํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ด
์๋ค. ์น์ด์
๋ธ๋ฆฌ ์์ง์ ์ํด ๋ด๋ถ์ ์ผ๋ก ๋ฒกํฐํ๋์ง ์์ ์ ์๋ memory.copy๋ฅผ ์ฌ์ฉํ๋ ๋์ , ๋ฐ์ดํฐ๋ฅผ SIMD ๋ฒกํฐ๋ก ์๋์ผ๋ก ๋ก๋ํ๊ณ , ๋ฒกํฐ๋ฅผ ๋ณต์ฌํ ๋ค์, ๋ค์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ฒกํฐํ ํ๋ก์ธ์ค๋ฅผ ๋ ์ธ๋ฐํ๊ฒ ์ ์ดํ ์ ์์ต๋๋ค.
๊ฐ๋ ์ ๋จ๊ณ:
- ์์ค ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์์ SIMD ๋ฒกํฐ(์: 128๋นํธ = 16๋ฐ์ดํธ)๋ฅผ ๋ก๋ํฉ๋๋ค.
- SIMD ๋ฒกํฐ๋ฅผ ๋ณต์ฌํฉ๋๋ค.
- ๋์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ SIMD ๋ฒกํฐ๋ฅผ ์ ์ฅํฉ๋๋ค.
- ์ ์ฒด ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ด ๋ณต์ฌ๋ ๋๊น์ง ๋ฐ๋ณตํฉ๋๋ค.
์ด ๋ฐฉ๋ฒ์ ๋ ๋ง์ ์๋ ์ฝ๋๊ฐ ํ์ํ์ง๋ง, ํนํ ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ธํธ์ ๊ฒฝ์ฐ ์ฑ๋ฅ ์ด์ ์ด ์๋นํ ์ ์์ต๋๋ค. ์ด๋ ๋ค์ํ ๋คํธ์ํฌ ์๋๋ฅผ ๊ฐ์ง ์ฌ๋ฌ ์ง์ญ์์ ์ด๋ฏธ์ง ๋ฐ ๋น๋์ค ์ฒ๋ฆฌ๋ฅผ ๋ค๋ฃฐ ๋ ํนํ ์ค์ํด์ง๋๋ค.
์์ : SIMD ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฑ์ฐ๊ธฐ
์ ์ฌํ๊ฒ, SIMD๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฑ์ฐ๊ธฐ๋ฅผ ๊ฐ์ํํ ์ ์์ต๋๋ค. memory.fill์ ์ฌ์ฉํ๋ ๋์ , ์ํ๋ ๋ฐ์ดํธ ๊ฐ์ผ๋ก ์ฑ์์ง SIMD ๋ฒกํฐ๋ฅผ ์์ฑํ ๋ค์ ์ด ๋ฒกํฐ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ ์ ์์ต๋๋ค.
๊ฐ๋ ์ ๋จ๊ณ:
- ์ฑ์ธ ๋ฐ์ดํธ ๊ฐ์ผ๋ก ์ฑ์์ง SIMD ๋ฒกํฐ๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฒกํฐ์ ๋ชจ๋ ๋ ์ธ์ ๋ฐ์ดํธ๋ฅผ ๋ธ๋ก๋์บ์คํ ํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
- ๋์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ SIMD ๋ฒกํฐ๋ฅผ ์ ์ฅํฉ๋๋ค.
- ์ ์ฒด ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ด ์ฑ์์ง ๋๊น์ง ๋ฐ๋ณตํฉ๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์์ ๋ฒํผ๋ฅผ ์ด๊ธฐํํ๊ฑฐ๋ ํ๋ฉด์ ์ง์ฐ๋ ๊ฒ๊ณผ ๊ฐ์ด ํฐ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์์ ๊ฐ์ผ๋ก ์ฑ์ธ ๋ ํนํ ํจ๊ณผ์ ์ ๋๋ค. ์ด ๋ฐฉ๋ฒ์ ๋ค์ํ ์ธ์ด์ ํ๋ซํผ์ ๊ฑธ์ณ ๋ณดํธ์ ์ธ ์ด์ ์ ์ ๊ณตํ์ฌ ์ ์ธ๊ณ์ ์ผ๋ก ์ ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
์ฑ๋ฅ ๊ณ ๋ ค์ฌํญ ๋ฐ ์ต์ ํ ๊ธฐ๋ฒ
๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ๊ณผ SIMD๋ฅผ ๊ฒฐํฉํ๋ฉด ์๋นํ ์ฑ๋ฅ ํฅ์์ ์ป์ ์ ์์ง๋ง, ํจ์จ์ฑ์ ๊ทน๋ํํ๊ธฐ ์ํด ๋ช ๊ฐ์ง ์์๋ฅผ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
์ ๋ ฌ(Alignment):
๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ด SIMD ๋ฒกํฐ ํฌ๊ธฐ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ ฌ๋์๋์ง ํ์ธํ์ญ์์ค. ์ ๋ ฌ๋์ง ์์ ์ ๊ทผ์ ์ผ๋ถ ์ํคํ ์ฒ์์ ์ฑ๋ฅ ์ ํ ๋๋ ์ถฉ๋์ ์ ๋ฐํ ์ ์์ต๋๋ค. ์ฌ๋ฐ๋ฅธ ์ ๋ ฌ์ ์ํด์๋ ๋ฐ์ดํฐ๋ฅผ ํจ๋ฉํ๊ฑฐ๋ ์ ๋ ฌ๋์ง ์์ ๋ก๋/์คํ ์ด ๋ช ๋ น์ด(์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒฝ์ฐ)๋ฅผ ์ฌ์ฉํด์ผ ํ ์ ์์ต๋๋ค.
๋ฒกํฐ ํฌ๊ธฐ(Vector Size):
์ต์ ์ SIMD ๋ฒกํฐ ํฌ๊ธฐ๋ ๋์ ์ํคํ
์ฒ์ ๋ฐ์ดํฐ์ ํน์ฑ์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค. ์ผ๋ฐ์ ์ธ ๋ฒกํฐ ํฌ๊ธฐ์๋ 128๋นํธ(์: v128 ํ์
์ฌ์ฉ), 256๋นํธ, 512๋นํธ๊ฐ ํฌํจ๋ฉ๋๋ค. ๋ค์ํ ๋ฒกํฐ ํฌ๊ธฐ๋ก ์คํํ์ฌ ๋ณ๋ ฌ์ฑ๊ณผ ์ค๋ฒํค๋ ์ฌ์ด์ ์ต์์ ๊ท ํ์ ์ฐพ์ผ์ญ์์ค.
๋ฐ์ดํฐ ๋ ์ด์์(Data Layout):
๋ฉ๋ชจ๋ฆฌ ๋ด ๋ฐ์ดํฐ์ ๋ ์ด์์์ ๊ณ ๋ คํ์ญ์์ค. ์ต์ ์ SIMD ์ฑ๋ฅ์ ์ํด์๋ ์ฐ์์ ์ธ ๋ฒกํฐ ๋ก๋ ๋ฐ ์ ์ฅ์ด ๊ฐ๋ฅํ๋๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐฐ์ดํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํด ๋ฐ์ดํฐ๋ฅผ ์ฌ๊ตฌ์ฑํ๊ฑฐ๋ ํน์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํด์ผ ํ ์ ์์ต๋๋ค.
์ปดํ์ผ๋ฌ ์ต์ ํ(Compiler Optimizations):
๊ฐ๋ฅํ ๋๋ง๋ค ์ฝ๋๋ฅผ ์๋์ผ๋ก ๋ฒกํฐํํ๊ธฐ ์ํด ์ปดํ์ผ๋ฌ ์ต์ ํ๋ฅผ ํ์ฉํ์ญ์์ค. ์ต์ ์ปดํ์ผ๋ฌ๋ ์ข ์ข SIMD ๊ฐ์ ๊ธฐํ๋ฅผ ์๋ณํ๊ณ ์๋ ๊ฐ์ ์์ด ์ต์ ํ๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ปดํ์ผ๋ฌ ํ๋๊ทธ์ ์ค์ ์ ํ์ธํ์ฌ ๋ฒกํฐํ๊ฐ ํ์ฑํ๋์๋์ง ํ์ธํ์ญ์์ค.
๋ฒค์น๋งํน(Benchmarking):
SIMD๋ก ์ธํ ์ค์ ์ฑ๋ฅ ํฅ์์ ์ธก์ ํ๊ธฐ ์ํด ํญ์ ์ฝ๋๋ฅผ ๋ฒค์น๋งํนํ์ญ์์ค. ์ฑ๋ฅ์ ๋์ ํ๋ซํผ, ๋ธ๋ผ์ฐ์ ๋ฐ ์ํฌ๋ก๋์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค. ์ ํํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ผ๋ ค๋ฉด ์ค์ ๋ฐ์ดํฐ ์ธํธ์ ์๋๋ฆฌ์ค๋ฅผ ์ฌ์ฉํ์ญ์์ค. ์ฑ๋ฅ ํ๋กํ์ผ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ณ๋ชฉ ํ์๊ณผ ์ถ๊ฐ ์ต์ ํ๊ฐ ํ์ํ ์์ญ์ ์๋ณํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ์ด๋ ์ต์ ํ๊ฐ ์ ์ธ๊ณ์ ์ผ๋ก ํจ๊ณผ์ ์ด๊ณ ์ ์ตํ๋ค๋ ๊ฒ์ ๋ณด์ฅํฉ๋๋ค.
์ค์ ์ ์ฉ ์ฌ๋ก
๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ๊ณผ SIMD์ ์กฐํฉ์ ๋ค์์ ํฌํจํ ๊ด๋ฒ์ํ ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฉํ ์ ์์ต๋๋ค:
์ด๋ฏธ์ง ์ฒ๋ฆฌ:
ํํฐ๋ง, ํฌ๊ธฐ ์กฐ์ , ์์ ๋ณํ๊ณผ ๊ฐ์ ์ด๋ฏธ์ง ์ฒ๋ฆฌ ์์ ์ ์ข ์ข ๋๋์ ํฝ์ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํฉ๋๋ค. SIMD๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ํฝ์ ์ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ์ฌ ์๋นํ ์๋ ํฅ์์ ์ด๋ฃฐ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ด๋ฏธ์ง์ ์ค์๊ฐ์ผ๋ก ํํฐ๋ฅผ ์ ์ฉํ๊ฑฐ๋, ๋ค์ํ ํ๋ฉด ํด์๋์ ๋ง๊ฒ ์ด๋ฏธ์ง ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๊ฑฐ๋, ์ด๋ฏธ์ง๋ฅผ ๋ค๋ฅธ ์ ๊ณต๊ฐ์ผ๋ก ๋ณํํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์น์ด์ ๋ธ๋ฆฌ๋ก ๊ตฌํ๋ ์ด๋ฏธ์ง ํธ์ง๊ธฐ๋ฅผ ์๊ฐํด๋ณด์ญ์์ค. SIMD๋ ๋ธ๋ฌ๋ง์ด๋ ์คํ๋๊ณผ ๊ฐ์ ์ผ๋ฐ์ ์ธ ์์ ์ ๊ฐ์ํํ์ฌ ์ฌ์ฉ์์ ์ง๋ฆฌ์ ์์น์ ๊ด๊ณ์์ด ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
์ค๋์ค ์ธ์ฝ๋ฉ/๋์ฝ๋ฉ:
MP3, AAC, Opus์ ๊ฐ์ ์ค๋์ค ์ธ์ฝ๋ฉ ๋ฐ ๋์ฝ๋ฉ ์๊ณ ๋ฆฌ์ฆ์ ์ข ์ข ์ค๋์ค ์ํ์ ๋ํ ๋ณต์กํ ์ํ์ ์ฐ์ฐ์ ํฌํจํฉ๋๋ค. SIMD๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฌํ ์ฐ์ฐ์ ๊ฐ์ํํ์ฌ ๋ ๋น ๋ฅธ ์ธ์ฝ๋ฉ ๋ฐ ๋์ฝ๋ฉ ์๊ฐ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์คํธ๋ฆฌ๋ฐ์ ์ํด ์ค๋์ค ํ์ผ์ ์ธ์ฝ๋ฉํ๊ฑฐ๋, ์ฌ์์ ์ํด ์ค๋์ค ํ์ผ์ ๋์ฝ๋ฉํ๊ฑฐ๋, ์ค์๊ฐ์ผ๋ก ์ค๋์ค ํจ๊ณผ๋ฅผ ์ ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์น์ด์ ๋ธ๋ฆฌ ๊ธฐ๋ฐ ์ค๋์ค ํธ์ง๊ธฐ๊ฐ ์ค์๊ฐ์ผ๋ก ๋ณต์กํ ์ค๋์ค ํจ๊ณผ๋ฅผ ์ ์ฉํ ์ ์๋ค๊ณ ์์ํด๋ณด์ญ์์ค. ์ด๋ ์ปดํจํ ์์์ด ์ ํ์ ์ด๊ฑฐ๋ ์ธํฐ๋ท ์ฐ๊ฒฐ์ด ๋๋ฆฐ ์ง์ญ์์ ํนํ ์ ์ฉํฉ๋๋ค.
๊ณผํ ์ปดํจํ :
์์น ์๋ฎฌ๋ ์ด์ ๋ฐ ๋ฐ์ดํฐ ๋ถ์๊ณผ ๊ฐ์ ๊ณผํ ์ปดํจํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ข ์ข ๋๋์ ์์น ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. SIMD๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฌํ ๊ณ์ฐ์ ๊ฐ์ํํ์ฌ ๋ ๋น ๋ฅธ ์๋ฎฌ๋ ์ด์ ๊ณผ ๋ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ๋ถ์์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ ์ฒด ์ญํ ์๋ฎฌ๋ ์ด์ , ๊ฒ๋ ๋ฐ์ดํฐ ๋ถ์, ๋ณต์กํ ์ํ ๋ฐฉ์ ์ ํด๊ฒฐ ๋ฑ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์น์ด์ ๋ธ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์น์์ ๊ณผํ ์๋ฎฌ๋ ์ด์ ์ ๊ฐ์ํํ๋ฉด ์ ์ธ๊ณ ์ฐ๊ตฌ์๋ค์ด ๋ ํจ๊ณผ์ ์ผ๋ก ํ๋ ฅํ ์ ์์ต๋๋ค.
๊ฒ์ ๊ฐ๋ฐ:
๊ฒ์ ๊ฐ๋ฐ์์ SIMD๋ ๋ฌผ๋ฆฌ ์๋ฎฌ๋ ์ด์ , ๋ ๋๋ง, ์ ๋๋ฉ์ด์ ๊ณผ ๊ฐ์ ๋ค์ํ ์์ ์ ์ต์ ํํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ๋ฒกํฐํ๋ ๊ณ์ฐ์ ์ด๋ฌํ ์์ ์ ์ฑ๋ฅ์ ๊ทน์ ์ผ๋ก ํฅ์์์ผ ๋ ๋ถ๋๋ฌ์ด ๊ฒ์ ํ๋ ์ด์ ๋ ์ฌ์ค์ ์ธ ๋น์ฃผ์ผ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ์ฑ๋ฅ์ด ์ข ์ข ๋ธ๋ผ์ฐ์ ์ ์ฝ์ ์ํด ์ ํ๋๋ ์น ๊ธฐ๋ฐ ๊ฒ์์ ํนํ ์ค์ํฉ๋๋ค. ์น์ด์ ๋ธ๋ฆฌ ๊ฒ์์ SIMD ์ต์ ํ ๋ฌผ๋ฆฌ ์์ง์ ํ๋ ์ ์๋๋ฅผ ํฅ์์ํค๊ณ ๋ค์ํ ์ฅ์น ๋ฐ ๋คํธ์ํฌ์์ ๋ ๋์ ๊ฒ์ ๊ฒฝํ์ ์ ๊ณตํ์ฌ ๋ ๋์ ๊ณ ๊ฐ์ธต์ด ๊ฒ์์ ๋ ์ฝ๊ฒ ์ ๊ทผํ ์ ์๋๋ก ํฉ๋๋ค.
๋ธ๋ผ์ฐ์ ์ง์ ๋ฐ ๋๊ตฌ
ํฌ๋กฌ, ํ์ด์ดํญ์ค, ์ฌํ๋ฆฌ๋ฅผ ํฌํจํ ์ต์ ์น ๋ธ๋ผ์ฐ์ ๋ ์น์ด์ ๋ธ๋ฆฌ์ ๊ทธ SIMD ํ์ฅ์ ๋ํ ๊ฐ๋ ฅํ ์ง์์ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ ํธํ์ฑ์ ๋ณด์ฅํ๋ ค๋ฉด ํน์ ๋ธ๋ผ์ฐ์ ๋ฒ์ ๊ณผ ์ง์๋๋ ๊ธฐ๋ฅ์ ํ์ธํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋ํ ์น์ด์ ๋ธ๋ฆฌ ๊ฐ๋ฐ ๋ฐ ์ต์ ํ๋ฅผ ๋๋ ๋ค์ํ ๋๊ตฌ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ปดํ์ผ๋ฌ ์ง์:
Clang/LLVM ๋ฐ Emscripten๊ณผ ๊ฐ์ ์ปดํ์ผ๋ฌ๋ SIMD ๋ช ๋ น์ด๋ฅผ ํ์ฉํ๋ ์ฝ๋๋ฅผ ํฌํจํ์ฌ C/C++ ์ฝ๋๋ฅผ ์น์ด์ ๋ธ๋ฆฌ๋ก ์ปดํ์ผํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ปดํ์ผ๋ฌ๋ ๋ฒกํฐํ๋ฅผ ํ์ฑํํ๊ณ ํน์ ๋์ ์ํคํ ์ฒ์ ๋ง๊ฒ ์ฝ๋๋ฅผ ์ต์ ํํ๋ ์ต์ ์ ์ ๊ณตํฉ๋๋ค.
๋๋ฒ๊น ๋๊ตฌ:
๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ ์น์ด์ ๋ธ๋ฆฌ ์ฝ๋์ ๋ํ ๋๋ฒ๊น ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ ๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ฅผ ๋จ๊ณ๋ณ๋ก ์คํํ๊ณ , ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฒ์ฌํ๊ณ , ์ฑ๋ฅ์ ํ๋กํ์ผ๋งํ ์ ์๋๋ก ํฉ๋๋ค. ์ด๋ฌํ ๋๊ตฌ๋ SIMD ๋ฐ ๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ๊ณผ ๊ด๋ จ๋ ๋ฌธ์ ๋ฅผ ์๋ณํ๊ณ ํด๊ฒฐํ๋ ๋ฐ ๋งค์ฐ ์ ์ฉํ ์ ์์ต๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ํ๋ ์์ํฌ:
์ฌ๋ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ๋ ์์ํฌ๋ ์น์ด์ ๋ธ๋ฆฌ ๋ฐ SIMD ์์ ์ ์ํ ๊ณ ์์ค ์ถ์ํ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ๋๊ตฌ๋ ๊ฐ๋ฐ ํ๋ก์ธ์ค๋ฅผ ๋จ์ํํ๊ณ ์ผ๋ฐ์ ์ธ ์์ ์ ๋ํ ์ต์ ํ๋ ๊ตฌํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
์น์ด์ ๋ธ๋ฆฌ์ ๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ SIMD ๋ฒกํฐํ์ ๊ฒฐํฉ๋ ๋ ๊ด๋ฒ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๋นํ ์ฑ๋ฅ ํฅ์์ ๋ฌ์ฑํ๋ ๊ฐ๋ ฅํ ์๋จ์ ์ ๊ณตํฉ๋๋ค. ๊ธฐ๋ณธ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ ์ดํดํ๊ณ , ๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ๋ช ๋ น์ด๋ฅผ ํ์ฉํ๋ฉฐ, ๋ณ๋ ฌ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ํด SIMD๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ๋ค์ํ ํ๋ซํผ๊ณผ ๋ธ๋ผ์ฐ์ ์์ ๋ค์ดํฐ๋ธ์ ๊ฐ๊น์ด ์ฑ๋ฅ์ ์ ๊ณตํ๋ ๊ณ ๋๋ก ์ต์ ํ๋ ์น์ด์ ๋ธ๋ฆฌ ๋ชจ๋์ ๋ง๋ค ์ ์์ต๋๋ค. ์ด๋ ๋ค์ํ ์ปดํจํ ๋ฅ๋ ฅ๊ณผ ๋คํธ์ํฌ ์กฐ๊ฑด์ ๊ฐ์ง ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ํ๋ถํ๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๊ณตํ๋ ๋ฐ ํนํ ์ค์ํฉ๋๋ค. ํจ์จ์ฑ์ ๊ทน๋ํํ๊ณ ์ต์ ํ๊ฐ ํจ๊ณผ์ ์ธ์ง ํ์ธํ๊ธฐ ์ํด ํญ์ ์ ๋ ฌ, ๋ฒกํฐ ํฌ๊ธฐ, ๋ฐ์ดํฐ ๋ ์ด์์ ๋ฐ ์ปดํ์ผ๋ฌ ์ต์ ํ๋ฅผ ๊ณ ๋ คํ๊ณ ์ฝ๋๋ฅผ ๋ฒค์น๋งํนํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค. ์ด๋ฅผ ํตํด ์ ์ธ๊ณ์ ์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅํ๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค.
์น์ด์ ๋ธ๋ฆฌ๊ฐ ๊ณ์ ๋ฐ์ ํจ์ ๋ฐ๋ผ SIMD ๋ฐ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์์ ๋ ๋ง์ ๋ฐ์ ์ด ์์๋๋ฉฐ, ์น๊ณผ ๊ทธ ์ด์์ ํ๊ฒฝ์์ ๊ณ ์ฑ๋ฅ ์ปดํจํ ์ ์ํ ์ ์ ๋ ๋งค๋ ฅ์ ์ธ ํ๋ซํผ์ด ๋ ๊ฒ์ ๋๋ค. ์ฃผ์ ๋ธ๋ผ์ฐ์ ๊ณต๊ธ์ ์ฒด์ ์ง์์ ์ธ ์ง์๊ณผ ๊ฐ๋ ฅํ ๋๊ตฌ ๊ฐ๋ฐ์ ์ ์ธ๊ณ์ ์ผ๋ก ๋น ๋ฅด๊ณ ํจ์จ์ ์ด๋ฉฐ ํฌ๋ก์คํ๋ซํผ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๊ณตํ๋ ํต์ฌ ๊ธฐ์ ๋ก์ ์น์ด์ ๋ธ๋ฆฌ์ ์์น๋ฅผ ๋์ฑ ๊ณต๊ณ ํ ํ ๊ฒ์ ๋๋ค.