Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

KH_C++

SIMD (Single Instruction Multiple Data) 본문

공부

SIMD (Single Instruction Multiple Data)

kanghou 2023. 6. 20. 12:47

[ SIMD ]

 

  • SIMD  (Single Instruction, Multiple Data) 의 약자로 하나의 명령어로 다량의 데이터를 처리하는 것을 말하며 벡터 연산이라고도 한다. 여기서 말하는 여러데이터는 64비트(MMX) 128비트(SSE) 256비트 (AVX)의 크기를 가진 자료를 말한다. 이러한 데이터들은 메모리상에서 정렬되어 있어야 하며 SIMD 명령어를 이용해 이러한 데이터를 한번에 처리할 수 있다.

SSE 데이터 타입

AVX 데이터 타입
AVX일 때는 256비트이기 때문에 SSE에서 처리할 수 있는 능력을 2배로 제공한다


SIMD 진화 - SIMD 명령어는 1997년 64비트 데이터를 처리하는 MMX(Multi Media eXtensions)로부터 시작해, 1999년 펜티엄3 카트마이에서 128비트로 데이터 처리 크기를 확장하면서 이를 SSE(Streaming SIMD Extensions)로 명명해 4.2 버전까지 발전했다. 그리고 2011년 샌디 브릿지에서 256비트로 데이터 처리 크기를 SSE의 2배로 확장하면서 AVX로 다시 명명됐다.
64비트부터 시작해 현재 256비트까지 한 명령어에서 동시에 처리할 수 있는 데이터 크기는 지속적으로 커져가고 있다. SSE일 때 처리하는 데이터 타입을 살펴보면 위의 SSE 데이터 타입 그림과 같이 double 또는 64비트 int 타입일 경우에는 2개, float 또는 32비트 int 타입일 경우는 4개가 동시에 처리된다. 타입 크기에 따라 작게는 2개, 크게는 16개 데이터가 한 번에 처리된다.

CPU의 아키텍처 모델에 따라 SIMD 기능을 지원한다.

  • Intel & AMD 
    MMX, SSE, SSE2, AVX, AVX2, AVX512F
  • ARM
    NEON

명령어 수준 병렬화

<그림 1> SISD 병렬 하드웨어 아크텍처

<그림 1>과 같이 배열 a와 b의 합을 구하는 for 구문을 실행한다면 한 번에 하나의 연산이 총 n번 반복돼 모든 연산을 수행한다.
그러나 <그림 2>처럼 단일 명령어 4개의 데이터에 대해 연산을 동시에 수행한다면 n/4의 반복만으로 모든 연산이 수행된다.

 

<그림 2> SIMD 병렬 하드웨어 아크텍처

이처럼 단일 명령어로 복수개의 데이터를 처리하는 명령어(SIMD, Single Instruction Multiple Data) 수준 병렬화를 벡터화(vectorization)라 한다.


SIMD 를 이해하기 위해서는 기존에 알고있는 SISD( Single Instruction Single Data ) 와의 차이점을 알아야한다.

4개의 32Bit 정수 A0, A1, A2, A3 가 있고, B0, B1, B2, B3가 있다고 했을 때

SISD 연산은 A0 + B0, A1 + B2, ... 각 각 덧셈을 하기 위해서 총 4번의 연산이 필요하다

SIMD 연산은 A0, A1, A2, A3와 B0, B1, B2, B3 를 각 각 묶어 1번의 연산만으로 연산한다.

SIMD는 행렬 / 벡터 같은 연산에 주로 사용된다.


SIMD Extension에 대한 레지스터 크기

 

출처:

https://openmynotepad.tistory.com/97

https://m.blog.naver.com/fs0608/221650925743

https://dataonair.or.kr/db-tech-reference/d-lounge/technical-data/?mod=document&uid=236120 


Comments