Multi Media Extension

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche
Intel-Prozessor mit MMX

Die Multi Media Extension (kurz MMX) ist eine Anfang 1997 von Intel auf den Markt gebrachte Erweiterung für die IA-32-Prozessorarchitektur, die es erlaubt, größere Datenmengen parallelisiert und somit schneller zu verarbeiten. Die Parallelisierbarkeit wird dabei durch die SIMD-Architektur von MMX erreicht, bei der Befehle stets auf mehrere Daten gleichzeitig angewendet werden, was insbesondere bei der Verarbeitung von Audio- und Videodaten einen Leistungsvorteil mit sich bringt. Ursprünglich stand das Kürzel MMX für Matrix Math Extensions, wurde allerdings von Intel marketingbedingt in Multi Media Extension umbenannt.[1]

MMX verwendet keine neuen physischen Prozessorregister, sondern funktioniert die Register des mathematischen Koprozessors (FPU) um. Intel entwarf für MMX 57 neue Prozessor-Befehle und führte vier neue Datenformate ein. Ein Hauptvorteil von MMX gegenüber herkömmlichen Berechnungsmethoden ist die Unterstützung von Sättigungsarithmetik.

MMX wurde nach seiner Einführung von der Softwareindustrie nur zögerlich unterstützt und war schon nach drei Jahren durch Intels eigene Fortentwicklungen SSE und AMDs 3DNow! überholt. Benchmarks zu seiner Performance wiesen eine große Bandbreite auf.

Anforderungen von Multimediaanwendungen[Bearbeiten]

Die Anforderungen des Multimedia- und Kommunikationsbereiches stellen an ein Computersystem und damit den Prozessor teilweise andere und neue Anforderungen. Die zu verarbeitenden Daten sind meist hochgradig parallelisierbar.[2] So sind z. B. bei einem Videoschnitt die Operationen für die vielen einzelnen Bildpunkte identisch. Theoretisch optimal wäre hier die Ausführung mittels eines einzigen auf alle Punkte anzuwendenden Befehles. Die erforderliche Operationen sind häufig keine einfachen, einzelnen Anweisungen, sondern eher umfangreichere Befehlsketten. Das Einblenden eines Bildes vor einem Hintergrund ist beispielsweise ein komplexer Vorgang aus Maskenbildung mittels XOR, Vorbereitung des Hintergrundes mittels AND und NOT sowie der Überlagerung der Teilbilder durch OR. Diesen Anforderungen wird durch die Bereitstellung neuer komplexer Befehle entsprochen. So vereinigt z. B. der MMX-Befehl PANDN eine Invertierung und Und-Verknüpfung der Form x = y AND (NOT x).

Realisierung[Bearbeiten]

Die vier neuen Datenformate von MMX

Intel schuf mit MMX ein neues Konzept zur Verwendung bereits existierender Register, neue Datenformate, einen erweiterten Befehlssatz und die Wahl zwischen verschiedenen arithmetischen Möglichkeiten (Saturation-Mode und Wrap-around-Mode). Kleinere interne, nicht den Befehlsumfang betreffende Unterschiede bestehen zwischen den (nicht offiziell so benannten) Versionen MMX 1.0 und 2.0 der verschiedenen Pentium-Prozessoren. Noch wesentlich weiter entwickelt findet sich der MMX-Ansatz in den ASICs (wo er ursprünglich herkommt) sowie in den AltiVec-Einheiten von modernen PowerPC-CPUs – oder auf Grafikkarten.

Neue Datenformate[Bearbeiten]

Es wurden für MMX vier neue Datenformate: PackedByte, PackedWord, PackedDoubleWord, und QuadWord geschaffen, mit denen es möglich ist, bis zu 64 Bit große Integer-Datenpakete auf einmal zu bearbeiten.[3] Diese Formate sind im Prinzip nur andere Bezeichnungen für präexistierende Formate. Die neue Nomenklatur zeigt an, dass mit MMX nicht einzelne Daten bzw. Zahlen, sondern Datenfelder bearbeitet werden. Im Prinzip ist ein QuadWord nur ein 64-Bit-Feld, das man auch DoubleLongInt hätte nennen können; ein ShortPackedWord ist eigentlich ein ShortPackedInteger.[4]

Registerverwendung[Bearbeiten]

Verwendung von FPU-Registern durch MMX (hellblau markiert)

