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 архитектурата:
Въпреки че от програмна гледна точка, MMX регистрите изглеждат независими от останалите регистри, в действителност те са разположени върху съответнитеx87 регистри с имена ST0-ST7. Това означава, че винаги когато съдържанието на някой от MMX регистрите бъде променено, то се променя и съдържанието на съответния x87 регистър.
Нещо повече – MMX инструкциите и x87 инструкциите не могат да бъдат смесвани свободно. MMX инструкция може да бъде изпълнена по всяко време, но след това не може да бъдат изпълнявани x87 инструкции преди да бъде изпълнена специалната инструкция EMMS, която унищожава съдържанието на всички x87 регистри (както и на MMX регистрите). EMMS е доста бавна инструкция, така че честото редуване на x87 и MMX инструкции не е добра идея.
За разлика от x87 регистрите, MMX регистрите не са организирани встек и достъпът до тях е произволен, подобно на регистрите с общо предназначение в x86 процесорите.
Във всеки от MMX регистрите може да се намира един от следните типове данни:
Трябва да се има предвид, че операциите върху първия тип данни (64-битово цяло число) са ограничени и дори не включват събиране и изваждане. Това се дължи на факта, че от Intel не мислят, че 64-битовите числа са от голяма полза при мултимедийните програми.
Въпреки че всички типове данни се пакетират в 64-битовия MMX регистър, при операциите върху тях, всяко от числата се обработва независимо от останалите числа в същия регистър.
MMX инструкциите са 57 на брой и повечето от тях започват с буквата P (от packed). Повечето MMX инструкции имат по 2 операнда, като първия служи едновременно за един от източниците и за буфер, в който се записва резултатът от операцията (подобно на болшинството x86 инструкции). С изключение на инструкциите за побитово изместване, MMX инструкциите не позволяват задаването нанепосредствени операнди, но позволяват използването на операнди от паметта. Методите на адресация при достъп до операндите от паметта са същите като при обикновените x86 инструкции.
Поради едновременната обработка на няколко числа, както и поради специфичните изисквания на мултимедийните приложения, при MMX операциите не се използват стандартните способи за препълване в x86 архитектурата. Вместо това, препълването може да бъде третирано по три начина (кой от тези начини се използва зависи от конкретната инструкция):
Тип данни | Максимална стойност | Минимална стойност | ||
---|---|---|---|---|
Шестнадесетична | Десетична | Шестнадесетична | Десетична | |
8-битово число със знак | 7FH | 127 | 80H | -128 |
16-битово число със знак | 7FFFH | 32767 | 8000H | -32768 |
Тип данни | Максимална стойност | Минимална стойност | ||
---|---|---|---|---|
Шестнадесетична | Десетична | Шестнадесетична | Десетична | |
8-битово число без знак | FFH | 255 | 00H | 0 |
16-битово число без знак | FFFFH | 65535 | 0000H | 0 |
Знаковото и беззнаковото насищане са особено полезни при обработката на звук и графични изображения. В тези случаи обработваните числа са дискретните стойности на звука или някои от цветовите канали на изображението. Ако не се използва насищане, а превъртане, в тези случаи, може да се стигне до нежелани последици, като например при увеличаване на яркостта на дадено изображение, най-светлите участъци да станат черни и обратно.
MMX инструкциите могат да се разделят на следните групи:
Както се вижда, MMX инструкциите не са универсални, а са проектирани за ускоряване на изпълнението на определени задачи (най-вече обработка на звук, видео и графични изображения).
В самия дизайн на MMX има някои проблеми, които донякъде възпрепятстват ефективната им употреба.
Всяка операционна система свремеделене (каквито са повечето съвременни операционни системи) трябва да съхрани съдържанието на всички регистри преди процесорът да превключи към изпълнението на другпроцес. За да не се налагат промени в съществуващите операционни системи, Intel взе решение MMX регистрите да са разположени върху съществуващите x87 регистри за работа с числа с плаваща запетая. Целта е постигната, но цената се оказва висока. Съвпадането на двете групи регистри не позволява да се използват едновременно MMX и x87 инструкции, а бавното превключване между двата режима допълнително влошава нещата.
В крайна сметка решението на Intel се оказа грешно, тъй като не е чак толкова трудно да бъдат променени съществуващите операционни системи, а MMX не могат да бъдат променени, защото това ще нарушиобратната съвместимост, която е един от основните принципи на всяка процесорна архитектура.
Втори проблем е поддръжката само на цели числа. В набиращата популярност 3D графика, дори при въвеждането на MMX, вече се използваха предимно числа с плаваща запетая. По принцип е възможно да се използват x87 инструкциите за работа с плаваща запетая и MMX инструкциите за целочислени изчисления, но гореспоменатият проблем с бавното превключване между двата вида инструкции значително намалява ползата от използването на MMX в този случай.
И накрая, MMX инструкциите дълго време можеха да бъдат използвани само наасемблер. Поддръжката в програмните езици от високо ниво бе ограничена, главно поради тясната специализация на самите MMX инструкции.
Както вече бе споменато, MMX инструкциите се използват най-вече в програми за обработка на цифрови звукови записи, изображения или видео потоци. Освен това те успешно могат да бъдат използвани за всякакви задачи, изискващи матрични математически операции с цели числа (напримерDSP – цифрова обработка на сигнали).
Интересна особеност на някои съвременни x86 процесори е, че MMX блоковете и блоковете за3DNow! илиSSE операции могат да работят паралелно. Това дава възможност за допълнително ускорение на програмния код, ако той използва едновременно два SIMD набора от инструкции. На практика това се постига трудно и е от полза само в някои специализирани приложения (напр. филтри за видеообработка).
MMX инструкциите се поддържат от следните процесори: