스트리밍 SIMD 확장

 

Streaming SIMD Extensions.
1. 개요
2. 특징
2.1. SSE
2.2. SSE2
2.3. SSE3
2.4. SSE4
2.4.1. SSE4.1
2.4.2. SSE4.2
2.4.3. SSE4a
2.5. SSE5
3. 지원 프로세서
3.1. SSE
3.2. SSE2
3.3. SSE3
3.4. SSE4
3.5. SSE4a
4. 관련 항목


1. 개요


IA-32/x86 SIMD 확장 명령어 세트로, 인텔AMD의 3DNow!에 대응하기 위해 만든 명령어 세트이다.
인텔의 IA-32의 MMX 명령어 세트에는 두 가지 큰 문제점이 있었는데 그것은 기존 부동 소수점 레지스터 재사용은 부동 소수점과 SIMD 데이터를 동시에 작동할 수 없게 만든다는 것과 오직 정수만 연산 가능하다는 것이었다. 그 문제를 해결한 것이 SSE이다.
특히 MMX의 경우 MMX연산이 끝난 후
emms
명령어로 x87 레지스터를 비우지 않으면 FPU가 해당 레지스터를 사용할 때 속도가 저하되는 문제가 있다. 그리고 이 문제는 SSE에서 AVX로 넘어가면서 한번 더 반복된다. MMX의
emms
와 AVX의
vzeroupper
/
vzeroall
명령어가 처리 사이클을 많이 소모해서 자칫하면 속도가 느려지는 문제가 있는것도 포함된다.
1999년 펜티엄 III 시리즈 프로세서를 통해 도입을 시작하였으며 이후 AMD애슬론 XP 시리즈와 듀론 시리즈에서부터 채택하기 시작하였다.
펜티엄 III의 코드명이 Katmai로 알려져 있을 시기에는 KNI(Katmai New Instructions)라고 불리기도 했다. 이후 ISSE(IntelStreaming SIMD Extentions)로 정해졌고, 이후 SSE로 변경되었다.
이 SSE를 확장한 후속 명령어는 AVX이다.

2. 특징



2.1. SSE


XMM으로 알려진 128비트 레지스터를 추가했다. x86에서는 8개, x86-64에서는 16개의 레지스터가 사용 가능하다. 그리고 4개의 32비트 단정밀도 부동 소수점[1]을 사용했으며, 정수 계산을 지원하지 않는다. 다만 이것은 MMX 명령어를 지원해 해결했다.
첫 번째 SSE 지원 CPU인 펜티엄 III 시리즈는 SSE와 FPU 사이에 리소스 공유가 가능했지만, 동시에 작동하지는 않는다는 문제점이 있었다.
참고로 이 명령어 세트를 완벽하게 지원할 경우, SSE를 지원하지 않는 것과 비교하여 최대 4배 까지의 성능 향상이 가능하다.

2.2. SSE2


2000년 11월에 출시된 펜티엄 4에 처음 탑재되었고, AMD는 2003년 옵테론 시리즈애슬론 64 시리즈에 처음 도입했다.
SSE2는 MMX의 정수 벡터 연산을 구현했고, x87 FPU 레지스터를 공유해 x87 명령어와 모드 스위칭 페널티를 회피하였다. 또 무한 정보 스트림을 처리할 때 발생하는 캐시 오염을 최소화하기 위해 캐시 제어 명령어 집합과 정교한 숫자형 변환 명령어를 포함하는 등의 개선으로 MMX를 완전히 대체하게 되었다. 현재 윈도우 7 업데이트나 윈도우 8.1, 윈도우 10에 필요한 최소이기도 하다.
Windows 7에서 2018년부터 배포하는 롤업 업데이트 KB4088875 설치 이후부터 이 명령어를 요구한다. 그러지 않을 경우 블루스크린이 발생한다.

2.3. SSE3


PNI(Prescott New Instructions)라고 부르기도 한다. 인텔에선 2004년 2월에 출시된 프레스캇에 처음 탑재되었고, AMD애슬론 64 시리즈의 베이스, 샌디에고 등의 E 스테핑 리비전부터 처음 탑재되었다.
SSE2에서 13개의 새로운 명령어가 추가되었고, 엄격했던 이전의 수직적 SSE 명령어 처리에서 벗어나 수평적으로 동작할 수 있게 되었다. 또한 전역 반올림 모드의 변경없이 부동 소수점을 정수형으로 변환하는 명령어의 추가로 파이프라인의 스톨을 피하는 등의 개선이 있었다.

