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