스트리밍 SIMD 확장

위키백과 ― 우리 모두의 백과사전.

스트리밍 SIMD 확장 (SSE)은 x86 아키텍처에 대한 SIMD (단일 명령, 다중 데이터) 명령어 집합 확장이며, 인텔이 개발하여 1999년에 펜티엄 III 시리즈 프로세서에 도입하였다. 이 기능은 AMD사의 3D나우! 기술에 대응한 것이며, SSE는 70가지의 새로운 명령어를 포함하고 있다.

펜티엄 III의 코드 이름 Katmai에서 비롯하여, 원래 KNI (Katmai New Instructions)로도 알려져 있었다. Katmai 프로젝트를 진행하는 동안 인텔은 이 프로젝트를 초기의 제품 라인(특히 펜티엄 II)과 구별할 방도를 찾고 있었다. AMD는 애슬론 XP 프로세서를 시작으로 마침내 SSE 명령어에 대한 지원을 추가하였다. 나중에 이 이름은 ISSE(Internet Streaming SIMD Extensions)로 바뀌었다. 그 뒤에 SSE로 이름이 바뀌었다.

인텔은 일반적으로 최초의 IA-32 SIMD의 결과인 MMX에 실망하였다. MMX는 기본적으로 두 가지 문제가 있었다. 기존의 부동 소수점 레지스터를 다시 사용하여 CPU부동 소수점과 SIMD 데이터를 동시에 활용하지 못하게 만들었으며, 또 정수에서만 동작하였다.

목차

[편집] 레지스터들

SSE는 처음에 XMM0부터 XMM7까지 여덟개의 새로운 128비트 레지스터를 추가하였다. 이후 AMD의 x86-64 확장과 인텔은 XMM8부터 XMM15까지 8개의 레지스터를 추가하였다. 여기에 새로운 32비트 제어/상태 레지스터인 MXCSR이 있다. 모든 16개의 128비트 XMM레지스터는 64비트 동작 모드에서만 접근 가능하다.

각각의 레지스터는 4개의 32비트 단밀도(Single precision) 부동소수점 수, 두개의 64비트 배밀도(Double precision) 부동소수점 수, 4개의 32비트 정수, 8개의 16비트 단 정수, 16개의 8비트 바이트나 글자로 구성된다. 정수 처리를 위해서는 부호가 있거나 없는 정수용 명령어가 있다. 정수 SIMD 처리는 8개의 64비트 MMX레지스터로 여전히 실행될 수 있다.

이러한 128비트 레지스터들은 운영체제가 반드시 테스크 스위치들간에 보호를 해야하는 추가적인 프로그램 상태이기 때문에 운영체제가 명시적으로 활성화시키지 전까지는 기본적으로 비활성화된다. 이말은 모든 x87과 SSE레지스터 상태들은 한번에 저장할 수 있는 확장 명령어쌍인 FXSAVE와 FXSTOR 명령어를 OS가 어떻게 사용해야하는지 알아야 한다는 것이다. 이러한 사항은 모든 주요 IA-32 운영체제에서 바로 지원되었다.

SSE는 부동소수점을 지원하기때문에 MMX보다 더 유용성이 크다. SSE2의 정수 지원은 SSE를 더 유연하게 만든다. 반면에 MMX가 부가적인면은 있지만 SSE처리와 함께 병렬로 처리되는 것은 경우에 따라서는 성능의 향상을 가져온다.

펜티엄 III에서부터 SSE를 지원하였으며 SSE와 FPU과 실행 자원을 공유하였다. 컴파일된 애플리케이션은 차례 차례로 FPU과 SSE명령어를 번갈아 가며 사용할 수 있었지만 FPU과 SSE 명령어를 동시에 처리하지는 않았다. 이 제한은 파이프라인의 효율성을 감소시켰으나 독립된 XMM 레지스터는 명시적으로 MMX와 부동소수점 모드 전환시에 성능에 타격없이 SIMD와 스칼라 부동소수점 처리를 혼합하여 처리하는 것을 가능하게 하였다.

[편집] SSE 명령어

  • 부동 소수점 명령어
    • 메모리 대 레지스터 / 레지스터 대 메모리 / 레지스터 대 레지스터 데이터 이동
      • Scalar – MOVSS
      • Packed – MOVAPS, MOVUPS, MOVLPS, MOVHPS, MOVLHPS, MOVHLPS
    • 산술
      • Scalar – ADDSS, SUBSS, MULSS, DIVSS, RCPSS, SQRTSS, MAXSS, MINSS, RSQRTSS
      • Packed – ADDPS, SUBPS, MULPS, DIVPS, RCPPS, SQRTPS, MAXPS, MINPS, RSQRTPS
    • 비교
      • Scalar – CMPSS, COMISS, UCOMISS
      • Packed – CMPPS
    • 데이터 셔플 / 언패킹
      • Packed – SHUFPS, UNPCKHPS, UNPCKLPS
    • 자료형 변환
      • Scalar – CVTSI2SS, CVTSS2SI, CVTTSS2SI
      • Packed – CVTPI2PS, CVTPS2PI, CVTTPS2PI
    • 비트 논리 명령어
      • Packed – ANDPS, ORPS, XORPS, ANDNPS
  • 정수 명령어
    • 산술
      • PMULHUW, PSADBW, PAVGB, PAVGW, PMAXUB, PMINUB, PMAXSW, PMINSW
    • 데이터 이동
      • PEXTRW, PINSRW
    • 기타
      • PMOVMSKB, PSHUFW
  • 다른 명령어
    • MXCSR 관리
      • LDMXCSR, STMXCSR
    • 캐시 및 메모리 관리
      • MOVNTQ, MOVNTPS, MASKMOVQ, PREFETCH0, PREFETCH1, PREFETCH2, PREFETCHNTA, SFENCE

[편집]

다음 예는 SSE의 장점을 보여준다. 컴퓨터 그래픽등에서 아주 자주 사용하는 명령어인 벡터 더하기를 보자. 두개의 단밀도를 더하기 위해서는 x87를 사용하는 4개의 구성요소 벡터가 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개의 x87 FADD명령어에 해당한다. 반면에 다음 수도 코드(pseudo-code)에서는 하나의 128비트 ‘packed-add’ 명령어가 4개의 스칼라 더하기 명령어를 대체한다.

movaps xmm0,address-of-v1          ;xmm0=v1.w | v1.z | v1.y | v1.x 
addps xmm0,address-of-v2 ;xmm0=v1.w+v2.w | v1.z+v2.z | v1.y+v2.y | v1.x+v2.x movaps address-of-vec_res,xmm0


[편집] 뒤에 나온 버전

[편집] 같이 보기