• SSE (Streaming SIMD eXtensions)

    2014. 7. 23.

    by. xxx123

     

     

    SSE (Streaming SIMD eXtensions)에 대해 설명하기 전에 꼭 알아야할 몇개의 용어가 있으며 이에 대해 먼저 설명한다.

     

     

    - SIMD (Single Instruction Multiple Data) 명령어

     말 그대로 "단일 명령어로 복수의 데이터를 처리" 한다는 뜻이다.

    즉 한 명령어가 뚜렷한 어떤 목적성을 가지고 있다는 뜻이며, 오직 그 목적을 위해서 사용된다. (범용성과 반대될 수 있겠다.)

    CPU가 하나의 명령을 처리할 때, Fetch -> Decode -> Execution 의 처리 순서를 거치는데, 같은 타입인 4개의 데이터를 같은 연산으로 처리하기 위해선 4번의 F -> D -> E 가 수행되어야 할것이다.

    이것을 특수한 명령어를 사용해 1번의 F -> D -> E로 처리 가능하도록 만든것이 SIMD 명령어 인것이다.

     

     

     

     

     

    - FPU (Float Processing Unit)

    흔히 말하는 "부동소수점 연산기"이다.

    CPU 구성 중에는 ALU(산술연산기) 외에도 FPU가 있다.

    컴퓨터는 소수나 음수를 표현하기 위해 자연수를 여러가지 형태로 변형하거나 특정 단위에 대응시켜 표시한다.

    특히 소수를 표현하기 위해서는 정수보다 수천 번 이상의 계산을 수행해야 하는데 이를 ALU로 수행 할 경우 전체적인 처리 속도를 떨어뜨리게 된다.

    그리하여 부동소수점 연산으로 인한 속도저하를 막기 위해 소수계산만을 전담하는 장치를 따로 만들었고 이를 FPU라 한다.

     

    왠 뜬금 없이 FPU가 나오는가 하면 밑에서 설명할 MMX 때문이다.

     

     

     

     

     

    - MMX (MultiMedia eXtensions)

    멀티미디어 응용프로그램들의 실행을 좀 더 빠르게 할 수 있도록 설계된 인텔 펜티엄 프로세서이다.

    MMX 기술은 MMX가 아닌 이전의 마이크로 프로세서에 비해 달라진 점은

    57개의 새로운 명령어(Instruction)이 추가 됐고 SIMD프로세서가 추가된 명령어로 여러 개의 데이터 항목들에 대해 한꺼번에 수행 할 수 있도록 해준다.

     

     

    MMX는 64bit크기의 레지스터(MM0~MM7)를 사용하여 처리를 하는데 실제로 레지스터가 추가된 것이 아니라 위에서 설명한 FPU의 레지스터를 빌려 사용한다. (FPU 레지스터는 80bit이며 이중 16bit를 떼어낸 나머지 64bit를 사용했다.) 그러므로 부동소수점 연산과 MMX 연산은 동시에 이루어 질 수 없다는 단점이 있다.

    레지스터 사이즈가 64bit이므로 1Byte 자료형 데이터 4개를 한꺼번에 처리 해주는 식으로 동작한다. (자세한 내용은 다음 블로깅에서) 

     

    실질적으로 MMX는 불필요해져 인텔은 응용 프로그램 개발에서 최적화 시 MMX사용을 자제할 것을 권한다. MMX 이후로  SSE가 탑재 되었고 당연 처리 능력이 떨어지는 MMX 명령어는 주로 과거 자산과의 호환성을 목적으로 구현 제공되고 있다.

     

    용어 설명만으로도 제법 길었던것 같다. 이제부터 SSE에 설명을 해보겠다.

     

    - SSE (Streaming SIMD Extensions)

     

    인텔 펜티엄3 부터 탑재된 기술로 xmm이라는 128bit 짜리 SIMD 전용 레지스터가 추가되었다.

    전용 레지스터를 사용하므로 FPU와는 별개로 동작하게 되며, MMX에서 지원하지 않았던 부동소수점 처리 또한 지원한다.

    SSE는 계속 확장되었으면 SSE2, SSE3, SSSE3, SSE4 등등 많은 버전이 나왔으며 점점 더 향상된 기능을 지원한다.

    (모든 변천사를 적는건 무의미한것 같다.)

     

    하지만 SSE가 끝이 아니다.

    인텔 샌디브릿지 이후 부터는 AVX (Advanced Vector Extension)가 지원되며, ymm라는 새로운 레지스터가 추가된다. 이는 SSE의 xmm 레지스터를 두배 확장하여 사용하는 것이다.

    그러므로 레지스터 하나가 256bit이며 한번에 256bit 연산을 처리할 수 있게 해준다.

    (사실 여기서 부터는 AVX라는걸 하나 더 나눠서 설명해야하지만 짧으므로 SSE 설명에 포함시킨다.)

     

     

     

    요약 : 

    ① SSE는 SIMD 명령어와 추가적인 전용 레지스터를 통해 여러작업을 한번에 처리해주는 기술이다.

    ② MMX(64bit) -> SSE(128bit) -> AVX(256bit) 순으로 변천해 왔다.

     

     

     

    [참고]

    http://shineover.tistory.com/169

    http://minjang.egloos.com/2790682

    http://www.slideshare.net/FukushimaNorishige/simd-10548373 // 나중에 SSE를 통해 연산 라이브러리를 만들고 싶을때 참조해 볼것. (일판)

    'Programming > System' 카테고리의 다른 글

    Lock-free VS Wait-free  (0) 2016.10.19
    ABA Problem  (0) 2016.10.19
    타이머의 해상도  (0) 2014.12.31

    댓글