# MMX

### от Уикипедия, свободната енциклопедия

MMX означава Matrix Math Extensions (разширения за математически матрици), но понякога съкращението се дешифрира и като Multi-Media Extensions (мултимедийни разширения). MMX са специални SIMD целочислени инструкции, които са част от x86 процесорната архитектура.

## [редактиране] История

Процесор Intel Pentium MMX

През втората половина на 90-те години на 20-и век, зараждащия се пазар за компютърни игри и мултимедийни програми се развива бързо и от Intel се надяват техните процесори да останат най-важния компонент в мултимейния компютър.

Поради липсата на специализирани 3D ускорители, всички изчисления, необходими за набиращата популярност 3D графика се извършват в процесора. Най-интензивните изчисления, които се използват за мултимедийните програми, са вектортите и матричните операции. Тези операции се изпълняват сравнително бавно на нормалните SISD процесори и Intel решава да добави специализиран модул за векторни (SIMD) операции към техния популярен процесор Pentium. На дадения етап повечето мултимедийни приложения използват цели числа, тъй като скоростта е по-важна от точността. По това време векторните процесори не са новост, но те се използват единствено в скъпоструващи суперкомпютри и специализирани процесори.

MMX инструкциите са въведени с пускането на процесора Pentium MMX от Intel през 1997. Те са базирани на подобни инструкции за векторни изчисления, разработени от Intel за техния RISC процесор i860.

MMX инструкциите са включени във всички следващи x86 процесори както на Intel, така и на другите производители.

Скоро след излизането на MMX, компанията Cyrix добави към тях няколко нови инструкции (наречени EMMX инструкции), които позволяват резултата от операцията да не се записва върху един от двата операнда, а в трети MMX регистър. Тези разширения останаха специфични за процесорите на Cyrix.

При пускането на пазара на процесора Athlon през 1999, AMD въвежда допълнителни MMX инструкции, които включват допълнителни инструкции за контрол на кеш паметта, инструкции за конвертиране на данни и инструкции за трасфер на данни. Също като инструкциите на Cyrix, тези инструкции не получиха поддръжка от страна на Intel, въпреки че има подобни инструкции в набора SSE.

## [редактиране] Наименование

Официалната позиция на Intel е, че MMX е безмислена буквена комбинация. Според слуховете, MMX означава MultiMedia eXtensions (Мултимедийни разширения) или Matrix Math eXtensions (Разширения за математически матрици), но от Intel дълго време отричаха това. В последствие AMD, по време на една от многобройните си съдебни битки с Intel, изнамери вътрешен маркетингов материал от Intel, според който MMX означава Matrix Math Extensions. Идеята, че MMX не означава нищо се оказва опит на Intel да потвърди, че съкращението е тяхна запазена марка, с което да се попречи на AMD и другите си конкуренти да използват съкращението MMX в техните маркетингови материали.

## [редактиране] Технология

MMX инструкциите добавят следните разширения към x86 архитектурата:

- 8 64-битови MMX регистъра с имена MM0-MM7
- 4 MMX типа данни
- 57 MMX инструкции

### [редактиране] MMX регистри

Въпреки че от програмна гледна точка, MMX регистрите изглеждат независими от останалите регистри, в действителност те са разположени върху съответните x87 регистри с имена ST0-ST7. Това означава, че винаги когато съдържанието на някой от MMX регистрите бъде променено, то се променя и съдържанието на съответния x87 регистър.

Нещо повече - MMX инструкциите и x87 инструкциите не могат да бъдат смесвани свободно. MMX инструкция може да бъде изпълнена по всяко време, но след това не може да бъдат изпълнявани x87 инструкции преди да бъде изпълнена специалната инструкция EMMS, която унищожава съдържанието на всички x87 регистри (както и на MMX регистрите). EMMS е доста бавна инструкция, така че честото редуване на x87 и MMX инструкции не е добра идея.

За разлика от x87 регистрите, MMX регистрите не са организирани в стек и достъпа до тях е произволен, подобно на регистрите с общо предназначение в x86 процесорите.

### [редактиране] MMX типове данни

Във всеки от MMX регистрите може да се намира един от следните типове данни:

- 1 64-битово цяло число
- 2 32-битови цели числа
- 4 16-битови цели числа
- 8 8-битови цели числа

