SSE2
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
SSE2는 x86 명령어 집합의 확장으로, 2000년에 처음 소개되었다. MMX 명령어의 확장으로, XMM 레지스터를 사용하여 정수 SIMD 및 스칼라 부동 소수점 연산을 혼합하여 처리할 수 있게 해준다. SSE2는 배정밀도 데이터 형식 지원, 캐시 제어 명령어, 그리고 복잡한 숫자형 변환 명령어를 포함한다. AMD64 아키텍처에서는 XMM 레지스터 수를 늘려 지원하며, Windows 8 및 Microsoft Office 2013 설치에 필요하다. 다양한 CPU에서 지원되며, 컴파일러 지원도 이루어지고 있다.
더 읽어볼만한 페이지
- SIMD 컴퓨팅 - SSE3
SSE3는 인텔에서 개발한 스트리밍 SIMD 확장 3 명령어 세트로, 부동 소수점 연산, 디지털 신호 처리, 3차원 컴퓨터 그래픽 처리 성능 향상을 위해 기존 SSE2 명령어 세트에 몇 가지 새로운 명령어를 추가한 것이다. - SIMD 컴퓨팅 - MMX (명령어 집합)
MMX는 인텔이 개발한 명령어 집합으로, 64비트 레지스터를 사용하여 여러 개의 작은 정수를 동시에 처리하며, x87 부동 소수점 레지스터를 사용해 정수 연산을 수행하도록 설계되었다. - X86 명령어 - 스트리밍 SIMD 확장
스트리밍 SIMD 확장(SSE)은 x86 아키텍처의 SIMD 명령어 집합으로, 128비트 XMM 레지스터를 사용하여 데이터 병렬 처리를 통해 성능을 향상시키며, 인텔 펜티엄 III 프로세서에 처음 도입되어 여러 후속 버전으로 발전했다. - X86 명령어 - SSE3
SSE3는 인텔에서 개발한 스트리밍 SIMD 확장 3 명령어 세트로, 부동 소수점 연산, 디지털 신호 처리, 3차원 컴퓨터 그래픽 처리 성능 향상을 위해 기존 SSE2 명령어 세트에 몇 가지 새로운 명령어를 추가한 것이다.
SSE2 | |
---|---|
일반 정보 | |
이름 | 스트리밍 SIMD 확장 2 |
다른 이름 | SSE2 |
디자인 시기 | 1999년 |
출시 시기 | 2001년 |
설계자 | 인텔 |
유형 | 명령어 집합 |
너비 | 128비트 |
대체 | SSE3 |
명령어 수 | 144 |
기술 상세 | |
도입 프로세서 | 펜티엄 4 제온 |
데이터 형식 | 배정밀도 부동 소수점 정수 |
연산 | 부동 소수점 연산 정수 연산 |
주요 특징 | 144개의 새로운 명령어 추가 배정밀도 부동 소수점 SIMD 연산 지원 정수 SIMD 연산 강화 MMX 명령어와의 호환성 유지 |
활용 분야 | |
응용 프로그램 | 과학 계산 3D 그래픽 비디오 및 오디오 처리 게임 |
게임기 | 엑스박스 |
지원 아키텍처 | |
프로세서 아키텍처 | x86 x64 |
역사적 맥락 | |
선행 기술 | SSE |
후속 기술 | SSE3 |
2. 특징
SSE2는 기존 MMX 명령어 집합에서 사용되던 정수 벡터 연산을 더 넓은 128비트 XMM 레지스터에서 실행할 수 있도록 확장한 명령어 집합이다. 이를 통해 MMX 명령어가 x87 FPU 레지스터와 공간을 공유하여 발생했던 모드 전환 문제를 해결하고 성능을 향상시켰다.
또한, SSE2는 기존 SSE 명령어 집합에 배정밀도 부동소수점 데이터 형식을 추가하여 부동소수점 연산 능력을 강화했다. 이는 특히 높은 정밀도가 요구되는 과학 및 공학 계산 분야에서 중요한 개선점이다.
이 외에도 SSE2는 대용량 데이터를 연속적으로 처리할 때 발생할 수 있는 캐시 오염을 최소화하기 위한 캐시 제어 명령어들과 정교한 숫자 형식 변환 명령어들을 포함한다.
AMD는 자사의 64비트 아키텍처인 AMD64 (x86-64)를 발표하면서 SSE2를 기본으로 지원하고, 추가로 8개의 XMM 레지스터(XMM8 ~ XMM15)를 도입하여 총 16개의 XMM 레지스터를 사용할 수 있도록 확장했다. 이 추가 레지스터는 64비트 모드에서만 활성화된다. 인텔 역시 2004년에 자사의 64비트 아키텍처인 인텔 64를 지원하면서 이러한 추가 레지스터 규격을 채택했다.
2. 1. MMX 확장
SSE2는 기존 MMX 명령어 집합을 XMM 레지스터에서 실행할 수 있도록 확장한 것이다.[1] 기존 MMX 명령어는 8개의 64비트 MMX 레지스터를 사용했는데, 이 레지스터들은 IA-32 아키텍처의 x87 부동소수점 레지스터와 공간을 공유했다.[1] 이 때문에 MMX 연산과 x87 부동소수점 연산을 함께 사용하려면 모드 전환이 필요했고, 이는 성능 저하의 원인이 되었다.[2]SSE2는 MMX 연산을 더 넓은 XMM 레지스터에서 처리함으로써 이러한 문제를 해결했다.[1] 이를 통해 프로그래머는 MMX 정수 SIMD 연산과 스칼라 부동소수점 연산을 모드 전환 없이 혼합하여 사용할 수 있게 되었다.[1] 또한, 더 넓은 레지스터를 활용하여 특정 응용 프로그램에서 상당한 성능 향상을 가져왔다.[2] SSE2는 배정밀도 부동소수점 데이터 형식을 지원함으로써 기존 SSE 명령어 집합의 부동 소수점 벡터 연산 기능을 보완하기도 한다.[2]
이 외에도 SSE2는 연속적인 데이터를 처리할 때 발생할 수 있는 캐시 오염을 최소화하기 위한 캐시 제어 명령어들과 정교한 숫자 형식 변환 명령어들을 포함한다.[1][2]
AMD는 x86-64(AMD64) 아키텍처를 발표하면서 SSE2 명령어 집합을 지원하고, 추가로 8개의 XMM 레지스터를 도입하여 총 16개(XMM0부터 XMM15까지)의 레지스터를 사용할 수 있게 했다.[1][2] 이 추가 레지스터들은 64비트 모드로 동작할 때만 접근 가능하다.[1][2] 인텔 역시 2004년에 자사의 x86-64 아키텍처 구현인 인텔 64를 발표하며 이 추가 레지스터들을 지원하기 시작했다.[1][2]
2. 2. 부동 소수점 연산 강화
SSE2는 기존 SSE 명령어 집합을 확장하여 부동소수점 연산 능력을 강화했다. 가장 중요한 개선점은 배정밀도(double-precision) 데이터 형식을 지원하게 된 것이다. 이를 통해 기존 SSE보다 더 높은 정밀도가 필요한 과학 기술 계산 등에서 성능 향상을 가져왔다.또한, SSE2는 MMX의 정수 벡터 연산을 더 넓은 128비트 XMM 레지스터에서 수행하도록 확장했다. 기존 MMX 명령어는 8개의 64비트 MMX 레지스터를 사용했는데, 이 레지스터들은 x87 부동소수점 레지스터와 물리적으로 같은 공간을 공유했다. 이 때문에 MMX 연산과 x87 부동소수점 연산을 번갈아 사용할 경우, 두 명령어 세트 간의 상태를 전환하는 과정에서 성능 저하가 발생하는 문제가 있었다. SSE2는 독립적인 XMM 레지스터를 사용함으로써 이러한 모드 전환의 필요성을 없애고, 정수 SIMD 연산과 스칼라 부동소수점 연산을 효율적으로 함께 처리할 수 있게 했다. 이는 특정 응용 프로그램에서 상당한 성능 향상을 가능하게 했다.
이 외에도 SSE2는 대용량 데이터를 연속적으로 처리할 때 발생할 수 있는 캐시 오염을 최소화하기 위한 캐시 제어 명령어들과 다양한 숫자 형식 변환 명령어들을 포함하여 데이터 처리 효율성을 높였다.
AMD는 자사의 64비트 아키텍처인 AMD64 (x86-64)를 발표하면서 SSE2를 기본으로 지원하고, 추가로 8개의 XMM 레지스터(XMM8 ~ XMM15)를 도입하여 총 16개의 XMM 레지스터를 사용할 수 있도록 확장했다. 이 추가 레지스터는 AMD64의 64비트 모드에서만 활성화된다. 인텔 역시 2004년에 자사의 64비트 아키텍처인 인텔 64를 지원하면서 이러한 추가 레지스터 규격을 채택하여 현재 표준으로 자리 잡았다.
2. 3. 캐시 제어 명령어
SSE2는 확장 기능 중 하나로 캐시 제어 명령어 집합을 포함한다. 이 명령어들은 끊임없이 연속되는 데이터를 처리할 때 발생할 수 있는 캐시 오염 문제를 최소화하기 위해 설계되었다. 또한, 복잡하고 정교한 숫자 형식 변환 명령어들도 함께 포함되어 있다.2. 4. x86-64 확장
AMD는 자사의 AMD64 (x86-64) 아키텍처에서 SSE2를 지원하면서 중요한 확장을 도입했다. 기존 8개에 8개를 더해 총 16개(XMM0~XMM15)의 XMM 레지스터를 지원하게 되었다. 이 추가 레지스터는 CPU가 64비트 모드로 작동할 때만 활성화된다.이러한 레지스터 확장은 MMX 명령어 처리에도 긍정적인 영향을 주었다. SSE2는 더 넓은 XMM 레지스터를 사용하여 정수 벡터 연산을 수행하므로, 64비트 MMX 레지스터를 사용할 때보다 특정 응용 프로그램에서 상당한 성능 향상을 가져왔다. 또한, MMX는 x87 부동소수점 유닛(FPU)과 레지스터 공간을 공유하여, MMX 명령어와 x87 명령어를 번갈아 실행할 때 모드 전환으로 인한 성능 저하가 발생했다. SSE2는 독립된 XMM 레지스터를 사용하므로 이러한 성능 저하를 피할 수 있다. 더불어 SSE2는 배정밀도 부동소수점 데이터 형식을 지원하여 기존 SSE 명령어 집합을 보완하고 확장했다.
인텔 역시 2004년 자사의 x86-64 아키텍처 구현인 "인텔 64"를 통해 AMD가 도입한 16개의 XMM 레지스터 구성을 채택하여 지원하기 시작했다.
이 외에도 SSE2는 연속적인 데이터 스트림 처리 시 발생할 수 있는 캐시 오염을 최소화하기 위한 캐시 제어 명령어와 정교한 숫자 형식 변환 명령어를 포함하여 시스템 효율성을 높이는 데 기여했다.
3. x87 FPU와 SSE2의 차이점
기존의 x87 FPU 명령어와 SSE2 명령어 세트는 부동소수점 연산을 처리하는 방식에서 몇 가지 중요한 차이점을 가진다. 가장 두드러지는 차이는 연산 과정에서의 정밀도이다. x87 FPU는 일반적으로 중간 계산 결과를 80비트의 높은 정밀도로 저장하는 반면, SSE2는 64비트 배정밀도 또는 32비트 단정밀도를 사용한다.[1]
이러한 정밀도 차이는 기존 x87 FPU 기반으로 작성된 소프트웨어를 SSE2 환경으로 이식(porting)할 때 예상치 못한 수치적 편차를 발생시킬 수 있다. 특히 정밀한 계산이 요구되는 과학 계산 분야에서는 이러한 차이가 결과의 신뢰성 및 다른 시스템과의 호환성 문제로 이어질 수 있다.[1]
또한, 컴파일러가 복잡한 수학 연산을 최적화하는 과정에서 중간 결과를 처리하는 방식의 차이도 최종 결과에 영향을 미칠 수 있다.[1] x87 FPU는 높은 정밀도를 통해 반올림 오차를 줄이는 데 유리했지만(IEEE 754 참고), 한 번에 하나의 연산만 처리하는 스칼라 방식이었다.[2] 반면 SSE2는 상대적으로 정밀도는 낮지만, 여러 데이터를 동시에 처리하는 SIMD 벡터 연산이 가능하여 병렬 처리 성능에서 이점을 가진다.[2]
이러한 차이점들에 대한 더 자세한 내용은 아래 하위 섹션에서 다룬다.
3. 1. 정밀도 차이
기존 FPU 명령어는 일반적으로 중간 계산 결과를 80비트 정밀도로 저장한다. 반면, SSE2는 64비트 배정밀도 또는 32비트 단정밀도 부동소수점 연산을 사용한다. 이로 인해 기존 FPU 기반 소프트웨어 알고리즘을 SSE2로 이식할 때, 특정 수학 연산 조합이나 입력 데이터에 따라 측정 가능한 수치적 편차가 발생할 수 있다. 이는 특히 과학 계산 분야에서 다른 아키텍처 컴퓨터의 결과와 비교해야 할 때 중요한 문제가 될 수 있다.이러한 정밀도 차이는 컴파일러가 여러 연산(덧셈, 뺄셈, 곱셈, 나눗셈 등)이 포함된 수학 표현식을 처리하는 방식에서도 나타날 수 있다. 컴파일러나 최적화 설정에 따라 중간 계산 결과를 임시로 저장했다가 다시 불러오는 과정에서, x87 FPU의 80비트 값이 SSE2의 64비트 값으로 잘릴 수 있다. 이러한 잘림이 발생하는 시점에 따라 최종 계산 결과가 달라질 수 있다. 아래는 포트란 코드를 G95 컴파일러로 컴파일했을 때, x87 FPU 명령어와 SSE2 명령어를 사용한 경우 결과가 다르게 나타나는 예시이다.
program hi
real a,b,c,d
real x,y,z
a=.013
b=.027
c=.0937
d=.79
y=-a/b + (a/b+c)*EXP(d)
print *,y
z=(-a)/b + (a/b+c)*EXP(d)
print *,z
x=y-z
print *,x
end
- 387 부동소수점 명령어로 컴파일 및 실행 결과 (`-mfpmath=387`)
$ g95 -o hi -mfpmath=387 -fzero -ftrace=full -fsloppy-char hi.for
$ ./hi
0.78587145
0.7858714
5.9604645E-8
- SSE2 명령어로 컴파일 및 실행 결과 (`-mfpmath=sse -msse2`)
$ g95 -o hi -mfpmath=sse -msse2 -fzero -ftrace=full -fsloppy-char hi.for
$ ./hi
0.78587145
0.78587145
0.
x87 FPU는 80비트 확장 정밀도를 사용하여 중간 결과를 계산함으로써, 수치적으로 불안정한 알고리즘에서 발생할 수 있는 반올림 오차를 최소화하는 데 유리하다(IEEE 754 설계 배경 참고). 하지만 x87 FPU는 한 번에 하나의 연산만 처리하는 스칼라 유닛인 반면, SSE2는 여러 개의 피연산자 벡터를 동시에 병렬로 처리할 수 있다는 장점이 있다.
결과적으로, x87 FPU에 맞춰 설계된 코드를 상대적으로 낮은 정밀도의 SSE2 부동소수점 연산으로 이식하면 앞서 언급한 수치적 편차가 발생할 수 있으며, 이는 과학 계산 등에서 결과의 재현성을 확보하는 데 어려움을 줄 수 있다. 또한 역사적으로 프로그래밍 언어 표준이나 컴파일러가 x87의 80비트 확장 정밀도 레지스터를 처리하는 방식이 일관되지 않았다는 문제도 있었다. 확장 정밀도 중간 값을 배정밀도 변수로 변환하며 반올림하는 과정이 명확히 정의되지 않아, 레지스터 값이 메모리로 옮겨지는(spill) 시점 등 구현 세부 사항에 따라 결과가 달라지기도 했다.
3. 2. 컴파일러 최적화 문제
기존의 FPU(x87) 명령어는 연산 중간 결과를 80비트의 높은 정밀도로 저장하는 특징이 있다. 하지만 FPU용으로 작성된 소프트웨어나 알고리즘을 SSE2 환경으로 이식할 때, 특정 수학 연산 조합이나 입력 데이터에 따라 눈에 띄는 수치적 차이가 발생할 수 있다. 이는 특히 과학 계산 분야에서 다른 컴퓨터 아키텍처의 결과와 비교해야 할 때 중요한 문제가 될 수 있다.이러한 문제는 컴파일러가 덧셈, 뺄셈, 곱셈, 나눗셈 등이 섞인 복잡한 수학 표현식을 처리하는 방식과 관련이 있다. 컴파일러와 최적화 방법에 따라, 계산 과정에서 발생하는 중간 값들을 임시로 저장했다가 다시 불러오는 과정이 필요한 경우가 있다. x87 FPU에서는 이 중간 값들이 80비트로 유지될 수 있지만, SSE2 환경에서는 64비트 배정밀도로 처리되면서 값이 잘리는(truncated) 시점에 따라 최종 결과가 달라질 수 있다.
다음은 포트란으로 작성된 코드를 G95 컴파일러를 사용하여 각각 x87 FPU 명령어와 SSE2 명령어로 컴파일했을 때 결과가 다르게 나타나는 예시이다.
program hi
real a,b,c,d
real x,y,z
a=.013
b=.027
c=.0937
d=.79
y=-a/b + (a/b+c)*EXP(d)
print *,y
z=(-a)/b + (a/b+c)*EXP(d)
print *,z
x=y-z
print *,x
end
- 387 부동소수점 명령어로 컴파일 및 실행 결과 (`-mfpmath=387`)
$ g95 -o hi -mfpmath=387 -fzero -ftrace=full -fsloppy-char hi.for
$ ./hi
0.78587145
0.7858714
5.9604645E-8
- SSE2 명령어로 컴파일 및 실행 결과 (`-mfpmath=sse -msse2`)
$ g95 -o hi -mfpmath=sse -msse2 -fzero -ftrace=full -fsloppy-char hi.for
$ ./hi
0.78587145
0.78587145
0.
x87 FPU는 80비트 정밀도를 통해 수치적으로 불안정한 알고리즘에서 반올림 오차를 줄이는 데 유리했지만(IEEE 754 설계 원칙 참고), 기본적으로 한 번에 하나의 값만 처리하는 스칼라 유닛이다. 반면, SSE2는 64비트 배정밀도를 사용하지만, 여러 개의 데이터를 동시에 처리하는 벡터 연산이 가능하다는 장점이 있다.
역사적으로 프로그래밍 언어 표준이나 컴파일러들이 x87의 80비트 확장 정밀도 레지스터를 처리하는 방식에 일관성이 부족했던 문제도 있었다. 확장 정밀도 값을 배정밀도 변수에 저장할 때 어떻게 반올림할지가 명확히 정의되지 않았고, 레지스터 값이 메모리로 옮겨지는(spill) 시점 등 구현 세부 사항에 따라 결과가 달라지기도 했다.
4. MMX와 SSE2의 차이점
SSE2는 기존의 MMX 명령어 세트를 확장하여 더 큰 XMM 레지스터에서 작동하도록 설계되었다. 이로 인해 기존 MMX 코드를 SSE2로 변환하는 것이 가능하지만, 레지스터 크기 차이 등을 고려해야 한다.
주요 차이점은 다음과 같다:
- 레지스터 크기 및 구조: SSE2는 128비트 XMM 레지스터를 사용하는 반면, MMX는 64비트 레지스터를 사용한다. 또한 SSE2 레지스터는 x87 부동소수점 레지스터와 독립적이지만, MMX 레지스터는 x87 레지스터와 공간을 공유한다.
- 성능 특성: 이론적으로 SSE2는 MMX보다 두 배 많은 데이터를 처리할 수 있지만, 초기 구현에서는 메모리 정렬 문제나 명령어 처리량 문제로 인해 항상 큰 성능 향상을 보이지는 않았다. 이러한 문제들은 이후 SSE3나 코어 마이크로아키텍처 등에서 개선되었다.
- x87 호환성: MMX는 x87 레지스터와 충돌 문제가 있어 사용 후 `
emms
` 명령어를 통해 상태를 복원해야 하지만, SSE2는 이러한 문제가 없다.
이러한 차이점들로 인해, 특히 x87과의 충돌 문제 부재, 더 나은 처리량, 64비트 환경에서의 이점 등으로 인해 현대적인 벡터화 작업에서는 MMX보다 SSE2가 일반적으로 선호된다.
4. 1. 레지스터 크기 차이
SSE는 MMX 레지스터에서 동작하는 MMX 명령어의 확장이다. 따라서 기존의 모든 MMX 코드를 SSE2와 동등한 코드로 변환하는 것이 가능하다. SSE2가 사용하는 XMM 레지스터는 MMX 레지스터보다 길이가 두 배 길기 때문에, 루프 카운터나 메모리 접근 방식 등을 이에 맞춰 조정해야 할 수 있다. 다만, XMM 레지스터에 8바이트 단위로 데이터를 로드하거나 저장하는 것이 가능하므로 반드시 코드를 변경해야 하는 것은 아니다.하나의 SSE2 명령어가 MMX 명령어보다 두 배 많은 데이터를 처리할 수 있음에도 불구하고, 성능 향상이 기대만큼 크지 않을 수 있다. 여기에는 두 가지 주요 이유가 있다. 첫째, SSE2 데이터가 메모리의 16바이트 경계에 정렬되어 있지 않으면 접근 시 상당한 성능 저하가 발생할 수 있다. 둘째, 이전 x86 아키텍처에서는 SSE2 명령어의 처리량이 MMX 명령어의 절반 수준에 불과했다. 인텔은 첫 번째 문제를 해결하기 위해 SSE3에서 정렬되지 않은 데이터 접근에 따른 부담을 줄이는 명령어를 추가했으며, 두 번째 문제는 코어 마이크로아키텍처(코어 2 듀오 이후 제품)에서 실행 엔진을 확장하여 해결하였다.
한편, MMX 레지스터는 x87 부동소수점 레지스터와 공간을 공유(별칭 관계)하기 때문에 MMX 명령어를 사용하면 x87 명령어의 정상적인 작동을 방해할 수 있다. 따라서 MMX 코드를 사용한 후에는 프로그래머가 반드시 `emms` 명령어(C 언어에서는 `_mm_empty()` 함수)를 호출하여 x87 레지스터 상태를 복원해야 한다. 만약 `emms` 명령어를 사용하지 않으면, 부동소수점 연산 오류가 발생하여 예상치 못한 NaN(Not a Number) 값을 반환할 수 있다. 이러한 오류는 MMX 코드 자체에서는 명확히 드러나지 않아 원인을 찾고 수정하는 데 많은 시간이 소요될 수 있다.
반면 SSE2는 x87 레지스터와 별도의 레지스터를 사용하므로 이러한 문제가 발생하지 않는다. 또한 일반적으로 MMX보다 더 나은 처리량을 제공하며, 64비트 환경에서는 더 많은 레지스터를 사용할 수 있다는 장점이 있어 대부분의 벡터화 작업에서 MMX보다 선호된다.
4. 2. 성능 차이
SSE는 MMX 레지스터에서 동작하는 MMX 명령어의 확장이다. 따라서 모든 기존 MMX 코드를 SSE2로 변환할 수 있다. XMM 레지스터는 MMX 레지스터보다 길이가 두 배이므로, 루프 카운터나 메모리 접근 방식 등을 조정해야 할 수 있다. 그러나 XMM 레지스터에 8바이트 단위로 데이터를 로드하거나 저장하는 것이 가능하므로 반드시 조정이 필요한 것은 아니다.하나의 SSE2 명령어는 MMX 명령어보다 두 배 많은 데이터를 처리할 수 있지만, 이것이 항상 큰 성능 향상으로 이어지지는 않는다. 성능 향상이 크지 않은 데에는 두 가지 주요 이유가 있다.
- 첫째, 16바이트 경계에 정렬되지 않은 메모리에 SSE2 데이터를 접근할 때 상당한 성능 저하가 발생할 수 있다.
- 둘째, 초기 x86 프로세서에서는 SSE2 명령어의 처리량(throughput)이 MMX 명령어 처리량의 절반 수준에 불과했다.
인텔은 이러한 문제들을 해결하기 위해 노력했다. 첫 번째 문제인 메모리 정렬 문제는 SSE3 명령어 세트에서 정렬되지 않은 데이터 접근 시 발생하는 오버헤드를 줄이고 전반적인 성능을 개선하는 명령어를 추가하여 해결했다. 두 번째 문제인 처리량 문제는 코어 마이크로아키텍처(코어 2 듀오 및 이후 제품)에서 실행 엔진을 확장하여 해결하였다.
한편, MMX는 x87 부동소수점 유닛의 레지스터와 공간을 공유하는 문제가 있다. 이 때문에 MMX 명령어를 사용하면 x87 명령어의 정상적인 작동을 방해할 수 있다. 따라서 MMX 코드를 사용한 후에는 반드시 `emms` 명령어(C 언어에서는 `_mm_empty()` 함수)를 호출하여 x87 레지스터 상태를 원래대로 복원해야 한다. 만약 이 과정을 생략하면, 부동소수점 연산 결과가 손상되어 NaN 값을 반환하는 등의 심각한 오류가 발생할 수 있다. 이러한 오류는 MMX 코드 자체에서는 명확히 드러나지 않아 원인을 찾고 수정하는 데 많은 시간이 소요될 수 있다.
SSE2는 MMX와 달리 x87 레지스터와 충돌하는 문제가 없다. 또한 일반적으로 더 나은 처리량을 제공하며, 64비트 환경에서는 더 많은 레지스터를 사용할 수 있다는 장점이 있다. 이러한 이유로 대부분의 벡터 연산 작업에서는 MMX보다 SSE2를 사용하는 것이 권장된다.
4. 3. x87 레지스터와의 관계
MMX와 x87 레지스터 파일은 서로 별칭 관계(aliased)에 있다. 즉, 같은 물리적 레지스터 공간을 공유하기 때문에 MMX 명령어를 사용하면 x87 명령어가 의도한 대로 작동하지 않을 수 있다. 따라서 MMX 코드를 사용한 후에는 프로그래머가 반드시 `emms
` 명령어(C 언어에서는 `_mm_empty()
` 함수)를 호출하여 x87 레지스터 파일의 상태를 정상으로 복원해야 한다.일부 운영체제에서는 x87 명령어의 사용 빈도가 줄었지만, `pow()` 함수와 같이 높은 정밀도가 요구되는 계산에서는 여전히 사용될 수 있다. 만약 MMX 사용 후 `emms` 명령어로 상태를 복원하지 않으면, 부동소수점 상태가 손상될 수 있다. 이러한 손상된 상태는 즉시 문제를 일으키지 않고 수백만 개의 명령어가 실행된 후에야 부동소수점 연산 루틴이 실패하여 NaN(Not a Number) 값을 반환하는 등의 오류로 나타날 수 있다. 이 문제는 MMX 코드 자체에서는 명확하게 드러나지 않기 때문에 버그를 찾아 수정하는 데 매우 오랜 시간이 걸릴 수 있다.
SSE2는 이러한 MMX와 x87 간의 별칭 문제가 없다. 또한 일반적으로 MMX보다 훨씬 더 나은 처리량을 제공하며, 특히 64비트 환경에서는 더 많은 레지스터를 활용할 수 있다는 장점이 있다. 이러한 이유로 현재 대부분의 벡터화 작업에서는 MMX 대신 SSE2가 선호된다.
5. 컴파일러 지원
2000년 SSE2가 처음 소개되었을 당시에는 소프트웨어 개발 도구들의 지원이 부족하여 개발자가 직접 인라인 어셈블리를 작성하는 등의 노력이 필요했다.[1] 시간이 지나면서 주요 컴파일러들이 SSE2 명령어 자동 생성 및 최적화 기능을 지원하게 되었고, 이는 개발 생산성 향상에 기여했다.[1][2][3]
5. 1. 주요 컴파일러 지원 현황
2000년 SSE2가 처음 도입되었을 때, 소프트웨어 개발 도구들은 이를 제대로 지원하지 않았다. 예를 들어, 마이크로소프트 비주얼 스튜디오(Microsoft Visual Studio) 프로젝트에서 SSE2를 사용하려면 프로그래머가 직접 인라인 어셈블리를 작성하거나 외부 소스에서 객체 코드를 가져와야 했다. 이후 비주얼 C++ 프로세서 팩을 통해 비주얼 C++(Visual C++)와 MASM에 SSE2 지원이 추가되었다. 마이크로소프트 비주얼 C++(Microsoft Visual C++) 2012 버전부터는 SSE2 명령어를 생성하는 컴파일러 옵션이 기본적으로 활성화되었다.인텔 C++ 컴파일러(Intel C++ Compiler)는 수동으로 어셈블리어를 작성하지 않아도 자동으로 SSE4, SSSE3, SSE3, SSE2 및 SSE 코드를 생성할 수 있다. 이를 통해 프로그래머는 어셈블리 수준의 구현 고민 대신 알고리즘 개발에 더 집중할 수 있게 되었다.
GCC는 버전 3부터 대상 아키텍처가 해당 명령어를 지원할 경우 SSE/SSE2 스칼라 코드를 자동으로 생성하기 시작했다. SSE/SSE2에 대한 자동 벡터화 기능은 GCC 버전 4부터 추가되었다.
선 스튜디오 컴파일러 스위트(Sun Studio Compiler Suite) 또한 컴파일러 플래그 `-xvector=simd`를 사용하면 SSE2 명령어를 생성할 수 있다.
6. SSE2 지원 CPU
SSE2는 IA-32 아키텍처의 확장 명령어 세트로, 주로 게임과 같은 실시간 그래픽 처리 성능 향상을 위해 도입되었다. 모든 x86-64 CPU는 기본적으로 SSE2를 지원하며, AMD64 아키텍처 역시 호환 모드에서 SSE2를 포함한다.[1][2] 또한, SSE2는 Windows 8[3] 및 Microsoft Office 2013 이후 버전 설치에 필수적인 요구 사항이 되었다.[4]
다양한 CPU 제조사의 제품들이 SSE2를 지원한다. 인텔의 경우 넷버스트 아키텍처 기반 CPU(펜티엄 4, 제온 등)를 시작으로 펜티엄 M, 인텔 코어, 인텔 코어 2, 아톰 시리즈 등이 대표적이며, AMD는 K8 아키텍처 기반 CPU(애슬론 64, 샘프론 64 등)부터 SSE2를 지원했다. 이 외에도 트랜스메타의 Efficeon, 비아(VIA)의 C7 및 Nano CPU 등도 SSE2를 지원한다.
하지만 일부 IA-32 CPU는 SSE2 기술이 개발된 이후에 출시되었음에도 이를 지원하지 않았다. 대표적으로 AMD의 애슬론 64 이전 모델(애슬론 XP 등)과 VIA의 C3, 트랜스메타의 크루소, 인텔 쿼크 등이 있다. 참고로 인텔의 펜티엄 4 이전 CPU들은 SSE2 개발 이전에 출시되었기 때문에 이를 지원하지 않는다.
6. 1. SSE2 지원 CPU 목록
SSE2는 IA-32 아키텍처의 확장으로, x86 명령어 집합을 기반으로 한다. 따라서 x86 프로세서만 SSE2를 포함할 수 있다. AMD64 아키텍처는 호환 모드로서 IA-32를 지원하며, 해당 사양에 SSE2를 포함한다.[1][2] 또한, XMM 레지스터의 수를 두 배로 늘려 성능을 향상시킨다. SSE2는 Windows 8[3] (및 이후 버전) 또는 Microsoft Office 2013 (및 이후 버전) 설치에 필요하며, 이는 "Windows 8에서 실행되는 타사 앱 및 드라이버의 신뢰성을 향상시키기 위해" 요구된다.[4]다음은 SSE2를 지원하는 주요 CPU 목록이다.
반면, 다음 IA-32 CPU들은 SSE2가 개발된 이후에 출시되었지만 이를 지원하지 않는다.
6. 2. SSE2 미지원 CPU 목록
SSE2는 IA-32 아키텍처의 확장 기능으로 개발되었다. 모든 x86-64 CPU는 기본적으로 SSE2를 지원하며[1][2], AMD64 아키텍처 역시 호환 모드에서 SSE2를 포함한다.하지만 일부 IA-32 기반 CPU는 SSE2가 개발된 이후에 출시되었음에도 불구하고 이를 지원하지 않았다. 대표적인 미지원 CPU는 다음과 같다.
참고로, 인텔의 펜티엄 4 이전 CPU들도 SSE2를 지원하지 않지만, 이는 SSE2 기술이 개발되기 이전에 출시된 모델들이다.
참조
[1]
웹사이트
System V Application Binary Interface - AMD64 Architecture Processor Supplement - Draft Version 0.99.4
https://www.cs.washi[...]
2010-01
[2]
웹사이트
Optimizing software in C++: An optimization guide for Windows, Linux and Mac platforms
http://www.agner.org[...]
2013-04-26
[3]
웹사이트
DirectXMath Programming Guide/Library Internals
https://docs.microso[...]
2019-07-02
[4]
웹사이트
What is PAE, NX, and SSE2 and why does my PC need to support them to run Windows 8 ?
http://windows.micro[...]
2013-03-19
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com