Für die Datenmanipulation wurden zusätzliche 64-Bit-Register MM0 bis MM7 geschaffen,[3] die allerdings mit den 80-Bit-Registern R0 bis R7 der FPU physisch identisch sind. Dabei werden von MMX nur je acht Byte der je zehn Byte breiten FPU-Register (also nur der Mantissenbereich von FPU-Werten) genutzt. Die beiden restlichen Bytes werden unter MMX auf den hexadezimalen Wert FFFF gesetzt. Auch die übrigen FPU-Register, wie die 16 Bit breiten Control-, Status- und Tag-Register, das 11 Bit breite Op-Register sowie die beiden 48 Bit breiten Pointer-Register haben bei MMX-Anwendungen keine bzw. eine in seltenen Fällen eingeschränkte oder anders zu interpretierende Bedeutung der hier anfallenden Werte.[5]

Wechsel zwischen FPU und MMX[Bearbeiten]

Vor einem Wechsel zu einer MMX-Anwendung sollte zuerst geprüft werden, ob SIMD-Erweiterungen und speziell MMX vom System unterstützt wird. Dies ist durch den seit dem Pentium vorhandenen Befehl CPUID unter Übergabe des Wertes 1 im Register EAX möglich.[6][7]

 MOV eax, 1            ; Es soll das Feature-Flag abgefragt werden
 CPUID                 ; CPUID-Befehl ausführen
 TEST edx, 00800000h   ; Ist Bit 23 im Register edx gesetzt?
 JNZ MMX_kompatibel    ; Wenn ja, dann ist der Prozessor MMX-kompatibel

Möchte man nach einem positiven Test auf MMX-Fähigkeit dieses nutzen, sollten als Nächstes die FPU-Daten durch den Befehl FXSAVE in einen 512 Byte großen Speicherbereich gesichert werden. Über die beiden von MMX nicht verwendeten Bytes in jedem Register wird eine MMX-Anwendung abgesichert, d. h. einer FPU-Anwendung angezeigt. Ein expliziter Befehl zum Wechsel in eine MMX-Anwendung existiert allerdings nicht. Eventuell auftretenden FPU-Befehlen während einer MMX-Anwendung wird der Status NaN (Not a Number) übersandt. Störende FPU-Befehle bleiben so meist relativ folgenlos.

Nach Beendigung der Anwendung sollten durch FXSTOR die zuvor durch FXSAVE gesicherten FPU-Daten wiederhergestellt werden. Zur Signalisierung einer Freigabe von MMX an anstehende FPU-Anwendungen existiert auch der allerdings nicht zwingend vorgeschriebene und nicht immer notwendige MMX-Befehl EMMS. Dieser kann auch innerhalb einer MMX-Anwendung – wenn z. B. eine MMX-Anwendung eine API aufruft, welche ihrerseits FPU-Befehle verwendet – nötig sein.[8]

Einsatz in Betriebssystemen[Bearbeiten]

In Multitasking-Betriebssystemen müssen bei einem Taskwechsel sämtliche Registerinhalte in einem speziellen Speicherbereich gesichert werden. Da eine Änderung dieses Speicherbereiches von sämtlichen Betriebssystemen hätte unterstützt werden müssen, wurde ein „Trick“ eingesetzt, der MMX auch ohne Betriebssystemunterstützung erlaubt: Es wurden nach außen die MMX-Register auf die acht Gleitkomma-Register der FPU abgebildet. Damit sind die eigentlichen FPU-Register nicht mehr verfügbar, sobald ein Programm MMX benutzt.[6] Neuere Befehlssatz-Erweiterungen wie SSE benutzen komplett eigene Register und benötigen somit zwingend eine Unterstützung des Betriebssystems. Auch lässt sich die Überdeckung der Gleitkommaregister durch die MMX-Register bei neueren Prozessoren abschalten.

Saturation-Mode und Wrap-around-Mode[Bearbeiten]

Der MMX-Befehlsvorrat enthält Befehle, die den Saturation-Mode anwenden und Befehle, die im Wrap-around Mode arbeiten. So führt z. B. der MMX-Befehl PADDB eine Addition zweier Packed-Bytes im Wrap-around-Mode aus, während PADDSB Selbiges im Saturation-Mode macht.

Der Saturation-Mode bedeutet, dass eine Zahl beim Überschreiten ihres größten oder kleinsten Wertes nicht „überläuft“, sondern diesen größten bzw. kleinsten möglichen Wert annimmt.

Beispiel für einen Fade-Out-Effekt

Ein Anwendungsbeispiel: Bei einem Fade-Out-Effekt von Bildern könnte man beispielsweise immer zwei Pixel mit 32 Bit Farbtiefe gleichzeitig um einen gewissen Wert verdunkeln. Durch die Saturation muss man nicht kontrollieren, ob die Pixel bereits schwarz sind (Beispiele: 0 - 2 = 0 oder 5 - 88 = 0). Dadurch und durch die parallele Verarbeitung mehrerer Werte kann die Geschwindigkeit der Berechnungen erheblich gesteigert werden.

