명령어 집합 | |
CISC | AMD64●x86● · M68K · 68xx · Z80 · 8080 · MOS 65xx · VAX |
RISC | AArch64 ARM · RISC-V● · MIPS● · DEC Alpha · POWER PowerPC · CELL-BE LoongArch · OpenRISC · PA-RISC · SPARC · Blackfin · SuperH · AVR32 AVR |
VLIW EPIC | E2K · IA-64 · Crusoe |
<rowcolor=#fff> x86 · AMD64 확장 명령어 집합 | |
인텔 주도 확장 명령어 | |
범용 | APX |
SIMD | MMX · SSE SSE2 · SSE3 · SSSE3 · SSE4.1 · SSE4.2 · AVX AVX2 · AVX-512 · AVX10 · AMX AVX-512: F · CD · DQ · BW · VL · IFMA · VBMI · VBMI2 · VNNI · VAES · GFNI · BITALG AVX[1]: AVX-VNNI · AVX-IFMA AVX10: AVX10.1 · AVX10.2 |
비트 조작 | BMI1 · BMI2 · ADX |
보안 및 암호 | AES-NI · CLMUL · RDRAND · RDSEED · SHA · MPX · SGX · TME · MKTME |
가상화 및 기타 | VT-x(VMX) · SMX · TSX |
AMD 주도 확장 명령어 | |
SIMD 및 비트 연산 | 3DNow! PREFETCHW · F16C · XOP · FMA FMA4 · FMA3 |
비트 조작 | ABM |
보안 및 암호 | SME |
가상화 및 기타 | AMD-V |
[1] 512-bit EVEX 인코딩된 AVX-512 명령어의 256-bit VEX 인코딩 버전
Streaming SIMD Extensions.
1. 개요
Streaming SIMD Extensions. x86/AMD64의 SIMD 확장 명령어 세트다.2. 상세
64비트 SIMD MMX 명령어를 성공시킨 인텔은 AMD에서 3DNow!라는 MMX 대항마를 출시하고 이에 다시 대응하기 위해 MMX 후속작으로 만든 128비트 SIMD 명령어 세트이다.
인텔의 IA-32의 MMX 명령어 세트에는 두 가지 큰 문제점이 있었는데 그것은 기존 부동 소수점 레지스터 재사용은 부동 소수점과 SIMD 데이터를 동시에 작동할 수 없게 만든다는 것과 오직 정수만 연산 가능하다는 것이었다. 이 문제를 해결한 것이 SSE이다.
x87이 사용하는 레지스터를 공유하는 MMX의 경우 MMX연산이 끝난 후
emms
명령어로 x87 레지스터를 비우지 않으면 FPU가 해당 레지스터를 사용하는 경우 레지스터 컨텍스트 스위칭이 일어나 속도가 저하되는 문제가 있다. 이 문제는 SSE에서 AVX가 등장하며 VEX인코딩을 사용하지 않는 레거시 인코딩된 SSE와 AVX 코드를 함께 사용하는 경우 상기한 문제를 포함해 MMX의 emms
와 AVX의 vzeroupper
/vzeroall
명령어가 처리 사이클을 많이 소모해서 자칫하면 속도가 느려지는 문제가 존재한다.인텔 펜티엄III 시리즈의 코드명이 Katmai로 알려져 있을 시기에는 KNI(Katmai New Instructions)라고 불리기도 했다. 이후 ISSE(IntelStreaming SIMD Extentions)로 정해졌고, 이후 SSE로 변경되었다.
1999년, 인텔의 펜티엄III 시리즈를 통해 도입을 시작했으며 이후 AMD는 2001년, 애슬론 XP 시리즈와 듀론 시리즈에서부터 채택하기 시작했다.
이 SSE를 확장한 후속 명령어는 AVX이다.
최신 운영체제와 응용 프로그램들이 SSE 또는 그 상위 명령어 지원을 필수로 요구하고 성능 향상도 크기 때문에 최신 S/W 사용시 CPU에서 지원여부를 확인해야하며, 반대로 신형 명령어를 사용하려면 너무 오래된 운영체계는 최신 명령어를 지원하지 않기도 하니 꼭 확인해야한다.
AMD 역시 ZEN 마이크로아키텍처부터 자체개발 명령어인 3DNow!와 SSE5를 포기하고 인텔에서 만든 SSE와 AVX 명령어를 따르기 시작했으며 리눅스 커널도 5.17부터 3DNow! 같은 AMD 자체 명령어셋 지원을 중단한다.#
3. SSE 이전의 SIMD 구현
SIMD문서에서 설명된 것과 같이 VLIW같은 것을 제외하면 일반적인 범용 프로세서들의 기본 동작은 한 명령어는 한 데이터를 처리하는 것으로 되어 있다. MMX가 도입되기 이전의 인텔 프로세서들 또한 이는 마찬가지였기에 인텔은 MMX라는 64비트 SIMD 명령어 세트를 도입했다.MMX는 64비트의 너비를 가지고 있어 8/16/32비트의 packed math 처리와 64비트의 bitwise 연산이 가능했고 이 덕분에 정수기반의 연산 성능은 급격히 증가했으며 이 특징 덕분에 8비트 정수 기반의 소프트웨어 기반 비디오 코덱들과 이미지 처리성능이 크게 향상되었다.
다만 첫 시도가 완벽한 것은 아니었는데, SSE 이후의 SIMD 세트는 독립적인 연산 유닛과 레지스터를 가지고 있는 것에 비해 MMX는 x87 FPU를 공유해서 사용했다. 이 전략은 프로세서의 트랜지스터 갯수를 절약하는데 있어서 도움이 되긴 했으나 이런 구조적 문제로 인해 MMX와 부동소숫점 연산을 파이프라인 내에서 동시에 사용 할 수 없었던 데다 MMX를 사용하므로써 프로세서 내부의 스테이트 플래그가 켜지면 x87 명령어를 사용할 때마다 레지스터의 내용을 스위치해
emms
명령어를 사용해서 프로세서에게 더이상 MMX명령어를 사용하지 않는다고 알려줘야 성능의 저하가 일어나지 않았다.또한 MMX는 정수 연산만 가능하다는 문제점이 있어 이미지 처리와 같은 정수 영역과 같은 특정 영역에서만 성능을 발휘할 수 있었고 3D와 같이 부동소수점 연산을 주로 사용하는 영역에서는 사용이 불가능했는데, 이는 AMD가 MMX와 더불어 부동소수점 연산이 가능한 3DNow!를 가져오면서 해결된다.
3DNow! 또한 x87과 레지스터를 공유하긴 했지만 3DNow!는 애초에 MMX에 없는 부동소수점 연산을 위한 명령어 세트였다 보니 크게 문제가 되지는 않았다. 게다가 3DNow!는 단순히 MMX에 없는 부동소수점 연산만을 추가한 것이 아니라 MMX에 없는 최대/최소, 평균, 셔플연산이 추가되었고 이러한 3DNow!에서 추가된 부족한 기능들은 SSE에 가서야 부동소수점에 한정되어 추가되고 SSE2에 가서 정수연산에 추가되게 된다. 물론 MMX를 가지고 최대/최소/평균 연산이 불가능 한 것은 아니지만 3DNow!가 한 명령어면 되는 것에 비해 여러 명령어를 조합하고 더 많은 레지스터를 사용하여 구현해야 하다 보니 처리량이 낮아질 수밖에 없다.
3DNow!는 너비가 128비트로 더 크고 부동소수점 연산이 가능한 SSE가 등장하며 쓰이지 않게 되었지만, 프로세서에게 캐시에 미리 데이터를 올려 놓는
PREFETCHW
명령어는 2020년대에도 사용되고 있고 Windows 10와 같은 운영체제들은 이 명령어를 필수로 요구하고 있다.MMX의 경우는 애초에 x87 레지스터와 공유되고 있는데다 x87 기반 부동소수점 연산 또한 AMD64이후 부터는 SSE의 FP 유닛을 사용하는 것으로 변경되어 AMD64에서 모든 SSE의 XMM 레지스터와 범용 레지스터의 갯수가 8개에서 16개로 증가했지만 MMX의 MM 레지스터는 8개로 동결되었으며 단순히 하위 호환성을 위해 남겨져 있는 상태이다.
4. 특징
4.1. SSE
Streaming SIMD ExtensionsXMM으로 알려진 128비트 레지스터를 추가했다. x86에서는 8개, x86-64에서는 16개의 레지스터를 사용할 수 있다. 그리고 4개의 32비트 단정밀도 부동 소수점[1]을 사용했으며, 정수 계산을 지원하지 않는다. 다만 이것은 MMX 명령어를 지원해 해결했다.
첫 번째 SSE 지원 CPU인 인텔의 펜티엄 III 시리즈는 SSE와 FPU 사이에 리소스 공유가 가능했지만, 동시에 작동하지는 않는다는 문제점이 있었다.
참고로 이 명령어 세트를 완벽하게 지원할 경우, SSE를 지원하지 않는 것과 비교하여 최대 4배 까지의 성능 향상이 가능하다.
4.2. SSE2
Streaming SIMD Extensions 22000년 11월에 출시된 인텔의 펜티엄4에 처음 탑재되었고, AMD는 2003년에 출시된 옵테론 시리즈와 애슬론 64 시리즈에 처음 탑재했다.
SSE2는 MMX의 정수 벡터 연산을 구현했고, x87 FPU 레지스터를 공유해 x87 명령어와 모드 스위칭 페널티를 회피했다. 그리고 무한 정보 스트림을 처리할 때 발생하는 캐시 오염을 최소화하기 위해 캐시 제어 명령어 집합과 정교한 숫자형 변환 명령어를 포함하는 등의 개선으로 MMX를 완전히 대체하게 되었다. 2018년 기준 Windows 7 서비스 팩 1 업데이트와 Windows 8.1, Windows 10의 최소 요구사양이기도 하다.
Windows 7에서 2018년부터 배포하는 롤업 업데이트 KB4088875 설치 이후부터 이 명령어를 요구한다. 만약 CPU가 SSE2 명령어를 지원하지 않으면 부팅 중 블루스크린 등의 오류가 발생한다.
4.3. SSE3
Streaming SIMD Extensions 3PNI(Prescott New Instructions)라고 부르기도 한다. 인텔에서는 2004년 2월에 출시된 프레스캇에 처음 탑재되었고, AMD에서는 애슬론 64 시리즈의 베니스, 샌디에고 등의 E 스테핑 리비전부터 처음 탑재되었다.
SSE2에서 13개의 새로운 명령어가 추가되었고, 엄격했던 이전의 수직적 SSE 명령어 처리에서 벗어나 수평적으로 동작할 수 있게 되었다. 또한 전역 반올림 모드의 변경없이 부동 소수점을 정수형으로 변환하는 명령어의 추가로 파이프라인의 스톨을 피하는 등의 개선이 있었다.
구글 크롬에서 2021년 3월부터 배포된 89 버전부터 SSE3 명령어가 필수 요구사양이 되어 해당 명령어를 지원하지 않으면 최신버전 업데이트가 불가능하다.
4.4. SSSE3
Supplemental Streaming SIMD Extension 3인텔 펜티엄4 시리즈의 아키텍처인 테자스/제이호크에서 TNI라는 이름으로 추가될 명령어 세트이었으나 해당 아키텍처가 최종적으로 취소되고 이후 코어 마이크로아키텍처를 사용한 프로세서가 출시되면서 SSSE3라는 이름으로 바뀌어 다시 등장했다.
SSE3의 경우 부동소수점 연산만 가능했지만 SSSE3에서는 정수연산이 추가되었으며 곱셈, 나눗셈, 셔플링, 절대값과 부호 반전 기능들이 추가되었다.
AMD는 2011년에 출시된 불도저 마이크로아키텍처부터 SSSE3 명령어를 지원한다.
Windows 11 22H2 버전부터 CPU가 SSSE3 명령어를 지원하지 않으면 부팅 중 블루스크린 등의 오류가 발생한다.
4.5. SSE4
Streaming SIMD Extensions 42006년 9월 27일 인텔 개발자 포럼에서 처음 소개되었고, 2007년 인텔 개발자 포럼에서 자세히 설명되었다. 이후 인텔의 코어 마이크로아키텍처 중 45nm 공정 미세화 버전인 요크필드-XE, 요크필드, 울프데일부터 지원하기 시작했다. 코어 마이크로아키텍처의 65nm 공정 버전인 콘로는 SSE4가 아닌 SSSE3까지만 지원한다.
SSE4와 SSSE3(Supplemental Streaming SIMD Extension 3)는 서로 다른 명령어 세트이므로 혼동하지 말자. 한편, AMD는 K10 마이크로아키텍처부터 SSE4가 아닌 SSE4a를 지원하기 시작했는데 인텔의 SSE4와 AMD의 SSE4a는 서로 호환성이 없는 사실상 별개의 명령어 세트이므로 이 역시 혼동하지 말 것.
SSE4는 총 54개의 명령어로 구성되어 있다.
AMD64(=x86-64-v1)의 개선형인 x86-64-v2 부터 SSE4와 그 계열형(SSE 4.1, 4.2, 4a 등)을 모두 포함한다.
4.5.1. SSE4.1
47개의 명령어 집합이며, 2008년 1월에 출시된 인텔의 펜린 마이크로아키텍처부터 지원을 시작했다.Windows 11에서 이 명령어를 필수로 요구한다.
4.5.2. SSE4.2
SSE4.1에서 명령어 7개가 추가되었으며 2008년 11월 출시된 인텔의 네할렘 마이크로아키텍처부터 지원을 시작했다.추가된 명령어는 STTNI(String and Text New Instructions)라고 불리는 문자열 및 텍스트 비교 명령어와 데이터 전송 프로토콜에서 사용되는 순환 중복 검사(CRC) 계산 명령어 등이 추가되었다.
Windows 11 24H2 버전부터 SSE4.2 명령어와 더불어 SSE4a의 POPCNT 명령어를 지원하지 않으면 부팅 중 블루스크린 등의 오류가 발생한다.
레드햇 리눅스 계열은 RHEL 9 파생 배포판(RHEL 9, CentOS Stream 9, Rocky Linux 9)부터 SSE4.2, SSSE3, POPCNT 미지원 프로세서에서는 부팅시 커널 패닉 0x00007f00 이 발생하며 부팅되지 않는다.
4.5.3. SSE4a
2007년 AMD의 바르셀로나 프로세서에 처음 소개되었으며 EXTRQ/INSERTQ, MOVNTSD/MOVNTSS의 총 4개 명령어가 추가되었다.다만 POPCNT와 LZCNT 명령어는 SIMD가 아니라서 별도의 확장 명령어로 작성되어 있어 이 둘까지 포함하면 총 6개의 명령어다. 인텔 프로세서에서는 네할렘 마이크로아키텍처부터 POPCNT만 지원했다가, 하스웰 마이크로아키텍처 부터 LZCNT도 지원하여 다른 AMD의 자체 명령어(3DNow!, SSE5)와 다르게 인텔도 사용하는 명령어가 되었다.
Windows 11 24H2 버전부터 POPCNT 명령어를 지원하지 않으면 부팅중 블루스크린 등의 오류가 발생한다.[2]
여담으로 2024년 들어 Windows 10도 사실상 POPCNT 명령어를 필수로 요구하는 상황이다. 2024년 초, Visual C++의 버그와 관계된 POPCNT 명령어 미지원 프로세서에서 유니버셜 Windows 앱을 실행할 수 없는 버그가 발생했다. 정확히는 Visual C++의 버그로 인하여 Visual C++로 개발된 유니버셜 Windows 앱(사진, 계산기, 영화 및 TV, 피드백 허브 등)을 실행하면 인텔 코어2 시리즈 등 POPCNT 미지원 프로세서에서 '파일 시스템 오류(-2147219196)' 오류 메시지만 출력하고 실행이 안 되는 문제가 발생했고, 2024년 3월에 문제가 해결되었지만 사실상 POPCNT를 지원하지 않는 CPU에서는 윈도우 10의 원활한 구동이 어렵다는 것을 확인시키는데 영향을 미쳤다.
리눅스의 경우에도 레드햇 계열 9 버전 이상은 POPCNT 미지원 프로세서에서는 부팅되지 않는다.
엔비디아 드라이버 555 이후 버전의 경우에는 POPCNT 미지원 프로세서에서 블루스크린이 발생된다.
4.6. SSE5
Streaming SIMD Extensions 5AMD의 불도저 마이크로아키텍처부터 지원하기 시작한 XOP, FMA4, CVT16(F16C) 등의 명령어 세트. 원래 AMD의 K10 마이크로아키텍처 다음 세대에 적용될 명령어 세트였으나, 개발이 지연됨에 따라 인텔이 제안한 AVX로 이동하게 된다.
SSE5 명령어 세트는 46개의 기본 명령어를 포함해 총 170개의 명령어로 구성되어 있으며, 대부분의 명령어들이 단일 스레드 성능 개선을 목적으로 설계되었다. 일부 SSE5 명령어는 3 피연산자 명령어로, x86 코드의 명령어 수 증가로 가능한 것들도 있다.
AMD의 주장에 따르면 고성능 컴퓨팅(HPC), 멀티미디어, 컴퓨터 보안에서의 극적인 성능 향상과 고급 암호화 표준(AES)에서 5배의 성능 향상, 비디오 스트림 프로세서가 사용된 이산 코사인 변환(DCT)에서 30%의 성능 향상이 있다고 한다.
그러나 인텔은 사용하지도 않아서 3DNow! 같은 AMD만의 독자적인 명령어 셋이였기 때문에 AMD ZEN 시리즈 부터 지원을 중단한다.[3] 대신 인텔의 AVX-2를 도입한다. 이 중 유일하게 살아남은 CVT16(F16C) 명령어는 인텔에서도 지원 중이다. 호라이즌 포비든 웨스트가 대표적으로 이 명령어를 사용하는 게임 중 하나.#[4]
4.6.1. FMA3
Fused-Multiply-AddAMD가 제안한 명령어 세트이며 SSE5에 항의 갯수가 4개 짜리인 FMA4가 있어 FMA3 보다 먼저나왔다. FMA3은 3개의 항만을 받는 명령어로 AMD 파일드라이버 시리즈에 처음 도입되었다.
그러나 상술하듯 인텔의 경우 SSE5와 거기에 포함된 FMA4를 도입하지 않고 하스웰 시리즈부터 3개의 항만을 받는 FMA3만을 채택했다.
한 명령어로 곱셈과 덧셈을 처리하는 것이 가능하며 Swizzle을 지원하고 있다 (vfmadd132, vfmadd213, vfmadd231) 1번과 2번 항은 서로 곱셈을 처리하고 3번은 1번과 2번을 서로 곱한 값을 더하게 되며 Swizzel에 따라 레지스터 변경 없이 명령어만 바꿔서 연산을 다르게 처리할 수 있다. 주로 벡터의 내적을 연산하는데 특화되어 있다.
5. 지원 프로세서
5.1. SSE
- 인텔
- 펜티엄 III 시리즈 이후 프로세서
- AMD
- 애슬론 XP 시리즈
- 듀론 시리즈
- K8 마이크로아키텍처 이후 마이크로아키텍처
5.2. SSE2
- 인텔
- 넷버스트 마이크로아키텍처 이후 마이크로아키텍처
- 아톰 시리즈
- AMD
- K8 마이크로아키텍처 이후 마이크로아키텍처
- 트랜스메타
- 트랜스메타 에피션
- VIA
5.3. SSE3
- 인텔
- 코어 마이크로아키텍처 이후 마이크로아키텍처
- 아톰 시리즈
- AMD
- 베니스 계열 이후의 애슬론 64 시리즈 (E 계열 스테핑)
- 애슬론 64 X2 시리즈
- K10 마이크로아키텍처 이후 마이크로아키텍처
- VIA/Centaur
- 트랜스메타
- 트랜스메타 에피션 TM88xx
5.4. SSE4
- 인텔
- 코어 마이크로아키텍처의 45nm 공정 미세화 버전(펜린) - SSE4.1 지원
- 네할렘 마이크로아키텍처 - SSE4.1, SSE4.2, POPCNT 명령어 지원
- 인텔 실버몬트 마이크로아키텍처 - SSE4.1, SSE4.2, POPCNT 명령어 지원
- 하스웰 마이크로아키텍처 이상 - SSE4.1, SSE4.2, POPCNT, LZCNT 명령어 지원
- AMD
- 불도저 마이크로아키텍처 이상 - SSE4.1, SSE4.2, SSE4a, POPCNT, LZCNT 명령어 지원
- 밥캣 마이크로아키텍처 - SSE4a, POPCNT, LZCNT 명령어 지원
- 재규어 마이크로아키텍처 이상 - SSE4.1, SSE4.2, SSE4a, POPCNT, LZCNT 명령어 지원
- VIA
- Nano (SSE4.1)
5.5. SSE4a
- AMD
- 바르셀로나 프로세서 이상 - SSE4a, POPCNT, LZCNT 명령어 지원
- 인텔
- 하스웰 마이크로아키텍처 이상 - POPCNT, LZCNT 명령어 지원
5.6. SSE5
- AMD
- 불도저 마이크로아키텍처
이상[5] - XOP, FMA4, CVT16(F16C) 명령어 지원
- 인텔
- 아이비브릿지 아키텍처
이상- CVT16(F16C) 명령어 지원
6. 관련 항목
[1] 단정밀도 부동 소수점은 32비트이다. 고로 32비트 x 4 = 128비트.[2] 정확히는 빌드 25905부터 POPCNT 명령어를 요구하기 시작했고 빌드 26080부터 요구사항이 SSE 4.2로 상향되었다.[3] 지원만 중단됐기 때문에 사용은 가능하다. 하지만 이 명령어로 문제가 생겨도 유지보수도 안해주고, 다음 세대 아키텍처에서 언제 사라질 줄 모르기 때문에 프로그래밍 할때 대응하지 않는 편이 좋다.[4] 그래서 2세대 샌디브릿지는 이 게임을 실행조차 할 수 없어 FX 비쉐라의 일방적인 승리(?)가 되었다(.....). 부전승[5] AMD ZEN 시리즈도 강제로 활성화 시키면 사용 자체는 가능하나 CVT16(F16C)를 제외하면 비공식 지원이라 정상적인 사용은 불가능하다.