SIMD란 ?
하나의 명령어로 여러개의 데이터를 한번에 처리하는 병렬 방식의 기법을 의미 합니다.
즉 CPU에서 지원되는 명령어 셋으로 하나의 명령어로 동일한 형태나 구조의 여러 데이터를 한번에 처리 할 수 있는 기법입니다.
일반적인 프로그램은 SISD(Single Instruction Single Date)의 방식으로 구현되어있습니다.
대표적으로 DirecX, OpenGl 은 SIMD를 지원하고 있습니다.
SIMD는 SISD보다 동영상, 그래픽 렌더링 등의 작업이 성능이 뛰어납니다.
SISD & SIMD
4개의 32비트 정수 A0 ~ A3 그리고 B0 ~ B3 를 각각 덧셈을 하기 위해서는 총 4번의 연산과정이 필요합니다.
하지만 SIMD 연산에서는 4개의 다른 연산이아닌 한번의 연산으로 가능 합니다.
위의 과정을 C언어 코드로 살펴볼 경우는 다음과 같습니다.
아래의 예제를 참고하도록 합니다.
SISD 연산의 경우 총 16번의 instruction 을 사용하지만
SIMD 연산의 경우 총 6번만의 instruction 을 사용한 모습을 볼 수 있습니다.
SISD 연산
SIMD 연산
위처럼 4개의 32비트간의 덧셈 연산을 수행하는 add함수를 구현하고자 할 때 기존 SISD 보다 SIMD의 방식이 더욱 효율적인것을 쉽게 확인 할 수 있습니다.
때문에 SIMD 기술은 벡터 & 행렬 연산이 필요한 구조에 적합한것(효율적인것)으로 볼 수 있습니다.
벡터는 (x,y,z) 의 형태로 표현이 되는데 이때 계산이 x에 한번 y에 한번 z에 한번 총3번 연산이 이루어지는 것이아닌 한번만의 연산으로 결과를 낼 수 있기 때문에 유용 합니다.
행렬또한 마찬가지로 유용하다고 볼 수 있습니다.
실제 코드로 구현해 본 결과물등은 다른 블로그를 참조 하도록 합니다.
'공부' 카테고리의 다른 글
[CS] 컴퓨트 쉐이더(Compute Shader) (0) | 2023.07.11 |
---|---|
[CS] GPGPU (0) | 2023.07.11 |
[C++] 람다 표현식 (Lambda Expression) (0) | 2023.05.27 |
[자료구조] 함수포인터 (0) | 2023.05.24 |
[C++/DX11] 3D 가위바위보 (1) | 2023.05.21 |
댓글