Im Wrap-around-Mode wird bei einem Überlauf bzw. Unterlauf der Übertrag nicht berücksichtigt. So ergibt bei einem Maximalwert von einem Byte (dezimal 256) die Addition 255 + 2 das Ergebnis 1. Binär ausgedrückt ergibt 11111111 + 00000010 = (1)00000001, von dem das höchstwertige Bit (hier in Klammern) unberücksichtigt bleibt, was zum Ergebnis 00000001 (also dezimal 1) führt.

Angabe der Operanden[Bearbeiten]

Ein wesentlicher Unterschied zwischen FPU- und MMX-Anwendungen besteht darin, in welcher Form die Befehle ihre Operanden erhalten. Hinter FPU-Befehlen stehen keine expliziten Operanden. Diese holen sich die Befehle über einen Stackpointer (top of the stack) aus den Bits 11 bis 13 des Status-Registers.[9] MMX-Befehle arbeiten dagegen, ebenso wie CPU-Befehle, mit explizit nach dem Befehl angegebenen Operanden.[5]

Ein MMX-Befehl kann keinen, einen oder zwei Quell- und Zieloperanden aufweisen.[10] Dies können MMX-Register (MMX), Allzweckregister (Reg), Speicherstellen (Mem), oder Konstanten (Const) unterschiedlicher Größe (8, 16, 32 oder 64 Bit) sein. Welche Operanden für einen speziellen Befehl zulässig sind, ist unterschiedlich und in Referenzbüchern vermerkt. Eine Angabe wie

Befehl Mem32, MMX
Befehl MMX, Reg32
Befehl Reg32, MMX

würde z. B. besagen, dass die Operation (Befehl) von einem MMX-Register zu einem 32-Bit-Allzweckregister, von einem 32-Bit-Allzweckregister zu einem MMX-Register und umgekehrt möglich ist.

Zeitverhalten[Bearbeiten]

Die meisten MMX-Befehle werden in nur einem Prozessorzyklus verarbeitet. Die Multiplikationsbefehle brauchen drei Zyklen, bis das Ergebnis zur Verfügung steht, es kann aber nach jedem Zyklus eine neue Multiplikation in die Pipeline nachgeschoben werden (Pentium MMX bis Pentium III).

Befehlssatz[Bearbeiten]

Kategorisierung der MMX-Befehle

Insgesamt 24 neue Befehle können mit den verschiedenen Datentypen umgehen, was zu den von Intel angegebenen 57 Befehlen führt. Von diesen 24 Befehlen unterscheiden sich etliche nur durch unterschiedliche Berücksichtigung der Vorzeichen und der Überlaufart, so dass im Prinzip nur 15 Grundoperationen übrigbleiben.

Da MMX mit gepackten Daten arbeitet, beginnen die meisten Befehle – zwecks Unterscheidung von den mit F beginnenden FPU-Instruktionen – mit einem P. MMX-Befehle bestehen außer dem führenden P optional aus den Buchstaben B, W, D oder Q für das Datenformat, einem CPU-ähnlichen Befehlswort (wie z. B. ADD oder CMP) und aus S für vorzeichenbehafteten bzw. US für vorzeichenlosen Saturation-Mode. So besagt z. B. der Befehl PADDSW: P für Packed, ADD für Addition, S für vorzeichenbehafteten Saturation-Mode angewandt auf das Datum eines Words. Der MMX-Befehlssatz umfasst Anweisungen[11] zum:

  • arithmetischen Manipulieren von Daten
  • logischen Manipulieren von Daten
  • Datenaustausch
  • Datenvergleich
  • Datenkonversion
  • MMX-Status

Detailfragen zum Befehlsvorrat sind dem Intel Architecture Software Developer's Manual, Volume 2 – Instruction Set zu entnehmen, siehe im Abschnitt Literatur.

Arithmetische Befehle[Bearbeiten]

Zur Addition im Wrap-around-Mode existieren drei Befehle (PADDB, PADDW, PADDD) für die Datentypen PackedByte, PackedWord, und PackedDoubleWord. Im Saturation-Mode existieren Befehle für die vorzeichenbehaftete (PADDSB, PADDSW) sowie vorzeichenlose (PADDUSB, PADDUSW) Addition von PackedBytes und PackedWords. Ein Befehl für die Addition von DoubleWords ist nicht vorhanden. In beiden Modi wird kein Hinweis auf einen Über- oder Unterlauf des Wertebereichs, z. B. durch Setzen von Flags, gegeben.[12]

Die Befehle zur Subtraktion sind analog zur Addition gestaltet.

Die kombinierte Multiplikations- und Additionsanweisung PMADDWD im Detail

