์ด ๋ฌธ์„œ์˜ ์›๋ณธ์€ ์™ธ๋ถ€ ์œ„ํ‚ค์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.
SIMD์—์„œ ๋„˜์–ด์˜ด
ํ”Œ๋ฆฐ ๋ถ„๋ฅ˜
Flynn's Taxonomy
๋‹จ์ผ ๋ช…๋ น์–ด ์ŠคํŠธ๋ฆผ
Single instruction stream
๋‹ค์ค‘ ๋ช…๋ น์–ด ์ŠคํŠธ๋ฆผ
Multiple instruction streams
๋‹จ์ผ ํ”„๋กœ๊ทธ๋žจ
Single program
๋‹ค์ค‘ ํ”„๋กœ๊ทธ๋žจ
Multiple programs
๋‹จ์ผ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ
Single data stream
๋‹ค์ค‘ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ
Multiple data streams

1. ๊ฐœ์š”2. ๋ถ„๋ฅ˜
2.1. SISD2.2. SIMD
2.2.1. SIMD ๋ ˆ์ง€์Šคํ„ฐ2.2.2. SIMD ๋ช…๋ น์–ด2.2.3. SIMD Intrinsics2.2.4. GPU์—์„œ์˜ SIMD2.2.5. Web์—์„œ์˜ SIMD2.2.6. SIMD์˜ ํ•œ๊ณ„2.2.7. .Net Framework ์ง€์›
2.3. MISD2.4. MIMD
2.4.1. SPMD2.4.2. MPMD
3. ๊ด€๋ จ ๋ถ„๋ฅ˜

1. ๊ฐœ์š”[ํŽธ์ง‘]

์Šคํƒ ํผ๋“œ ๋Œ€ํ•™์˜ ๊ต์ˆ˜์ธ ๋งˆ์ดํด J. ํ”Œ๋ฆฐ์ด 1966๋…„์— ์ œ์•ˆํ•œ ์ปดํ“จํ„ฐ ๊ตฌ์กฐ ๋ถ„๋ฅ˜์ด๋‹ค.
๋ช…๋ น์–ด(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๋ผ๋Š” ๊ธฐ๋ณธ์ ์ธ ๊ฐœ๋…์€ ๋™์ผํ•˜์ง€๋งŒ ์„ธ์„ธํ•œ ๋ถ€๋ถ„์œผ๋กœ ๋“ค์–ด๊ฐ€๋ฉด ํ”Œ๋žซํผ์— ํฌ๊ฒŒ ์˜์กด์ ์ด๋ผ ๊ฐ„์ฃผํ•ด๋„ ์ข‹์„๋งŒํผ ํฐ ์ฐจ์ด๋ฅผ ๋ณด์ธ๋‹ค.

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 ๋ ˆ์ง€์Šคํ„ฐ์— ๊ฒฐ๊ณผ๊ฐ’์ด ์ €์žฅ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด


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์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
#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์— ํฌ๊ฒŒ ์˜์กดํ•˜๊ฒŒ ๋˜๋ฉด ์ „๋ ฅ ์†Œ๋ชจ๋กœ ์ธํ•œ ์—ด ๋ฐœ์ƒ์œผ๋กœ ์ธํ•ด, ๊ธฐ๊ธฐ์— ์“ฐ๋กœํ‹€๋ง์ด ๊ฑธ๋ ค ๊ฐ•์ œ๋กœ ์„ฑ๋Šฅ์„ ์ œ์•ฝํ•˜๋Š” ๋ชจ๋“œ๋กœ ์ง„์ž…ํ•˜๊ฑฐ๋‚˜ ๊ฐ•์ œ ์žฌ๋ถ€ํŒ…ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

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์™€ ํฌ๊ฒŒ ๊ตฌ๋ณ„ํ•˜์ง€ ์•Š๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๋‹ค.

2.4. MIMD[ํŽธ์ง‘]

Multiple instruction streams, multiple data streams.
ํ•œ ๋ฒˆ์— ๋ฐ์ดํ„ฐ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ์—ฌ๋Ÿฌ ๋ช…๋ น์–ด๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ๋ฒ•. SIMD์™€์˜ ์ฐจ์ด์ ์€ SIMD๋Š” ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ™์€ ์ธ์ŠคํŠธ๋Ÿญ์…˜์œผ๋กœ ํ•œ๊บผ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๊ณ  MIMD๋Š” ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฅธ ์ธ์ŠคํŠธ๋Ÿญ์…˜์œผ๋กœ ํ•œ๊บผ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.[4] ํ˜„๋Œ€์˜ ๋™์‹œ์  ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋žจ๋“ค์€ ๋ชจ๋‘ MIMD๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. SPMD์™€ MPMD๋Š” ์ด MIMD์—์„œ ๋”์šฑ ์„ธ๋ถ„ํ™”๋œ ๋ถ„๋ฅ˜์ด๋‹ค.
์ธํ…” ์ œ์˜จ ํŒŒ์ด, ์Šˆํผ์Šค์นผ๋ผ๋ฅผ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ๋ฉ€ํ‹ฐ์ฝ”์–ด ํ”„๋กœ์„ธ์„œ, ๊ทธ๋ฆฌ๊ณ  ํ˜„์žฌ ๊ฑฐ์˜ ๋ชจ๋“  ์Šˆํผ์ปดํ“จํ„ฐ๋“ค์€ ์ด MIMD๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค.

2.4.1. SPMD[ํŽธ์ง‘]

Single programs, multiple data streams.
๋‹จ์ผ ํ”„๋กœ์„ธ์„œ๊ฐ€ ์ตœ์†Œ 2๊ฐœ ์ด์ƒ์˜ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•œ๋‹ค.

2.4.2. MPMD[ํŽธ์ง‘]

Multiple programs, multiple data streams.
๋‹ค์ˆ˜์˜ ํ”„๋กœ์„ธ์„œ๊ฐ€ ์ตœ์†Œ 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์˜ ํŠน์ˆ˜ํ•œ ํ•œ๊ฐ€์ง€ ํ˜•ํƒœ๋กœ ๊ฐ„์ฃผํ•  ์ˆ˜ ์žˆ๋‹ค.