Notice
Recent Posts
Recent Comments
Link
«   2024/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
Archives
Today
Total
관리 메뉴

kaki1013

[SIMD] SIMD(Single Instruction Multiple Data)란? 본문

코딩/병렬 컴퓨팅

[SIMD] SIMD(Single Instruction Multiple Data)란?

kaki1013 2023. 8. 25. 00:00
SIMD(Single Instruction Multiple Data)는 병렬 컴퓨팅의 한 종류로,
하나의 명령어로 여러 개의 값을 동시에 계산하는 방식이다.
벡터 프로세서에서 많이 사용되는 방식으로,
비디오 게임 콘솔이나 그래픽 카드와 같은멀티미디어 분야에 자주 사용된다.
CPU에서는 인텔의 MMX, 스트리밍 SIMD 확장(SSE)과 AMD의 3D나우! 등의 기술에서 이를 적용했다.
출처 : 위키백과

 

1. SIMD란?

:CPU에서 지원되는 명령어 셋을 통해, 하나의 명령어로 동일한 형태/구조의 여러 데이터를 한번에 처리하는 병렬처리기법

(출처: Fasoo 공식블로그)

 

4개의 32비트 정수 배열이 2개 있고, 이들을 대응하는 순서에 맞춰 각각 더하는 예시를 생각해보자.

좌측 그림과 같이 SISD 연산에서는 4번의 더하기 연산이 필요한 반면,

우측 그림의 SIMD 연산에서는 1번의 더하기 연산을 통해 문제를 해결하고 있다.

 

SISD 연산과 SIMD 연산의 차이 (Fasoo 공식블로그의 이미지 참고)

 

// SISD
void add(int *A, int *B, int *C) {
	C[0] = A[0] + B[0];
	C[1] = A[1] + B[1];
	C[2] = A[2] + B[2];
	C[3] = A[3] + B[3];
}

// SIMD
void add128(int *A, int *B, int *C) {
	__m128i a = _mm_load_si128((__m128i*)A);
	__m128i b = _mm_load_si128((__m128i*)B);
	__m128i c = _mm_add_epi32(a, b);
    _mm_store_si128((__m128i*)C, c);
}

 

2. Intrinsics Function이란?

: SIMD 명령어(어셈블리 명령어)를 함수로 처리한 내장 함수

(출처 : https://stonzeteam.github.io/SIMD-%EB%B3%91%EB%A0%AC-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/)

 

3. 컴파일 옵션

avx2 를 기준으로, -mavx2 옵션을 주어 컴파일 해야 한다.

자세한 내용은 아래 GCC online documentation - GNU Project (참고자료 4, 5번) 에서 확인 가능하다.

gcc -mavx2 -o test test.c

 

 

 

4. 활용 예시

프랙탈 비디오 만들기 : https://www.youtube.com/watch?v=PBvLs88hvJ8

설명 & Complex dot product : https://www.youtube.com/watch?v=AT5nuQQO96o

 

 

cf. 인텔은 리틀 엔디안 방식을 사용

 

참고자료:

1. 위키백과 https://ko.wikipedia.org/wiki/SIMD

2. Fasoo 공식블로그, https://blog.naver.com/fs0608/221650925743

3. Intel® Intrinsics Guide, https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#

4. GCC online documentation - GNU Project, https://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html

5. GCC online documentation - GNU Project, https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html

6. AVX 명령어 설명 블로그, https://velog.io/@alirz-pixel/C-AVX-Advanced-Vector-Extensions

7. AVX 명령어 설명 블로그, https://yunmorning.tistory.com/31

 

병렬컴퓨팅 - 플린의 분류학 : SISD, SIMD, MISD, MIMD

1.https://ko.wikipedia.org/wiki/%EB%B3%91%EB%A0%AC_%EC%BB%B4%ED%93%A8%ED%8C%85#%ED%94%8C%EB%A6%B0%EC%9D%98_%EB%B6%84%EB%A5%98%ED%95%99

2. https://ypangtrouble.tistory.com/entry/SISD-SIMD-MISD-MIMD

3. https://daanist.tistory.com/25