Bei der Multiplikation besteht das Problem, dass die Ergebnisse die Größe der Register von 64-Bit übersteigen können. Dies wurde dadurch gelöst, dass der höherwertige und der niederwertige Anteil des Ergebnisses in zwei verschiedenen Registern gespeichert wird. Für die Multiplikation und die Verwendung des niederwertigen Anteil wird PMULLW (Multiply Packed Word and Store Low) und für den höherwertigen Anteil PMULHW (Multiply Packed Word and Store High) verwandt.[13]

Der Befehl PMADDWD multipliziert vier Paare von 16-Bit-Worten und addiert paarweise die Ergebnisse auf.

Die Befehle zur Verschiebung funktionieren, mit Ausnahme des in MMX dabei nicht gesetzten Carry-Flags, analog zu den Schiebe-Befehlen der CPU wie z. B. SLL, SRL und SRA. Sie sind nur auf Words, DoubleWords und QuadWords, nicht aber auf Bytes, anwendbar. Für das logische Verschieben nach links werden PSLLW und PSLLD und für die umgekehrte Richtung PSRLW und PSRLD angewandt. Für das arithmetische Verschieben stehen PSRAW und PSRAD zur Verfügung, für die logische Verschiebung von QuadWords PSLLQ und PSRLQ.[10]

Logische Operationen[Bearbeiten]

Quell- und Zieloperanden der Befehle zum Datenaustausch

Die Bit-Manipulationsbefehle sind identisch mit den CPU-Befehlen AND, OR und XOR, nur werden von ihnen gleich 64 Bit, also ein QuadWord, auf einmal bearbeitet. Eine MMX-Entsprechung zum CPU-Befehl NOT existiert nicht. Der einzige MMX-Befehl ohne Entsprechung im CPU-Befehlsvorrat ist PANDN, der eine Negation des ersten Operanden mit anschließender AND-Verknüpfung mit dem zweiten Operanden in folgender Form darstellt: x = y AND (NOT x)[14]

Datenaustausch[Bearbeiten]

Dazu existieren analog zum CPU-Befehl MOV die beiden Befehle MOVD und MOVQ für DoubleWords und QuadWords. Bedingt durch die Rechnerarchitektur – also die unterschiedliche Größe von 64-Bit-MMX-Registern, 32-Bit-Allzweckregistern und dem 32-Bit-Adressbus – sind beide Befehle gewissen Beschränkungen in Bezug auf die zulässigen Operanden unterworfen.[15]

MOVD kann nicht zum Datenaustausch zwischen zwei MMX-Registern verwandt werden, da es für MMX-Register nur 64-Bit-Daten gibt. Er ermöglicht also nur den Austausch zwischen einem MMX-Register und 32-Bit-Allzweckregistern und Speicherstellen in beiden Richtungen.[16] Die möglichen Formen sind also:

MOVD MMX, Mem32
MOVD Mem32, MMX
MOVD MMX, Reg32
MOVD Reg32, MMX

Dabei sind immer nur die niederwertigen Bits 0 bis 31 des MMX-Registers betroffen. Beim Verschieben von Daten aus einem MMX-Register werden also nur diese Bits verwandt. Beim Verschieben von Daten in das MMX-Register wird der höherwertige Anteil (Bits 32 bis 64) gelöscht, also auf Null gesetzt.

MOVQ erlaubt einen bidirektionalen Datenaustausch aller 64 Bit zwischen MMX-Registern und Speicherstellen. Ein Datenaustausch mit den 32-Bit-Allzweckregistern ist nicht vorgesehen. Die möglichen Formen sind damit:

MOVQ MMX, MMX
MOVQ MMX, Mem64
MOVQ Mem64, MMX

Datenvergleich[Bearbeiten]

Die MMX-Befehle zum Datenvergleich sind weniger flexibel und mächtig als die entsprechenden CPU- und FPU-Befehle. Es ist nur vorgesehen, beide Operanden auf Gleichheit zu testen oder prüfen zu lassen, ob der Wert im ersten Operand größer als im zweiten ist. Beide Vergleichsmöglichkeiten sind für die drei Formate Byte, Word und DoubleWord verfügbar. Somit ergeben sich folgende Befehle: PCMPEQB, PCMPEQW, PCMPEQD, PCMPGTB, PCMPGTW und PCMPGTD (EQ steht hierbei jeweils für equal, GT für greater). Als erster Operand ist nur ein MMX-Register, als zweiter ein MMX-Register oder eine 64-Bit-Speicherstelle erlaubt.

