SIMD(Single Instruction, Multiple Data)는 하나의 명령어로 여러 데이터를 병렬 처리하는 Flynn 분류의 병렬 처리 방식이다. 멀티미디어, 과학 계산, 머신러닝 가속에 핵심적으로 활용된다.
핵심 개념
일반 스칼라: ADD R1, R2 (1개 연산)
SIMD 벡터: VADDPS YMM0, YMM1, YMM2 (8개 float 동시 덧셈)
AVX2 (256-bit 레지스터):
[f0|f1|f2|f3|f4|f5|f6|f7] + [g0|g1|...|g7]
→ [f0+g0|f1+g1|...|f7+g7] (한 명령어)
x86 SIMD 명령어 집합 진화
| 명령어 집합 | 레지스터 폭 | 정수 | 부동소수 |
|---|
| MMX | 64-bit | O | X |
| SSE | 128-bit | O | O (float) |
| SSE2 | 128-bit | O | O (double) |
| AVX | 256-bit | O | O |
| AVX-512 | 512-bit | O | O |
python
import numpy as np
import time
n = 10_000_000
a = np.random.rand(n).astype(np.float32)
b = np.random.rand(n).astype(np.float32)
# SIMD 자동 적용 (NumPy 내부)
t0 = time.time()
c = a + b # 내부적으로 AVX2 사용
print(f"SIMD: {time.time()-t0:.4f}s")
# 순수 Python (SIMD 없음)
t0 = time.time()
c = [a[i] + b[i] for i in range(n)]
print(f"Python loop: {time.time()-t0:.4f}s")
# SIMD가 10~20배 빠름
관련 개념