스트리밍 SIMD 확장

덤프버전 :

명령어 집합
CISC
AMD64x86 · 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


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 · BITALGVPCLMULQDQ · VPOPCNTDQ · VP2INTERSECT · BF16
(Xeon Phi): ER · PF · 4FMAPS · 4VNNIW
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! · F16C · XOP · FMA FMA4 · FMA3
비트 조작
ABM
보안 및 암호
SME
가상화 및 기타
AMD-V


Streaming SIMD Extensions.
1. 개요
2. 상세
3. SSE 이전의 SIMD 구현
4. 특징
4.1. SSE
4.2. SSE2
4.3. SSE3
4.4. SSSE3
4.5. SSE4
4.5.1. SSE4.1
4.5.2. SSE4.2
4.5.3. SSE4a
4.6. SSE5
4.6.1. FMA3
5. 지원 프로세서
5.1. SSE
5.2. SSE2
5.3. SSE3
5.4. SSE4
5.5. SSE4a
5.6. SSE5
6. 관련 항목


1. 개요[편집]


x86/AMD64SIMD 확장 명령어 세트다.


2. 상세[편집]


파일:SIMD AVX2 512.jpg

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애슬론 XP 시리즈와 듀론 시리즈에서부터 채택하기 시작했다.

이 SSE를 확장한 후속 명령어는 AVX이다.

최신 운영체제와 응용프로그램들이 SSE 또는 그 상위 명령어 지원을 필수로 요구하고 성능 향상도 크기 때문에 최신 S/W 사용시 CPU에서 지원여부를 확인해야하며, 반대로 신형 명령어를 사용하려면 너무 오래된 운영체계는 최신 명령어를 지원하지 않기도 하니 꼭 확인해야한다.

AMD 역시 젠 아키텍처부터 자체 개발하는 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
명령어는 2022년 현재에도 쓰이고 있고 Windows 10와 같은 운영체제들은 이 명령어를 필수로 요구하고 있다.

MMX의 경우는 애초에 x87레지스터와 공유되고 있는데다 x87기반 부동소수점 연산 또한 AMD64이후 부터는 SSE의 FP유닛을 사용하는 것으로 변경되어 AMD64에서 모든 SSE의 XMM 레지스터와 범용 레지스터의 갯수가 8개에서 16개로 증가했지만 MMX의 MM 레지스터는 8개로 동결되었으며 단순히 하위 호환성을 위해 남겨져 있는 상태이다.

4. 특징[편집]



4.1. SSE[편집]


XMM으로 알려진 128비트 레지스터를 추가했다. x86에서는 8개, x86-64에서는 16개의 레지스터가 사용 가능하다. 그리고 4개의 32비트 단정밀도 부동 소수점[1]을 사용했으며, 정수 계산을 지원하지 않는다. 다만 이것은 MMX 명령어를 지원해 해결했다.

첫 번째 SSE 지원 CPU인 펜티엄 III 시리즈는 SSE와 FPU 사이에 리소스 공유가 가능했지만, 동시에 작동하지는 않는다는 문제점이 있었다.

참고로 이 명령어 세트를 완벽하게 지원할 경우, SSE를 지원하지 않는 것과 비교하여 최대 4배 까지의 성능 향상이 가능하다.

4.2. SSE2[편집]


2000년 11월에 출시된 펜티엄 4에 처음 탑재되었고, AMD는 2003년 옵테론 시리즈애슬론 64 시리즈에 처음 도입했다.

SSE2는 MMX의 정수 벡터 연산을 구현했고, x87 FPU 레지스터를 공유해 x87 명령어와 모드 스위칭 페널티를 회피했다. 또 무한 정보 스트림을 처리할 때 발생하는 캐시 오염을 최소화하기 위해 캐시 제어 명령어 집합과 정교한 숫자형 변환 명령어를 포함하는 등의 개선으로 MMX를 완전히 대체하게 되었다. 현재 윈도우 7 업데이트나 윈도우 8.1, 윈도우 10에 필요한 최소이기도 하다.

Windows 7에서 2018년부터 배포하는 롤업 업데이트 KB4088875 설치 이후부터 이 명령어를 요구한다. 그러지 않을 경우 블루스크린이 발생한다.