Ein wesentlicher Unterschied zu CPU und FPU besteht in der Art, wie das Ergebnis des Vergleichs übergeben wird. Es wird nicht durch das Setzen von Flags oder das Setzen einzelner Bits (z. B. im Statusregister der FPU) angezeigt, sondern im ersten Operanden – also einem MMX-Register – abgelegt. Führt der Vergleich zu einem wahren Ergebnis, wird dort der hexadezimale Wert FF bzw. FFFF oder FFFFFFFF eingetragen. Im anderen Fall werden Nullen eingefügt. Ein Vergleich von zwei DoubleWords auf Gleichheit durch PCMPEQD MMx, MMy ließe sich in seinem Ablauf demnach folgendermaßen ausdrücken:

 IF MMx [31..00] > MMy [31..00] THEN MMx [31..00] := $FFFFFFFF
                                ELSE MMx [31..00] := $00000000;
 IF MMx [63..32] > MMy [63..32] THEN MMx [63..32] := $FFFFFFFF
                                ELSE MMx [63..32] := $00000000;

Datenkonversion[Bearbeiten]

MMX-Befehle ermöglichen die Konvertierung eines Datums in ein kleineres oder größeres, wobei eine Konvertierung in ein kleineres Datenformat natürlich immer einen Datenverlust zur Folge hat.

  • Für die Konvertierung in ein kleineres Datum stehen die Befehle PACKSSWB, PACKSSDW und PACKUSWB für die Umwandlung von Word zu Byte und DoubleWord zu Word zur Verfügung. Zwecks Erhaltung des Vorzeichens wird dabei das höchstwertige Bit des Zieldatums nicht verwendet. Damit ist nur die Hälfte des Wertebereichs verfügbar. Die Befehle saturieren deshalb Werte, welche diesen Bereich über- oder unterschreiten. So setzt z. B. PUNBKHBW alle −128 unterschreitende Werte auf −128 und alle 127 überschreitende auf 127. PACKUSWB (Pack with Unsigned Saturation Word to Byte) berücksichtigt das Vorzeichen nicht, saturiert aber dennoch.
  • Die Konvertierung in ein größeres Format ist von Byte zu Word, Word zu DoubleWord und DoubleWord zu QuadWord möglich. Dabei existiert jeweils ein Befehl für die Umwandlung des niederwertigen und des höherwertigen Teil der Daten: Ersteres decken die drei Befehle PUNPCKHBW, PUNPCKHWD und PUNPCKHDQ ab, Letzteres PUNPCKLBW, PUNPCKLWD und PUNPCKLDQ.[10]

MMX-Status[Bearbeiten]

Die drei Befehle zum MMX-Status EMMS, FXSAVE und FXSTORE besitzen keine Operanden. EMMS ist eine Art Aufräumbefehl nach Beendigung einer MMX-Anwendung. FXSAVE und FXSTORE dienen jeweils zum Sichern und Wiederherstellen FPU-spezifischer Daten, Flags und Register, siehe hierzu auch im Abschnitt Wechsel zwischen FPU und MMX.

Exceptions[Bearbeiten]

Da MMX-Befehle sich nicht grundlegend von CPU-Befehlen unterscheiden, können sie auch grundsätzlich dieselben Exceptions auslösen. FPU-spezifische, Gleitkommazahlen betreffende Exceptions wie z. B. Ausnahmesituationen bei Denormalisierungen können bei Benutzung der Register durch MMX nicht auftreten.[17]

CPUs mit MMX[Bearbeiten]

Da MMX die erste Erweiterung der x86-Architektur ist, besitzen eigentlich alle CPUs der letzten Jahre MMX. Eine vollständige Liste aller CPUs mit MMX würde also den Rahmen sprengen. An dieser Stelle sei allerdings auf die Liste von Mikroprozessoren verwiesen.

Nachfolgend eine Übersicht, ab welcher CPU-Familie die jeweiligen Hersteller MMX integriert haben:

Programmiersprachen[Bearbeiten]

Zur Umsetzung der erweiterten und erhöhten Potenziale eines neuen Prozessorkonzeptes wie MMX in optimierte Anwendungssoftware ist es erforderlich, dass die erweiterten Möglichkeiten der Maschinensprache auch von den neuen Versionen der diversen höheren Programmiersprachen unterschiedlichsten Abstraktionsniveaus und ihren Compilern unterstützt werden.

Die Sprachen können sich dabei einerseits darauf beschränken, die Möglichkeiten von MMX im Kompilierungsprozess umzusetzen, den Befehlsvorrat der jeweiligen Sprache aber nicht zu erweitern. Für den Programmierer ändert sich dadurch recht wenig, er muss lediglich aus Gründen der Abwärtskompatibilität vor der Kompilierung angeben, ob MMX im Zielcode verwendet werden soll oder nicht.[20]

