AVX 명령어 세트 및 개발 방법

💡 Quotation

고급 벡터 확장(Advanced Vector Extensions,약어:AVX)은 2008년 4월 춘계 인텔 개발자 포럼에서 발표된 x86 명령어 집합의 확장으로 SIMD명령어 집합중의 하나이다. Wikipedia

💡 TIps

단일 데이터복수 데이터
단일 명령어SISDSIMD
복수 명령어MISDMIMD

해당 글에서 설명할 AVX 명령어 셋은 SIMD에 속합니다!

CPU-Z 에서 본인이 사용하는 프로세서가 사용할 수 있는 명령어 집합을 볼 수 있는데, 그 중 AVX는 큰 데이터 덩어리를 처리할 수 있는 기술로 적은 연산으로 빠르게 처리가 가능하게 합니다.

parallel_multiply_example.png

위 예제처럼 10개 원소를 가진 두 개의 배열이 있고, 두 배열의 각 원소의 합을 세 번째 배열에 넣는다고 가정한다면 왼쪽에 있는 것 처럼 총 10번의 연산이 필요할텐데, AVX 의 덩어리(Chunk)째로 처리한다면 오른쪽 있는 것 처럼 한 번의 연산만 하면 됩니다! 😄

실제로 사용해볼텐데 C/C++ 에서 emmintrin.h를 포함하여 사용할 수 있습니다.

💡 Tips

명령어 셋은 AVX 뿐 아니라 여러 명령어 셋이 있으며, 그에 해당하는 명령어 셋을 사용하려면 아래 헤더 파일을 추가해야 합니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<mmintrin.h>  MMX
<xmmintrin.h> SSE
<emmintrin.h> SSE2
<pmmintrin.h> SSE3
<tmmintrin.h> SSSE3
<smmintrin.h> SSE4.1
<nmmintrin.h> SSE4.2
<ammintrin.h> SSE4A
<wmmintrin.h> AES
<immintrin.h> AVX, AVX2, FMA

실습

두 배열의 각 원소의 합을 AVX 를 이용하여 구해보도록 하겠습니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <emmintrin.h>

int main() {
    int a[4] = {1, 2, 3, 4};
    int b[4] = {5, 6, 7, 8};
    int c[4] = {0, };

    __m128i _a = _mm_loadu_si128((__m128i*)a);
    __m128i _b = _mm_loadu_si128((__m128i*)b);
    
    __m128i _c = _mm_add_epi16(_a, _b);
    _mm_storeu_si128((__m128i*)c, _c);

    for(unsigned int i=0; i<4; i++)
    {
        std::cout << c[i] << std::endl;
    } 
    
    return 0;
}

간단하게 ab 두 배열 각 원소의 합하여 c 배열에 출력하는 간단한 샘플 코드입니다. 우선 보편적으로 사용했던 Datatype으로 명령어 셋을 사용할 수 없었습니다. 😭

하지만 데이터 타입 및 함수는 Naming convension 을 갖고 있으며, 자세한 내용은 여기에서 확인하실 수 있습니다!

💡 Datatype

__m$BIT_WIDTH$$PREFIX$ 의 형태이며, 비트 수와 데이터 타입의 Prefix로 구성되어 있습니다. Bit width는 128, 256 등이 올 수 있으며 Prefix는 없으면 float형, d가 온다면 double, i가 온다면 integer형을 의미합니다.

예를들어 __m128i 라면 4 byte(32bit) 4개의 덩어리 데이터가 된다.

💡 Function

_mm$BIT_WIDTH$_$OPERATOR$_$PARAM_DATA_TYPE$ 의 형태이며, 128 bit인 경우는 따로 Bit width를 써주지 않는다. Operatoradd, sub, mul, div, mask 등 연산 이름이 오며, 마지막 Parameter data type은 함수의 인자 형태를 의미합니다.

참조

  1. AVX (Advanced Vector Extensions)의 개념과 사용법
  2. Intel® Intrinsics Guide