Трябва да се има в предвид, че операциите върху първия тип данни (64-битово цяло число) са ограничени и дори не включат събиране и изваждане. Това се дължи на факта, че от Intel не мислят, че 64-битовите числа са от голяма полза при мултимедийните програми.

Въпреки, че всички типове данни се пакетират в 64-битовия MMX регистър, при операциите върху тях, всяко от числата се обработва независимо от останалите числа в същия регистър.

### [редактиране] MMX инструкции

MMX инструкциите са 57 на брой и повечето от тях започват с буквата P (от packed). Повечето MMX инструкции имат по 2 операнда, като първия служи едновременно за един от източниците и за буфер, в който се записва резултата от операцията (подобно на болшинството x86 инструкции). С изключение на инстрикциите за побитово изместване, MMX инструкциите не позволяват задаването на непосредствени операнди, но позволяват използването на операнди от паметта. Методите на адресация при достъп до операндите от паметта са същите като при обикновенните x86 инструкции.

Поради едновременната обработка на няколко числа, както и поради специфичните изисквания на мултимедийните приложения, при MMX операциите не се използват стандартните способи за препълване в x86 архитектурата. Вместо това, препълването може да бъде третирано по три начина (кой от тези начини се използва зависи от конкретната инструкция):

- Превъртане (wraparound). В този случай преносът се игнорира напълно. Например ако 8-битовото число 255 се събере с превъртане с 8-битовото число 2, резултатът ще бъде 1, като преносът към 9-ия разред се игнорира. Това е единствения възможен начин на препълване при 32-битовите числа.

- Знаково насищане (signed saturation). В този случай преносът също се игнорира, но при препълване числото не се "превърта", а се задава максималната или минималната стойност със знак. Така например, ако към 8-битовото число със знак 127 бъде добавено 8-битовото число със знак 2, резултатът ще е 127, защото това е максималната стойност на 8-битовите числа със знак. Този начин на препълване е възможен само за 8- и 16-битовите числа. В таблицата по-долу са посочени максималните и минималните стойности на различните видове числа със знак.

Тип данни | Максимална стойност | Минимална стойност
--- | --- | ---
Шестнадесетична | Десетична | Шестнадесетична | Десетична
8-битово число със знак | 7FH | 127 | 80H | -128
16-битово число със знак | 7FFFH | 32767 | 8000H | -32768

- Беззнаково насищане (unsigned saturation). Подобено на знаковото насищане, но числата са без знак и това се отразява на максималните и минималните стойности. Така например, ако към 8-битовото число без знак 255 бъде добавено 8-битовото число без знак 2, резултатът ще е 255, защото това е максималната стойност на 8-битовите числа без знак. Този начин на препълване е възможен само за 8- и 16-битовите числа. В таблицата по-долу са посочени максималните и минималните стойности на различните видове числа без знак.

Тип данни | Максимална стойност | Минимална стойност
--- | --- | ---
Шестнадесетична | Десетична | Шестнадесетична | Десетична
8-битово число без знак | FFH | 255 | 00H | 0
16-битово число без знак | FFFFH | 65535 | 0000H | 0

Знаковото и беззнаковото насищане са особенно полезни при обработката на звук и графични изображения. В тези случаи, обработваните числа са дискретните стойности на звука или някои от цветовите канали на изображението. Ако не се използва насищане, а превъртане в тези случаи, може да се стигне до нежелани последици, като например при увеличаване на яркостта на дадено изображение, най-светлите участъци да станат черни и обратно.

MMX инструкциите могат да се разделят на следните групи:

- Аритметични инструкции. Включват инструкции за събиране, изваждане, умножение и умножение, комбинирано със събиране.

- Инструкции за сравнение. Включват инструкции за проверка на равенство (дали всички пакетирани числа в двата операнда са радни) и иструкции за проверка за по-голямо (дали всички пакетирани числа в единия операнд са по-големи от всчики пакетирани числа в другия операнд).

- Инструкции за преобразуване. Включват инструкции за преобразуване на всеки две пакетирани 8-битови числа в 16-битови, 16-битовите в 32-битови и 32-битовите в 64-битово число, както и инструкции за обратно преобразуване.