Eine Sprache kann aber auch ihren Befehlsvorrat erweitern und neue, speziell die Stärken von MMX unterstützende Konzepte und Befehle für das Schreiben des Quellcodes implementieren. So stellt z. B. Free Pascal[21] vordefinierte Array-Typen speziell für MMX und 3DNow! bereit.[22] Vector Pascal ermöglicht parallele Operationen auf Daten.

Im systemnahen Sprachbereich unterstützte der Microsoft Macro Assembler schon ein dreiviertel Jahr nach Markteinführung von MMX in Version 6.12 die neuen Möglichkeiten von MMX. Auch der Flat Assembler und NASM unterstützten später MMX. Intel unterstützte in seinen eigenen C-Compilern und später in C++[23] relativ zügig MMX. Auch der VectorC Compiler[24] von Codeplay unterstützt die Vektorisierung und optimiert C-Quellcode bei der Übersetzung für MMX. Andere Programmiersprachen folgten später mit der Umsetzung der Möglichkeiten von MMX.

Einsatz in Software[Bearbeiten]

MMX wurde, ebenso wie AMDs 3DNow!, nicht im von Intel erhofften Umfang von der Softwareindustrie eingesetzt. Nur bei wenigen Produkten ist ein Vermerk wie „Optimiert für MMX“ explizit zu finden. Am ehesten wurde es noch bei Spielen und Video-Anwendungen wie z. B. Ulead VideoStudio eingesetzt.[25] Eine der Anwendungen, die die MMX-Möglichkeiten relativ schnell implementierten, war Adobe Photoshop (siehe dazu auch den Abschnitt Leistung).

Leistung[Bearbeiten]

Angaben zur Leistung sind stark vom jeweiligen Gesamtsystem, den getesteten Anwendungsbereichen und Anwendungen, den angewandten Algorithmen, der Testmethode bzw. der testenden Firma, und vielen anderen Randbedingungen abhängig.[26] Intel selbst verspricht bei MMX-Prozessoren 10–20 % mehr Leistung bei herkömmlicher Software und bis zu 60 % mehr bei MMX-optimierter Software.[27][28] Gerade aber bei 3D-Grafik mit vielen Gleitkommaberechnungen bringt MMX (siehe auch Grafik) kaum Leistungssteigerung, da das Umschalten zwischen MMX- und FPU-Arithmetik („Context Switch“) mit bis zu 50 Taktzyklen[7] relativ viel Zeit in Anspruch nehmen kann.[29]

Sreraman und Govindarajan haben im Jahr 2000 in Bezug auf die Vektorisierung unter der Sprache C Leistungssteigerungen vom Faktor 2 bis 6,5 für MMX ermittelt.[30] Bei Benutzung von Intel-eigenen Programmbibliotheken für Signal- und Bildbearbeitung bringt MMX Verbesserungen der Performance vom Faktor 1,5 bis 2, bei Grafikanwendungen zwischen 4 und 6.[31] Nach anderen Untersuchungen bringt die Verwendung von MMX Performancevorteile von Faktoren zwischen 1,2 und 1,75.[32] Beim MPEG-Decoding beschränkt sich laut Intel der Performencegewinn durch MMX auf 40 Prozent. Somit kann MMX nur bei bestimmten Aufgabenstellungen deutliche Leistungsvorteile gegenüber nichtoptimierter Software bringen.

Testergebnisse können sogar im Vergleich verschiedener Versionen derselben Software stark schwanken. So ergaben sich bei einem Test des für MMX optimierten Adobe Photoshop Version 4.0 bei den meisten Filtern Performancegewinne zwischen 5 und 20 Prozent.[33] In Version 4.0.1 liefen manche Aktionen unter MMX dagegen überraschenderweise langsamer als ohne MMX-Unterstützung.[34]

Nach MMX[Bearbeiten]

MMX konnte schon bald den gestiegenen Anforderungen schnell wechselnder Grafik in hochauflösender Form, wie sie z. B. Spiele stellen, nicht mehr genügen. Deshalb führte Intel mit der Einführung des Pentium-III-Prozessors Anfang 1999 die SSE-Technologie ein. Dabei wurden acht – auch physisch – neue, CPU- und FPU-unabhängige 128 Bit breite Register geschaffen. Es wurde sowohl der MMX-Befehlssatz erweitert als auch gänzlich neue Befehle geschaffen. SSE erweiterte außerdem das ausschließliche Arbeiten von MMX mit Ganzzahlen (Integer) auf Gleitkommazahlen. Spätere Nachfolgeversionen erweiterten zudem stetig die Fähigkeiten von SSE.

Das von AMD 1998 mit dem AMD K6-2 eingeführte 3DNow! nutzte ebenso wie MMX die Register der FPU, allerdings in einer der FPU-adäquaten Art zur Bearbeitung von Gleitkommazahlen. Die nachfolgenden Versionen von 3DNow! beseitigten Inkompatibilitäten zu Intels SSE-Konzept.

