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

История 

През втората половина на 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-битовите числа. В таблицата по-долу са посочени максималните и минималните стойности на различните видове числа със знак.

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

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

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 Pro, 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 програмиране 

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