- Логически инструкции. Изпълняват стандартните побитови логически операции върху цялото 64-битово съдъжание на MMX операндите.

- Инструкции за побитово изместване. Изпълняват побитово изместване върху цялото съдържание на MMX операндите.

- Инструкции за трансфер на данни. MOV инструкции за прехвърляне на данни във и от MMX регистрите.

- EMMS инструкция за изчистване на съдържанието на MMX регистрите, за да е възможно изпълнението на x87 инструкции.

Както се вижда, MMX инструкциите не са универсални, а са проектирани за ускоряване на изпълнението на определени задачи (най-вече обработка на звук, видео и графични изображения).

## [редактиране] Проблеми

В самия дизайн на MMX има някои проблеми, които донякъде възпрепятстват ефективната им употреба.

Всяка операционна система с времеделене (каквито са повечето съвременни операционни системи) трябва да съхрани съдържанието на всички регистри преди процесора да превключи към изълнението на друг процес. За да не се налагат промени в съществуващите операционни системи, Intel взе решение MMX регистрите да са разположени върху съществуващите x87 регистри за работа с числа с плаваща запетая. Целта е постигната, но цената се оказва висока. Съвпадането на двете групи регистри не позволява да се използват едновременно MMX и x87 инструкции, а бавното превключване между двата режима допълнително влошава нещата.

В крайта сметка решението на Intel се оказа грешно, тъй като не е чак толкова трудно да бъдат променени съществуващите операционни системи, а MMX не могат да бъдат променени, защото това ще наруши обратната съвместимост, която е един от основните принципи на всяка процесорна архитектура.

Втори проблем е поддръжката само на цели числа. В набиращата популярност 3D графика, дори в момента на въвеждането на MMX, вече се използваха предимно числа с плаваща запетая. По принцип е възможно да се използват x87 инструкциите за работа с плаваща запетая и MMX инструкциите за целочислени изчисления, но гореспоменатия проблем с бавното превключване между двата вида инструкции значително намалява ползвата от използването на MMX в този случай.

И накрая, MMX инструкциите дълго време можеха да бъдат използвани само на асемблер. Поддръжката в програмните езици от високо ниво бе ограничена, главно поради тясната специализация на самите MMX инструкции.

## [редактиране] Приложения

Както вече бе споменато, MMX инструкциите се използват най-вече в програми за обработка на цифрови звукови записи, изображения или видео потоци. Освен това те успешно могат да бъдат използвани за всякакви задачи, изискващи матрична математически операции с цели числа (например DSP - цифрова обработка на сигнали).

Интересна особеност на някои съвременни x86 процесори е, че MMX блоковете и блоковете за 3DNow! или SSE операции могат да работят паралелно. Това дава възможност за допълнително ускорение на програмния код, ако той използва едновременно два SIMD набора от инструкции. На практика това се постига трудно и е от полза само в някои специализирани приложения (напр. филтри за видеообработка).

## [редактиране] Процесори, които поддържат MMX

MMX инструкциите се поддръжат от следните процесори:

- Произведени от Intel: Pentium MMX, Pentium II, Pentium III, Pentium 4, Celeron, Pentium D, Pentium M, Core.

- Произведени от AMD: K6, K6-2, K6-III, Athlon, Duron, Athlon XP, Sempron, Athlon 64, Athlon FX.

- Произведени от VIA: C3

## [редактиране] Виж също

- AltiVec — друг набор от SIMD инструкции на процесорите PowerPC G4 и G5
- 3DNow! — разширения на MMX за работа с числа с плаваща запетая от AMD.
- SSE

## [редактиране] Външни връзки

- Набор от MMX инструкции от Изкуството на асемблерния език (на английски език)
- Ръководство за софтуерния разработчик за архитектурата IA-32, том 1 (PDF), виж глава 8 за MMX програмиране (на английски език)

Взето от „http://bg.wikipedia.org../../../m/m/x/MMX_54cc.html“.

Категории: Процесорна архитектура x86

##### Views

- Статия
- Беседа
- Текуща версия

##### Търсене

##### На други езици

- Česky
- Deutsch
- English
- Español
- Français
- Galego
- Italiano
- 日本語
- Nederlands
- Polski
- Português
- Svenska
- 中文