Erweiterung des MMX-Befehlsvorrats unter SSE[Bearbeiten]

Mit SSE wurden zwölf neue Befehle für den MMX-Modus eingeführt, welche nicht mit den neuen XMM-Registern von SSE, sondern ausschließlich mit den alten MMX- bzw. FPU-Registern arbeiten.

  • PAVGB und PAVGW bilden den gerundeten Mittelwert zweier Operanden.
  • PEXTRW und PINSRW dienen der Extraktion und Insertion von Words.
  • PMAXSW, PMAXUB, PMINSW, und PMINUB berechnen Minima und Maxima zweier vorzeichenbehafteter Words bzw. vorzeichenloser Bytes.
  • PMOVMSKB erzeugt aus den Most Significant Bits eines Short Packed Bytes eine Maske.
  • PMULHUW arbeitet wie der alte Befehl PMULHW, verwendet im Gegensatz dazu aber zwei vorzeichenlose Words.
  • PSADWB berechnet für zwei Werte die absoluten Werte der Differenzen ihrer einzelnen Bytes und addiert danach die Summe dieser Differenzen auf.
  • PSHUFW mischt die Einzelbestandteile zweier 64-Bit-Werte nach Regeln, die über einen dritten Befehlsoperanden übergeben werden.[35][36]

SSE2 bis SSE4[Bearbeiten]

Mit SSE2 wurde ein vereinheitlichter Befehlssatz verwirklicht, der ebenso auf die 128 Bit breiten XMM- wie auf 64 Bit breiten MMX-Register verwandt werden kann. Manche Befehle erlauben sogar die gleichzeitige Verwendung beider Registergruppen, z. B. der Konvertierungsbefehl CVPD2PI MMX, XXM.[37] Mit SSE4 wurde die Unterstützung von MMX dann aber beendet.

Literatur[Bearbeiten]

  • David Bistry, Carole Delong, Mickey Gutman: Complete Guide to MMX Technology, McGraw-Hill, 1997, ISBN 0070061920
  • Richard Blum: Professional Assembly Language, Wiley Publishing, 2005, ISBN 0764579010
  • Paul Cockshott, Kenneth Renfrew: SIMD Programming Manual for Linux and Windows, Springer, Berlin, 2004, ISBN 185233794X
  • Rohan Coelho, Maher Hawash: DirectX, RDX, RSX, and MMX Technology – A Jumpstart Guide to High Performance APIs, Addison-Wesley, Amsterdam, 1997, ISBN 0201309440
  • Randall Hyde: The Art of Assembly Language, No Starch Press, 2003, ISBN 1886411972
  • Intel: Intel Architecture Software Developer’s Manual, Volume 1 – Basic Architecture, Bestellnummer 243190, 1999
  • Intel: Intel Architecture Software Developer's Manual, Volume 2 – Instruction Set, Bestellnummer 243191, 1999
  • Intel: Intel Architecture Software Developer's Manual, Volume 3 – System Programming Guide, Bestellnummer 243192, 1999
  • Trutz Eyke Podschun: Das Assemblerbuch – Grundlagen, Einführung und Hochsprachenoptimierung, Addison-Wesley, 2002, ISBN 3827320267
  • Shreekant S. Thakkar: Programmer’s Guide for Internet Streaming SIMD Extensions, Wiley & Sons, 2000, ISBN 0471375241
  • Bliss Sloan: Developing for MMX Technology, Que, 1997, ISBN 0789713020
  • Ralf Weber: Pentium, MMX, AMD konfigurieren, Sybex-Verlag GmbH, 1997, ISBN 3815571065
  • Joachim Rohde: Assembler GE-PACKT, mitp-Verlag, 2001, ISBN 3826607864
  • Joachim Rohde: Assembler GE-PACKT, 2. Auflage, mitp-Verlag, 2007, ISBN 978-3-8266-1756-0

Weblinks[Bearbeiten]

