스트리밍 SIMD 확장 기능
Streaming SIMD Extensions컴퓨팅에서 스트리밍 SIMD 확장(SSE)은 x86 아키텍처에 대한 단일 명령, 다중 데이터(SIMD) 명령 세트 확장입니다.인텔이 설계하여 1999년에 어드밴스드 마이크로 디바이스(AMD) 3DN이 등장한 직후에 Pentium III 시리즈 중앙 처리 장치(CPU)에 도입되었습니다.SSE에는 70개의 새로운 명령어가 포함되어 있습니다(70개의 인코딩을 사용하는 65개의 고유한 니모닉[1]).이 명령어의 대부분은 단정도 부동소수점 데이터로 동작합니다.SIMD 명령은 여러 데이터 개체에 대해 정확히 동일한 작업을 수행할 경우 성능을 크게 향상시킬 수 있습니다.일반적인 어플리케이션은 디지털 신호 처리와 그래픽 처리입니다.
인텔의 첫 번째 IA-32 SIMD 작업은 MMX 명령 세트였습니다.MMX에는 주로 두 가지 문제가 있었습니다.즉, 기존의 x87 부동소수점 레지스터를 재사용하여 CPU가 부동소수점 데이터와 SIMD 데이터 모두에서 동시에 동작할 수 없게 하고 정수에서만 동작했습니다.SSE 부동소수점 명령은 새로운 독립 레지스터 세트인 XMM 레지스터에서 작동하며 MMX 레지스터에서 작동하는 몇 가지 정수 명령을 추가합니다.
SSE는 이후 인텔에 의해 SSE2, SSE3, SSE3, SSE4로 확장되었습니다.부동소수점 연산을 지원해 MMX보다 응용 범위가 넓어 인기를 끌었다.SSE2에 정수 지원이 추가되어 MMX가 크게 장황하게 되었습니다.단, 상황에[when?] 따라서는 SSE 동작과 병행하여 MMX를 사용함으로써 퍼포먼스가 더욱 향상될 수 있습니다.
SSE는 원래 Katmai New Instructions(KNI)로 불리며 Katmai는 최초의 Pentium III 코어 리비전의 코드명입니다.Katmai 프로젝트 기간 동안 인텔은 초기 제품 라인, 특히 주력 제품인 Pentium II와의 차별화를 추구했습니다.나중에 ISE(Internet Streaming SIMD Extensions)로[2] 이름이 바뀌었고, 이후 SSE. AMD는 Athlon XP 및 Duron(모건 코어) 프로세서에서 SSE 명령 지원을 추가했습니다.
레지스터
SSE는 처음에 8개의 새로운 128비트 레지스터를 추가했습니다.XMM0
통해.XMM7
AMD의 AMD64 확장 기능(원래 x86-64)은 8개의 레지스터를 추가했습니다.XMM8
통해.XMM15
이 확장자는 인텔64 아키텍처에 중복되어 있습니다.또한 새로운 32비트 제어/상태 레지스터가 있습니다.MXCSR
. 레지스터XMM8
통해.XMM15
는 64비트 동작 모드에서만 액세스 할 수 있습니다.
SSE는 XMM 레지스터에 단일 데이터 유형만 사용했습니다.
- 4개의 32비트 싱글소수점 부동소수점 수
SSE2는 나중에 XMM 레지스터의 사용을 확장하여 다음을 포함합니다.
- 2개의 64비트 더블소켓 부동소수점 번호 또는
- 2개의 64비트 정수 또는
- 4개의 32비트 정수 또는
- 8개의 16비트 짧은 정수 또는
- 16개의 8비트바이트 또는 문자
이들 128비트 레지스터는 운영체제가 태스크스위치 전체에서 유지해야 하는 추가 머신 상태이기 때문에 운영체제시스템이 명시적으로 활성화 할 때까지 디폴트로 디세블로 되어 있습니다.즉, OS는 이 기능을 사용하는 방법을 알고 있어야 합니다.FXSAVE
그리고.FXRSTOR
instructions는 모든 x86 및 SSE 레지스터 상태를 한 번에 저장할 수 있는 확장 명령 쌍입니다.이 지원은 모든 주요 IA-32 운영 체제에 빠르게 추가되었습니다.
SSE를 지원하는 최초의 CPU인 Pentium III는 SSE와 부동소수점 유닛(FPU)[2] 간의 공유 실행 리소스입니다.컴파일된 어플리케이션은 FPU 명령과 SSE 명령을 나란히 둘 수 있지만 Pentium III는 같은 클럭 사이클로 FPU 명령과 SSE 명령을 발행하지 않습니다.이 제한에 의해 파이프라인의 효율은 저하되지만 개별 XMM 레지스터에서는 명시적인 MMX/플로팅 포인트모드 스위칭에 의한 퍼포먼스 저하 없이 SIMD 및 스칼라 부동 소수점 동작을 혼재시킬 수 있습니다.
SSE의 순서
SSE에서는 스칼라와 패킹된 부동소수점 명령이 도입되었습니다.
부동 소수점 명령
- 메모리-등록/등록-메모리/등록-등록-등록 데이터 이동
- 스칼라 –
MOVSS
- 포장 –
MOVAPS, MOVUPS, MOVLPS, MOVHPS, MOVLHPS, MOVHLPS, MOVMSKPS
- 스칼라 –
- 산술
- 스칼라 –
ADDSS, SUBSS, MULSS, DIVSS, RCPSS, SQRTSS, MAXSS, MINSS, RSQRTSS
- 포장 –
ADDPS, SUBPS, MULPS, DIVPS, RCPPS, SQRTPS, MAXPS, MINPS, RSQRTPS
- 스칼라 –
- 비교하다
- 스칼라 –
CMPSS, COMISS, UCOMISS
- 포장 –
CMPPS
- 스칼라 –
- 데이터 셔플 및 압축 해제
- 포장 –
SHUFPS, UNPCKHPS, UNPCKLPS
- 포장 –
- 데이터형 변환
- 스칼라 –
CVTSI2SS, CVTSS2SI, CVTTSS2SI
- 포장 –
CVTPI2PS, CVTPS2PI, CVTTPS2PI
- 스칼라 –
- 비트 논리 연산
- 포장 –
ANDPS, ORPS, XORPS, ANDNPS
- 포장 –
정수 명령
- 산술
PMULHUW, PSADBW, PAVGB, PAVGW, PMAXUB, PMINUB, PMAXSW, PMINSW
- data 이동
PEXTRW, PINSRW
- 다른.
PMOVMSKB, PSHUFW
기타 절차
MXCSR
관리LDMXCSR, STMXCSR
- 캐시 및 메모리 관리
MOVNTQ, MOVNTPS, MASKMOVQ, PREFETCH0, PREFETCH1, PREFETCH2, PREFETCHNTA, SFENCE
예
다음의 간단한 예는 SSE를 사용하는 이점을 보여줍니다.컴퓨터 그래픽스 애플리케이션에서 매우 자주 사용되는 벡터 덧셈과 같은 연산을 고려해 보십시오.x86을 사용하여 2개의 단일 정밀도를 추가하려면 4개의 부동 소수점 추가 명령이 필요합니다.
vec_res.x = v1.x + v2.x; vec_res.y = v1.y + v2.y; vec_res.z = v1.z + v2.z; vec_res.w = v1.w + v2.w;
이는 오브젝트 코드의 4개의 x86 FADD 명령에 해당합니다.한편, 다음의 의사 코드가 나타내듯이, 1개의 128비트 「패킹 추가」명령어로 4개의 스칼라 덧셈명령어를 대체할 수 있습니다.
움직임 xmm0, [v1] ;xmm0 = v1.w v1.z v1.y v1.x 추가 xmm0, [v2] ;xmm0 = v1.w+v2.w v1.z+v2.z v1.y+v2.y v1.x+v2.x 움직임 [vec_res], xmm0 ;xmm0
최신 버전
- SSE2, Willamette New Instructions(WNI)는 Pentium 4에서 도입된 SSE의 주요 기능 확장입니다.SSE2에는 모든 SSE 연산에 대해 2개의 주요 기능, 128비트 XMM 레지스터에서의 MMX 정수 연산이 추가되었습니다.원래의 SSE 명령 집합에서는 정수와의 변환에 의해 64비트 MMX 레지스터에 정수 데이터가 배치되었습니다.SSE2를 사용하면 프로그래머는 레거시 MMX 또는 FPU 레지스터를 사용할 필요 없이 XMM 벡터 레지스터 파일을 사용하여 모든 데이터 유형(8비트 정수에서 64비트 부동)에 대해 SIMD 계산을 수행할 수 있습니다.일반적인 데이터 유형을 처리하기 위한 직교 명령 집합을 제공합니다.
- SSE3(PNI)는 SSE2에 대한 증분 업그레이드이며 DSP 중심의 수학 명령과 일부 프로세스(스레드) 관리 명령을 추가합니다.또한 SSE2 이전 버전에서는 불가능했던 동일한 레지스터에 저장된 두 개의 숫자를 더하거나 곱하는 것도 허용했습니다.인텔 용어로는 수평이라고 불리는 이 기능은 SSE3 명령 세트에 추가된 주요 기능입니다.AMD의 3DNow! 확장은 후자도 할 수 있습니다.
- SSE3, MNI(Merom New Instructions)는 SSE3에 대한 업그레이드입니다.16개의 새로운 명령 추가에는 워드 내의 바이트 허용, 16비트 고정 소수점 숫자의 올바른 반올림, 워드 내 누적 명령 등이 포함됩니다.SSE3는 코어 마이크로아키텍처 개발 중에 사용되었기 때문에 SSE4로 오인되는 경우가 많습니다.
- SSE4, PNI(Penryn New Instructions)는 도트 제품 명령, 추가 정수 명령, 명령(인구 수: 1로 설정된 비트 수, 예를 들어 암호학에서 광범위하게 사용되는 비트 수) 등을 추가하는 또 다른 주요 확장 기능입니다.
- XOP, FMA4, CVT16은 AMD가 2007년 8월에[3][4] 발표한 새로운 반복 작업으로 2009년 [5]5월에 개정되었습니다.
- AVX(Advanced Vector Extensions), Gesher New Instructions(GNI)는 인텔이 발표한 SSE의 고급 버전으로 128비트에서 256비트로 데이터 패스가 넓어지고 3개의 오퍼랜드 명령이 2개에서 늘어납니다.인텔은 2011년 초에 AVX [6]지원 프로세서를 출시했습니다.
- AVX2는 AVX 명령어세트를 확장한 것입니다.
- AVX-512(3.1 및 3.2)는 x86 명령 세트아키텍처용 256비트 Advanced Vector Extensions SIMD 명령의 512비트 확장입니다.
소프트웨어 및 하드웨어 문제
모든 x86 명령어 세트 확장을 사용하여 BIOS, 운영체제 및 애플리케이션 프로그래머의 존재와 적절한 동작을 테스트하고 검출할 수 있습니다.
- 인텔과 AMD는 CPU가 지원하는 확장을 검출하는 애플리케이션을 제공합니다.
- CPUID opcode는 x86 아키텍처용 프로세서 보충 명령(CPU IDentification에서 파생된 이름)입니다.인텔은 1993년 펜티엄과 SL-Enhanced 486 프로세서를 출시하면서 이 프로세서를 도입했습니다.
x86 확장이 일반화된 지 약 10년이 지나서야 애플리케이션에 의해 최소한의 기본 MMX 및 SSE 지원(경우에 따라서는)조차 존재하지 않을 정도로 사용자 애플리케이션의 사용 속도가 느렸습니다.분산 컴퓨팅에 의해 과학계에서는 이러한 확장 기능의 사용이 촉진되어 CPU가 SSE2 또는 SSE3를 지원하지 않는 한 많은 과학 어플리케이션의 실행을 거부합니다.
사용 가능한 다양한 확장 세트에 대처하기 위해 애플리케이션의 여러 리비전을 사용하는 것이 x86 확장 최적화 문제를 해결하는 가장 간단한 방법입니다.소프트웨어 라이브러리와 일부 응용 프로그램은 사용 가능한 x86 명령의 완전한 사용이 명령이 처음 도입된 지 약 5~15년 후에 마침내 일반화될 수 있음을 암시하는 여러 확장 유형을 지원하기 시작했습니다.
식별하다
다음 프로그램을 사용하여 시스템에서 지원되는 SSE 버전을 확인할 수 있습니다.
- 인텔 프로세서 식별[7] 유틸리티
- CPU-Z – CPU, 메인보드 및 메모리 식별 유틸리티.
- lscpu - 대부분의 Linux 디스트리뷰션에서 util-linux 패키지로 제공됩니다.
레퍼런스
- ^ "Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 1: Basic Architecture". Intel. April 2022. pp. 5-16–5-19. Archived from the original on April 25, 2022. Retrieved May 16, 2022.
- ^ a b Diefendorff, Keith (March 8, 1999). "Pentium III = Pentium II + SSE: Internet SSE Architecture Boosts Multimedia Performance" (PDF). Microprocessor Report. 13 (3). Archived (PDF) from the original on April 17, 2018. Retrieved September 1, 2017.
- ^ Vance, Ashlee (August 3, 2007). "AMD plots single thread boost with x86 extensions". The Register. Archived from the original on April 27, 2011. Retrieved August 24, 2017.
- ^ "AMD64 Technology: 128-Bit SSE5 Instruction Set" (PDF). AMD. August 2007. Archived (PDF) from the original on August 25, 2017. Retrieved August 24, 2017.
- ^ "AMD64 Technology AMD64 Architecture Programmer's Manual Volume 6: 128-Bit and 256-Bit XOP and FMA4 Instructions" (PDF). AMD. November 2009. Archived (PDF) from the original on January 31, 2017. Retrieved August 24, 2017.
- ^ Girkar, Milind (October 1, 2013). "Intel® Advanced Vector Extensions (Intel® AVX)". Intel. Archived from the original on August 25, 2017. Retrieved August 24, 2017.
- ^ "Download the Intel® Processor Identification Utility". Intel. July 24, 2017. Archived from the original on August 25, 2017. Retrieved August 24, 2017.