MMX (명령어 집합)

섬네일|펜티엄 MMX 프로세서
**MMX**는 인텔이 설계한 SIMD 명령어 집합으로, 1997년 1월 8일 펜티엄 P5 (마이크로아키텍처) 기반의 "MMX 기술을 탑재한 펜티엄"이라는 마이크로프로세서 라인에 도입되었다. 이 기술은 인텔 i860에 도입된 유사한 장치와 그 이전의 인텔 i750 비디오 픽셀 프로세서에서 발전되었다. MMX는 1997년 현재 인텔 및 다른 벤더의 IA-32 프로세서에서 지원되는 프로세서 보조 기능이다. AMD는 또한 K6 프로세서에 MMX 명령어 집합을 추가했다.

뉴욕 타임스는 슈퍼볼 광고를 포함한 초기 추진이 "비디오폰 및 3D 비디오 게임을 포함한 차세대 화려한 멀티미디어 제품"에 중점을 두었다고 설명했다.

MMX는 이후 인텔 및 다른 회사들의 여러 프로그램에 의해 확장되었다. 즉, 3D나우!, 스트리밍 SIMD 확장 (SSE), 그리고 고급 벡터 확장 (AVX)의 지속적인 개정판이다.

## 개요
### 명명법
MMX는 공식적으로는 의미 없는 두문자어이며 인텔에 의해 상표 등록되었다. 비공식적으로는 이 두문자어가 다음과 같이 다양하게 설명되었다.
* MultiMedia eXtension, 또는
* Matrix Math eXtension.

AMD는 인텔과의 수많은 법정 싸움 중 하나에서 MMX가 "Matrix Math Extensions"를 의미한다는 인텔의 마케팅 자료를 제시했다. 두문자어는 상표 등록될 수 없기 때문에, 이는 인텔의 상표를 무효화하려는 시도였다. 1995년 인텔은 AMD와 사이릭스(Cyrix Corp.)를 상대로 MMX 상표의 오용에 대해 소송을 제기했다. AMD와 인텔은 합의했고, AMD는 MMX를 인텔 소유의 상표로 인정하고, 인텔은 AMD에게 MMX 상표를 기술 이름으로는 사용할 수 있지만 프로세서 이름으로는 사용할 수 없도록 권리를 부여했다.

### 기술적 세부 사항
섬네일|MMX 기술이 적용된 펜티엄 II 프로세서
MMX는 MM0부터 MM7까지 8개의 프로세서 레지스터와 그 레지스터에서 작동하는 연산을 정의한다. 각 레지스터는 64비트 너비이며 64비트 정수 또는 "팩된" 형식의 여러 작은 정수를 저장하는 데 사용할 수 있다. 이 경우 하나의 명령으로 두 개의 32비트 정수, 네 개의 16비트 정수 또는 여덟 개의 8비트 정수에 동시에 적용할 수 있다.

MMX는 정수 연산만 제공한다. 인텔 i860용으로 처음 개발되었을 때 정수 연산을 사용하는 것이 합리적이었지만(2D 및 3D 계산 모두 필요했기 때문), 이러한 연산을 많이 수행하는 그래픽 카드가 보편화되면서 CPU의 정수 SIMD는 그래픽 응용 프로그램에는 다소 불필요해졌다. 또는 MMX의 포화 산술 연산은 일부 디지털 신호 처리 응용 프로그램의 속도를 크게 높일 수 있었다.

기존 운영 체제의 문맥 교환 메커니즘과의 호환성 문제를 피하기 위해 MMX 레지스터는 기존 X87 부동소수점 장치 (FPU) 레지스터의 별칭이다. 이는 문맥 교환이 이미 저장하고 복원하는 대상이다. 스택처럼 동작하는 x87 레지스터와 달리 MMX 레지스터는 각각 직접 주소 지정이 가능하다(임의 접근).

부동소수점 스택과 관련된 모든 연산은 MMX 레지스터에도 영향을 미칠 수 있으며 그 반대도 마찬가지이므로, 이러한 별칭 지정으로 인해 동일한 프로그램에서 부동소수점 및 SIMD 연산을 함께 사용하기가 어렵다. 성능을 극대화하기 위해 소프트웨어는 종종 프로세서를 한 모드에서만 독점적으로 사용했으며, 상대적으로 느린 모드 간 전환은 가능한 한 오랫동안 미루었다.