Einzelnachweise[Bearbeiten]

  1. Bnet: Controversy brews over use of MMX moniker (Memento vom 19. Juli 2012 im Webarchiv Archive.today), Artikel von 6. Januar 1997
  2. Richard Blum: Professional Assembly Language, Wiley Publishing, 2005, Seite 482
  3. a b Intel Architecture Software Developer’s Manual, Volume 1 - Basic Architecture, Bestellnummer 243190, 1999, Kapitel 8: Programming with the Intel MMX Technology, Seite 216 f.
  4. Trutz Eyke Podschun: Das Assemblerbuch – Grundlagen, Einführung und Hochsprachenoptimierung, Addison-Wesley, 2002, Seite 274 f.
  5. a b Trutz Eyke Podschun: Das Assemblerbuch – Grundlagen, Einführung und Hochsprachenoptimierung, Addison-Wesley, 2002, Seite 276–278
  6. a b Randall Hyde: The Art of Assembly Language, No Starch Press, 2003, Seite 710–712
  7. a b Jens Hohmuth: MMX-Tutorial, Anleitung zur Nutzung vom MMX bei der Westsächsischen Hochschule Zwickau, vom 2. Januar 1999
  8. Randall Hyde: The Art of Assembly Language, No Starch Press, 2003, Seite 734
  9. Don Brumm, Leo J. Scanlon: 80486 Programming, Windcrest, 1991, Seite 24
  10. a b c Intel Architecture Software Developer’s Manual, Volume 1 – Basic Architecture, Bestellnummer 243190, 1999, Kapitel 8: Programming with the Intel MMX Technology, Seite 221 ff.
  11. Trutz Eyke Podschun: Das Assemblerbuch – Grundlagen, Einführung und Hochsprachenoptimierung, Addison-Wesley, 2002, Seite 281
  12. Klaus Wüst: Mikroprozessortechnik – Grundlagen, Architekturen und Programmierung von Mikroprozessoren, Mikrocontrollern und Signalprozessoren, vieweg, 2006, Seite 214–218
  13. Richard Blum: Professional Assembly Language, Wiley Publishing, 2005, Seite 488 ff.
  14. Richard Blum: Professional Assembly Language, Wiley Publishing, 2005, Seite 494
  15. Trutz Eyke Podschun: Das Assemblerbuch – Grundlagen, Einführung und Hochsprachenoptimierung, Addison-Wesley, 2002, Seite 296 ff.
  16. Randall Hyde: The Art of Assembly Language, No Starch Press, 2003, Seite 718 ff.
  17. David Bistry, Carole Delong, Mickey Gutman: Complete Guide to MMX Technology, McGraw-Hill, 1997, Seite 138
  18. a b Paul Herrmann: Rechnerarchitektur, vieweg, 2002, Seite 417
  19. Intel-Pentium-MMX-Prozessoren auf www.cpu-collection.de
  20. Shreekant S. Thakkar: Programmer’s Guide for Internet Streaming SIMD Extensions, Wiley & Sons, 2000, Seite 72
  21. FreePascal.org: Free Pascal Programmer’s Guide, Abschnitt 5.1: Intel MMX support – What is it about?
  22. Larry Carter, Jeanne Ferrante: Languages and Compilers for Parallel Computing, Seite 400
  23. The Code Project: Introduction to MMX Programming, Beispiele zur Nutzung von MMX mit C++
  24. Codeplay: Codeplay VectorC Compiler Technology
  25. Klaus Dembowski: PC-Werkstatt – Boards, Speicher, Prozessoren, Markt+Technik, 2005, Seite 711
  26. David J. Lilja: Measuring Computer Performance – A pracitioner’s guide, Cambridge University Press, 2000, Seite 2 ff.
  27. Andreas Roskosch: Prozessoren, Abschnitt „MMX im Leistungsvergleich“
  28. Berkeley Wireless Research Center: Intel Introduces 11TH Microprocessor with MMX™ Technology
  29. David Bistry, Carole Delong, Mickey Gutman: Complete Guide to MMX Technology, McGraw-Hill, 1997, Seite 291
  30. Paul Cockshott, Kenneth Renfrew: SIMD Programming Manual for Linux and Windows, Springer, Berlin, 2004, Seite 23
  31. Alan Conrad Bovik: Handbook of Image & Video Processing, 2005, Seite 636
  32. R. Bhargava, R. Radhakrishnan, B. L. Evans, L. John: Characterization of MMX-enhanced DSP and Multimedia Applications on a General Purpose Processor. Digest of the Workshop on Performance Analysis and Its Impact on Design held in conjunction with ISCA98, University of Texas at Austin
  33. Jennis Meyer-Spradow, Andreas Stiller: Großspurig – Ein kritischer Blick auf MMX, aus c’t-Ausgabe 1/97, Seite 228
  34. heise online: Weniger MMX bei Photoshop, Newsartikel vom 9. Juni 1997
  35. Trutz Eyke Podschun: Die Assembler-Referenz – Kodierung, Dekodierung und Referenz, Addison-Wesley, 2002, Seite 231–249
  36. Intel Architecture Software Developer's Manual, Volume 2 – Instruction Set, Kapitel 9.3.6: Additional SIMD Integer Instructions, Seite 246
  37. Trutz Eyke Podschun: Das Assemblerbuch – Grundlagen, Einführung und Hochsprachenoptimierung, Addison-Wesley, 2002, Seite 345 ff.