SSE

SIMD Introduction

커피살인마 2022. 11. 26. 17:48

SIMD : Single Instruction Multiple Data 한번의 연산으로 여러 개의 데이터를 처리

 

Parallel program model

  • SIMD (명령어 수준 병렬 프로그래밍 모델)
  • Shared Memory Parallel Programming model - 멀티 스레드로 데이터 처리 (Multithreading, pthreads, OpenMP, CUDA...) 
  • Message passing Parallel Programming model - 여러개의 PC를 메시지로 통신하여 대용량의 데이터를 처리하는 것. 분산 컴퓨팅, 그리드 컴퓨팅과 같은 의미. (MPI, HPF, PVM...)
  • Hybrid Model - 위 세가지 혼합하여 사용

SIMD 프로그램 구조 

  1. 메모리 변수 Packing - 메모리에 있는 값을 128-bit 데이터형에 입력. 데이터형은 XMM 레지스터, __ㅡ128, Vector 클래스가 될 수 있다.  
  2. 128-bit 데이터 병렬 연산 반복 수행 - 루프를 돌면서 반복을 병렬 연산 수행. SIMD 명령어, intrinsic 함수, Vector 연산자로 이루어짐. 
  3. 메모리 변수에 출력 - 병렬 수행한 결과를 128-bit데이터형에서 메모리 변수로 꺼내옴. 

구현 도구의 종류

어셈블리 언어 - SIMD 명령어 

C 함수 - Intrinsic 함수 

C++ - Vector class

 

Intel에서 지원하는 Vector Class 는 intrinsic 함수를 wrapping하여 만든 클래스. 

 

Pack & Package 

병렬 연산은 128-bit 데이터형 변수에 작은 사이즈의 데이터를 여러 개 담아서 처리. 이러한 구조를 'Packed'라고 하며 128-bit의 package 안에 32-bit pack 4개를 담을 수 있음. 128-bit package 안에 많은 수의 pack을 담을수록 프로그램 효율 증가. 

 

스칼라 계산과 Pack 계산 

SIMD 프로그래밍은 Packed 연산, 스칼라 연산 방식 지원. 스칼라 연산 방식은 최하위 위치에 있는 pack 하나만을 연산하고 나머지 pack은 앞선 인자의 값을 그대로 전달하는 방식. 주로 사용하는 것은 packed 연산이고 package 연산이 모두 끝난 후 1개의 값을 추출하거나 대입할 때 스칼라 연산을 사용. 

 

SSE & AVX (Intel)

SSE에서 SSE4로 발전하면서 8-byte 동시 연산 구조에서 16-byte 연산으로 발전. MMX에서 SSE로 진행하며 정수 연산만 가능했던 것이 부동소수점까지 연산 가능해졌음. AVX는 32-byte 동시 연산에 레지스터 개수가 16개. 

 

NEON (ARM)

Q레지스터 (Quad word 128-bit) 16개, D레지스터(Double word 64-bit) 32개를 포함하여 총 256-byte의 레지스터를 사용하여 연산.