각 64비트 MMX 레지스터는 80비트 x87 레지스터의 가수 부분에 해당한다. 따라서 x87 레지스터의 상위 16비트는 MMX에서 사용되지 않으며, 이 비트들은 모두 1로 설정되어 부동소수점 표현에서 NaN (숫자 아님) 데이터 형식 또는 무한대가 된다. 소프트웨어는 이를 사용하여 주어진 레지스터의 내용이 부동소수점 데이터인지 SIMD 데이터인지 결정할 수 있다.

### 소프트웨어 지원
MMX에 대한 소프트웨어 지원은 느리게 발전했다. 인텔의 C 컴파일러 및 관련 개발 도구는 MMX 명령어를 호출하기 위한 내장 함수를 얻었고, 인텔은 MMX를 사용하는 일반적인 벡터화된 알고리즘의 라이브러리를 출시했다. 인텔과 메트로웍스 모두 컴파일러에서 자동 벡터화를 시도했지만, C 프로그래밍 언어의 연산이 MMX 명령어 집합에 제대로 매핑되지 않아 2000년 현재에도 맞춤형 알고리즘은 일반적으로 어셈블리어로 작성해야 했다.

## 후속 기술
경쟁 X86 마이크로프로세서 벤더인 AMD는 인텔의 MMX를 자체 3D나우! 명령어 집합으로 강화했다. 3D나우!는 다른 정수 및 더 일반적인 개선 사항 외에도 SIMD 명령어 집합에 단정밀도 (32비트) 부동소수점 지원을 추가한 것으로 가장 잘 알려져 있다.

MMX에 이어 인텔의 다음 주요 X86 확장은 스트리밍 SIMD 확장 (SSE)으로, 1999년 펜티엄 III 계열에 도입되었는데, 이는 AMD의 3D나우!가 도입된 지 약 1년 후였다.

SSE는 새로운 128비트 너비의 레지스터 파일(XMM0-XMM7)과 이를 위한 새로운 SIMD 명령어를 생성함으로써 MMX의 핵심 단점(정수-SIMD 연산을 부동소수점 연산과 혼합할 수 없음)을 해결했다. 3D나우!와 마찬가지로 SSE는 단정밀도 부동소수점 연산(32비트)에만 중점을 두었고, 정수 SIMD 연산은 여전히 MMX 레지스터와 명령어 집합을 사용하여 수행되었다. 그러나 새로운 XMM 레지스터 파일은 SSE SIMD-연산을 MMX 또는 x87 FPU 연산과 자유롭게 혼합할 수 있도록 했다.

펜티엄 4와 함께 도입된 SSE2는 XMM 레지스터 파일에 정수(8/16/32비트) 및 배정밀도 부동소수점 데이터 지원을 추가하여 x86 SIMD 명령어 집합을 더욱 확장했다. SSE2는 또한 MMX 명령 코드 (opcodes)가 XMM 레지스터 피연산자를 사용하도록 허용했으며, 이후 SSE 개정판에 의해 YMM 및 ZMM 레지스터로 더욱 확장되었다.

## 임베디드 응용 분야의 MMX
인텔과 마벨 테크놀로지 그룹의 XScale 마이크로프로세서 코어는 PXA270부터 ARM 아키텍처 코어에 SIMD 명령어 집합 확장인 인텔 무선 MMX 기술(iwMMXt)을 포함하는데, 이는 IA-32 MMX 확장과 유사한 기능을 수행한다. 이 기술은 64비트 정수에 대한 산술 및 논리 연산을 제공하며, 소프트웨어는 대신 하나의 명령어에서 두 개의 32비트, 네 개의 16비트 또는 여덟 개의 8비트 연산을 수행하도록 선택할 수 있다. 이 확장에는 64비트 데이터 레지스터 16개와 32비트 제어 레지스터 8개가 포함되어 있다. 모든 레지스터는 표준 ARM 아키텍처 코프로세서 매핑 메커니즘을 통해 접근된다. iwMMXt는 코프로세서 0 및 1 공간을 차지하며, 일부 명령 코드는 이전 부동소수점 확장인 FPA의 명령 코드와 충돌한다.

마벨의 ARM 프로세서 이후 버전은 무선 MMX(WMMX) 및 무선 MMX2(WMMX2) 명령 코드를 모두 지원한다.

## 같이 보기
* 확장 MMX
* AltiVec - PowerPC 아키텍처의 동등한 기술

## 각주

## 외부 링크
* 인텔 내장 함수 가이드
* MMX 기술 문서가 포함된 인텔 펜티엄 프로세서
* IA 소프트웨어 개발자 매뉴얼, 볼륨 1 (PDF), MMX 프로그래밍은 8장 참조

분류:X86 명령어
분류:SIMD 컴퓨팅