각종 응용프로그램에서도 필수 요구하기 때문에 현재 사용할 수 있는 CPU의 마지노선이 된다.

4.3. SSE3[편집]


PNI(Prescott New Instructions)라고 부르기도 한다. 인텔에선 2004년 2월에 출시된 프레스캇에 처음 탑재되었고, AMD애슬론 64 시리즈의 베이스, 샌디에고 등의 E 스테핑 리비전부터 처음 탑재되었다.

SSE2에서 13개의 새로운 명령어가 추가되었고, 엄격했던 이전의 수직적 SSE 명령어 처리에서 벗어나 수평적으로 동작할 수 있게 되었다. 또한 전역 반올림 모드의 변경없이 부동 소수점을 정수형으로 변환하는 명령어의 추가로 파이프라인의 스톨을 피하는 등의 개선이 있었다.

구글 크롬에서 2020년부터 필수지원이 되어 해당 명령어를 지원하지 않으면 최신버전 업데이트가 불가능하다.


4.4. SSSE3[편집]


Supplemental Streaming SIMD Extension 3

펜티엄 4 아키텍처인 테자스/제이호크에서 TNI라는 이름으로 추가될 명령어 세트이었으나 해당 아키텍처가 최종적으로 취소되고 이후 코어 아키텍처를 사용한 프로세서가 출시되면서 SSSE3라는 이름으로 바뀌어 다시 등장했다.

SSE3의 경우 부동소수점 연산만 가능했지만 SSSE3에서는 정수연산이 추가되었으며 곱셈, 나눗셈, 셔플링, 절대값과 부호 반전 기능들이 추가되었다.

Windows 11 22H2 버전부터 이 명령어를 지원하지 않으면 블루스크린이 발생한다.

4.5. 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개의 명령어로 구성되어 있다.


4.5.1. SSE4.1[편집]


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

Windows 11에서 이 명령어를 필수로 요구하기 시작했다.

4.5.2. SSE4.2[편집]


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


4.5.3. SSE4a[편집]


2007년 AMD바르셀로나 프로세서에 처음 소개되었으며 총 4개의 명령어가 추가되었다. 다만 POPCNT와 LZCNT 명령어는 별로의 확장 명령어로 작성하며, 인텔 프로세서에서 SSE4a 명령어 세트는 POPCNT를 제외하고 지원되지 않는다. 단, 하스웰 이후로는 POPCNT, LZCNT 명령어를 지원하여 다른 AMD 자체명령어(3DNow!, SSE5)와 다르게 인텔도 사용하는 명령어가 되었다.


4.6. 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를 도입한다.

4.6.1. FMA3[편집]


Fused-Multiply-Add
AMD가 제안한 명령어 세트이며 SEE5에 항의 갯수가 4개 짜리인 FMA4가 있어 FMA3 보다 먼저나왔다. FMA3은 3개의 항만을 받는 명령어로 AMD 파일드라이버 시리즈에 처음 도입되었다.

그러나 상술하듯 인텔의 경우 SEE5와 거기에 포함된 FMA4를 도입하지 않고 하스웰 시리즈부터 3개의 항만을 받는 FMA3만을 채택했다.

한 명령어로 곱셈과 덧셈을 처리하는 것이 가능하며 Swizzle을 지원하고 있다 (vfmadd132, vfmadd213, vfmadd231)
1번과 2번 항은 서로 곱셈을 처리하고 3번은 1번과 2번을 서로 곱한 값을 더하게 되며 Swizzel에 따라 레지스터 변경 없이 명령어만 바꿔서 연산을 다르게 처리할 수 있다.
주로 벡터의 내적을 연산하는데 특화되어 있다.


5. 지원 프로세서[편집]



5.1. SSE[편집]




5.2. SSE2[편집]




5.3. SSE3[편집]




5.4. SSE4[편집]




5.5. SSE4a[편집]




5.6. SSE5[편집]


  • AMD
    • 불도저 마이크로아키텍처 이상[3] - XOP, FMA4, CVT16(F16C) 명령어 지원


6. 관련 항목[편집]




파일:크리에이티브 커먼즈 라이선스__CC.png 이 문서의 내용 중 전체 또는 일부는 2023-12-05 04:46:30에 나무위키 스트리밍 SIMD 확장 문서에서 가져왔습니다.

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