2.4. SSE4


2006년 9월 27일 인텔 개발자 포럼에서 처음 소개되었고, 2007년 인텔 개발자 포럼에서 자세히 설명되었고, 인텔의 코어 마이크로아키텍처 중 45nm 공정 미세화 버전인 요크필드-XE, 요크필드, 울프데일부터 지원하기 시작했다. 코어 마이크로아키텍처의 65nm 공정 버전인 콘로는 SSE4가 아닌 SSSE3까지만 지원한다. SSE4와 SSSE3(Supplemental Streaming SIMD Extension 3)는 서로 다른 명령어 세트이므로 혼동하지 말자. 한편, AMDK10 마이크로아키텍처부터 SSE4가 아닌 SSE4a를 지원하기 시작했는데 인텔의 SSE4와 AMD의 SSE4a는 서로 호환성이 없는 사실상 별개의 명령어 세트이므로 이 역시 혼동하지 말 것.
SSE4는 총 54개의 명령어로 구성되어 있다.

2.4.1. SSE4.1


47개의 명령어 집합이며, 인텔의 펜린에서부터 지원을 시작하였다.

2.4.2. SSE4.2


SSE4.1에서 명령어 7개가 추가되었으며 2008년 11월 인텔네할렘 마이크로아키텍처부터 지원을 시작하였다.
추가된 명령어는 STTNI(String and Text New Instructions)라고 불리는 문자열 및 텍스트 비교 명령어와 데이터 전송 프로토콜에서 사용되는 순환 중복 검사(CRC) 계산 명령어 등이 추가되었다.

2.4.3. SSE4a


2007년 AMD바르셀로나 프로세서에 처음 소개되었으며 총 4개의 명령어가 추가되었다. 다만 POPCNT와 LZCNT 명령어는 별로의 확장 명령어로 작성하며, 인텔 프로세서에서 SSE4a 명령어 세트는 POPCNT를 제외하고 지원되지 않는다.

2.5. SSE5


원래 AMDK10 마이크로아키텍처 다음 세대에 적용될 명령어 세트였으나, 개발이 지연됨에 따라 인텔의 제안에 따라 AVX로 이동하게 된다. 현재 AMD불도저 마이크로아키텍처부터 지원하기 시작한 XOP, FMA4, CVT16(F16C)이 바로 이것.
SSE5 명령어 세트는 46개의 기본 명령어를 포함해 총 170개의 명령어로 구성되어 있으며, 대부분의 명령어들이 단일 스레드 성능 개선을 목적으로 설계되었다. 일부 SSE5 명령어는 3 피연산자 명령어로, x86 코드의 명령어 수 증가로 가능한 것들도 있다.
AMD의 주장에 따르면 고성능 컴퓨팅(HPC), 멀티미디어, 컴퓨터 보안에서의 극적인 성능 향상과 고급 암호화 표준(AES)에서 5배의 성능 향상, 비디오 스트림 프로세서가 사용된 이산 코사인 변환(DCT)에서 30%의 성능 향상이 있다고 한다.
그러나 인텔은 사용하지도 않아서 3DNow! 같은 AMD만의 독자적인 명령어 셋이였기 때문에 AMD ZEN 마이크로아키텍처 부터 지원을 중단한다.[2] 대신 인텔의 AVX-2를 도입한다.

3. 지원 프로세서



3.1. SSE



3.2. SSE2



3.3. SSE3



3.4. SSE4



3.5. SSE4a



4. 관련 항목



[1] 단정밀도 부동 소수점은 32비트이다. 고로 32비트 x 4 = 128비트.[2] 지원만 중단됐기 때문에 사용은 가능하다. 하지만 이 명령어로 문제가 생겨도 유지보수도 안해주고, 다음 세대 아키텍처에서 언제 사라질 줄 모르기 때문에 프로그래밍 할때 대응하지 않는 편이 좋다.