Streaming SIMD Extensions. [목차] == 개요 == [[IBM PC 호환기종|IA-32/x86]] [[플린 분류#s-2.2|SIMD]] 확장 명령어 세트로, [[인텔]]이 [[AMD]]의 3DNow!에 대응하기 위해 만든 명령어 세트이다. 인텔의 IA-32의 MMX 명령어 세트에는 두 가지 큰 문제점이 있었는데 그것은 기존 부동 소수점 레지스터 재사용은 부동 소수점과 SIMD 데이터를 동시에 작동할 수 없게 만든다는 것과 오직 정수만 연산 가능하다는 것이었다. 그 문제를 해결한 것이 SSE이다. 특히 MMX의 경우 MMX연산이 끝난 후 {{{emms}}}명령어로 x87 레지스터를 비우지 않으면 FPU가 해당 레지스터를 사용할 때 속도가 저하되는 문제가 있다. 그리고 이 문제는 SSE에서 AVX로 넘어가면서 한번 더 반복된다. MMX의 {{{emms}}}와 AVX의 {{{vzeroupper}}}/{{{vzeroall}}} 명령어가 처리 사이클을 많이 소모해서 자칫하면 속도가 느려지는 문제가 있는것도 포함된다. 1999년 [[인텔 펜티엄III 시리즈|펜티엄 III 시리즈]] 프로세서를 통해 도입을 시작하였으며 이후 [[AMD]]는 [[AMD 애슬론 XP 시리즈|애슬론 XP 시리즈]]와 듀론 시리즈에서부터 채택하기 시작하였다. 펜티엄 III의 코드명이 Katmai로 알려져 있을 시기에는 KNI(Katmai New Instructions)라고 불리기도 했다. 이후 ISSE(IntelStreaming SIMD Extentions)로 정해졌고, 이후 SSE로 변경되었다. 이 SSE를 확장한 후속 명령어는 [[고급 벡터 확장|AVX]]이다. == 특징 == === SSE === XMM으로 알려진 128비트 레지스터를 추가했다. [[IBM PC 호환기종|x86]]에서는 8개, [[x86-64]]에서는 16개의 레지스터가 사용 가능하다. 그리고 4개의 32비트 단정밀도 부동 소수점[* 단정밀도 부동 소수점은 32비트이다. 고로 32비트 x 4 = 128비트.]을 사용했으며, 정수 계산을 지원하지 않는다. 다만 이것은 MMX 명령어를 지원해 해결했다. 첫 번째 SSE 지원 CPU인 [[인텔 펜티엄III 시리즈|펜티엄 III 시리즈]]는 SSE와 FPU 사이에 리소스 공유가 가능했지만, 동시에 작동하지는 않는다는 문제점이 있었다. 참고로 이 명령어 세트를 완벽하게 지원할 경우, SSE를 지원하지 않는 것과 비교하여 최대 4배 까지의 성능 향상이 가능하다. === SSE2 === 2000년 11월에 출시된 [[인텔 펜티엄4 시리즈|펜티엄 4]]에 처음 탑재되었고, [[AMD]]는 2003년 [[AMD 옵테론 시리즈|옵테론 시리즈]]와 [[AMD 애슬론 64 시리즈|애슬론 64 시리즈]]에 처음 도입했다. SSE2는 MMX의 정수 벡터 연산을 구현했고, x87 FPU 레지스터를 공유해 x87 명령어와 모드 스위칭 페널티를 회피하였다. 또 무한 정보 스트림을 처리할 때 발생하는 캐시 오염을 최소화하기 위해 캐시 제어 명령어 집합과 정교한 숫자형 변환 명령어를 포함하는 등의 개선으로 MMX를 완전히 대체하게 되었다. 현재 윈도우 7 업데이트나 윈도우 8.1, 윈도우 10에 필요한 최소이기도 하다. [[Windows 7]]에서 2018년부터 배포하는 롤업 업데이트 KB4088875 설치 이후부터 이 명령어를 요구한다. 그러지 않을 경우 블루스크린이 발생한다. === SSE3 === PNI([[인텔 펜티엄4 시리즈|Prescott]] New Instructions)라고 부르기도 한다. [[인텔]]에선 2004년 2월에 출시된 [[인텔 펜티엄4 시리즈#s-1.3|프레스캇]]에 처음 탑재되었고, [[AMD]]는 [[AMD 애슬론 64 시리즈|애슬론 64 시리즈]]의 베이스, 샌디에고 등의 E 스테핑 리비전부터 처음 탑재되었다. SSE2에서 13개의 새로운 명령어가 추가되었고, 엄격했던 이전의 수직적 SSE 명령어 처리에서 벗어나 수평적으로 동작할 수 있게 되었다. 또한 전역 반올림 모드의 변경없이 부동 소수점을 정수형으로 변환하는 명령어의 추가로 파이프라인의 스톨을 피하는 등의 개선이 있었다. === SSE4 === 2006년 9월 27일 인텔 개발자 포럼에서 처음 소개되었고, 2007년 인텔 개발자 포럼에서 자세히 설명되었고, 인텔의 [[인텔 코어 마이크로아키텍처|코어 마이크로아키텍처]] 중 45nm 공정 미세화 버전인 요크필드-XE, 요크필드, 울프데일부터 지원하기 시작했다. 코어 마이크로아키텍처의 65nm 공정 버전인 콘로는 SSE4가 아닌 SSSE3까지만 지원한다. SSE4와 SSSE3(Supplemental Streaming SIMD Extension 3)는 서로 다른 명령어 세트이므로 혼동하지 말자. 한편, [[AMD]]는 [[AMD K10 마이크로아키텍처|K10 마이크로아키텍처]]부터 SSE4가 아닌 SSE4a를 지원하기 시작했는데 인텔의 SSE4와 AMD의 SSE4a는 서로 호환성이 없는 사실상 별개의 명령어 세트이므로 이 역시 혼동하지 말 것. SSE4는 총 54개의 명령어로 구성되어 있다. ==== SSE4.1 ==== 47개의 명령어 집합이며, [[인텔]]의 펜린에서부터 지원을 시작하였다. ==== SSE4.2 ==== SSE4.1에서 명령어 7개가 추가되었으며 2008년 11월 [[인텔]]의 [[인텔 네할렘 마이크로아키텍처|네할렘 마이크로아키텍처]]부터 지원을 시작하였다. 추가된 명령어는 STTNI(String and Text New Instructions)라고 불리는 문자열 및 텍스트 비교 명령어와 데이터 전송 프로토콜에서 사용되는 순환 중복 검사(CRC) 계산 명령어 등이 추가되었다. ==== SSE4a ==== 2007년 [[AMD]]의 [[AMD 옵테론 시리즈|바르셀로나 프로세서]]에 처음 소개되었으며 총 4개의 명령어가 추가되었다. 다만 POPCNT와 LZCNT 명령어는 별로의 확장 명령어로 작성하며, 인텔 프로세서에서 SSE4a 명령어 세트는 POPCNT를 제외하고 지원되지 않는다. === SSE5 === 원래 [[AMD]]의 [[AMD K10 마이크로아키텍처|K10 마이크로아키텍처]] 다음 세대에 적용될 명령어 세트였으나, 개발이 지연됨에 따라 인텔의 제안에 따라 [[고급 벡터 확장|AVX]]로 이동하게 된다. 현재 [[AMD]]의 [[AMD 불도저 마이크로아키텍처|불도저 마이크로아키텍처]]부터 지원하기 시작한 XOP, FMA4, CVT16(F16C)이 바로 이것. SSE5 명령어 세트는 46개의 기본 명령어를 포함해 총 170개의 명령어로 구성되어 있으며, 대부분의 명령어들이 단일 스레드 성능 개선을 목적으로 설계되었다. 일부 SSE5 명령어는 3 피연산자 명령어로, x86 코드의 명령어 수 증가로 가능한 것들도 있다. [[AMD]]의 주장에 따르면 고성능 컴퓨팅(HPC), 멀티미디어, 컴퓨터 보안에서의 극적인 성능 향상과 [[고급 암호화 표준|고급 암호화 표준(AES)]]에서 5배의 성능 향상, 비디오 스트림 프로세서가 사용된 이산 코사인 변환(DCT)에서 30%의 성능 향상이 있다고 한다. 그러나 인텔은 사용하지도 않아서 3DNow! 같은 AMD만의 독자적인 명령어 셋이였기 때문에 [[AMD ZEN 마이크로아키텍처]] 부터 지원을 중단한다.[* 지원만 중단됐기 때문에 사용은 가능하다. 하지만 이 명령어로 문제가 생겨도 유지보수도 안해주고, 다음 세대 아키텍처에서 언제 사라질 줄 모르기 때문에 프로그래밍 할때 대응하지 않는 편이 좋다.] 대신 인텔의 [[AVX]]-2를 도입한다. == 지원 프로세서 == === SSE === * 인텔 * [[인텔 펜티엄III 시리즈|펜티엄 III 시리즈]] 이후 프로세서 * AMD * [[AMD 애슬론 XP 시리즈|애슬론 XP 시리즈]] * 듀론 시리즈 * [[AMD K8 마이크로아키텍처|K8 마이크로아키텍처]] 이후 마이크로아키텍처 === SSE2 === * 인텔 * [[인텔 넷버스트 마이크로아키텍처|넷버스트 마이크로아키텍처]] 이후 마이크로아키텍처 * [[인텔 아톰 시리즈|아톰 시리즈]] * AMD * [[AMD K8 마이크로아키텍처|K8 마이크로아키텍처]] 이후 마이크로아키텍처 * 트랜스메타 * 트랜스메타 에피션 * VIA * [[VIA C7|C7]] === SSE3 === * 인텔 * [[인텔 펜티엄4 시리즈#s-1.3|프레스캇]] * [[인텔 코어 마이크로아키텍처|코어 마이크로아키텍처]] 이후 마이크로아키텍처 * [[인텔 아톰 시리즈|아톰 시리즈]] * AMD * 베니스 계열 이후의 [[AMD 애슬론 64 시리즈|애슬론 64 시리즈]] (E 계열 스테핑) * [[AMD 애슬론 64 시리즈|애슬론 64 X2 시리즈]] * [[AMD K10 마이크로아키텍처|K10 마이크로아키텍처]] 이후 마이크로아키텍처 * VIA/Centaur * [[VIA C7|C7]] * [[나노#s-3|Nano]] * 트랜스메타 * 트랜스메타 에피션 TM88xx === SSE4 === * 인텔 * [[인텔 코어 마이크로아키텍처|코어 마이크로아키텍처]]의 45nm 공정 미세화 버전(펜린) - SSE4.1 지원 * [[인텔 네할렘 마이크로아키텍처|네할렘 마이크로아키텍처]] - SSE4.1, SSE4.2, POPCNT 명령어 지원 * 인텔 실버몬트 마이크로아키텍처 - SSE4.1, SSE4.2, POPCNT 명령어 지원 * [[인텔 하스웰 마이크로아키텍처|하스웰 마이크로아키텍처]] 이상 - SSE4.1, SSE4.2, POPCNT, LZCNT 명령어 지원 * AMD * [[AMD 불도저 마이크로아키텍처|불도저 마이크로아키텍처]] 이상 - SSE4.1, SSE4.2, SSE4a, POPCNT, LZCNT 명령어 지원 * [[AMD 밥캣 마이크로아키텍처|밥캣 마이크로아키텍처]] - SSE4a, POPCNT, LZCNT 명령어 지원 * [[AMD 재규어 마이크로아키텍처|재규어 마이크로아키텍처]] 이상 - SSE4.1, SSE4.2, SSE4a, POPCNT, LZCNT 명령어 지원 * VIA * [[나노#s-3|Nano]] (SSE4.1) === SSE4a === * AMD * [[AMD 옵테론 시리즈|바르셀로나 프로세서]] - SSE4a, POPCNT, LZCNT 명령어 지원 == 관련 항목 == * [[플린 분류#s-2.2|SIMD]] * MMX * [[고급 벡터 확장]](AVX) * FMA [[분류:중앙처리장치]]