SSE4 - SSE4

SSE4 ( Streaming SIMD Extensions 4 ) ist ein SIMD- CPU- Befehlssatz, der in der Intel Core-Mikroarchitektur und AMD K10 (K8L) verwendet wird . Es wurde am 27. September 2006 auf dem Intel Developer Forum im Herbst 2006 mit vagen Details in einem Whitepaper angekündigt ; Genauere Details zu 47 Anleitungen wurden auf dem Intel Developer Forum im Frühjahr 2007 in Peking in der Präsentation zur Verfügung gestellt. SSE4 ist vollständig kompatibel mit Software, die für frühere Generationen von Mikroprozessoren mit Intel 64- und IA-32-Architektur geschrieben wurde. Auf Mikroprozessoren, die SSE4 enthalten, sowie in Gegenwart vorhandener und neuer Anwendungen, die SSE4 enthalten, läuft die gesamte vorhandene Software ohne Modifikation weiterhin ordnungsgemäß.

SSE4-Untergruppen

Intel SSE4 besteht aus 54 Anweisungen. Eine Teilmenge bestehend aus 47 Anweisungen, die in einigen Intel-Dokumentationen als SSE4.1 bezeichnet wird , ist in Penryn verfügbar . Darüber hinaus ist SSE4.2 , eine zweite Teilmenge bestehend aus den 7 verbleibenden Anweisungen, erstmals in Nehalem- basiertem Core i7 verfügbar . Intel schreibt dem Feedback von Entwicklern eine wichtige Rolle bei der Entwicklung des Befehlssatzes zu.

Beginnend mit Barcelona- basierten Prozessoren führte AMD den SSE4a- Befehlssatz ein, der 4 SSE4-Befehle und 4 neue SSE-Befehle enthält. Diese Anweisungen sind nicht in Intels Prozessoren zu finden, die SSE4.1 unterstützen, und AMD-Prozessoren unterstützen erst Intels SSE4.1 und SSE4.2 (der vollständige SSE4-Befehlssatz) in den Bulldozer- basierten FX-Prozessoren. Mit SSE4a wurde auch die Funktion für falsch ausgerichtete SSE eingeführt, was bedeutete, dass nicht ausgerichtete Ladebefehle genauso schnell waren wie ausgerichtete Versionen an ausgerichteten Adressen. Es ermöglichte auch das Deaktivieren der Ausrichtungsprüfung bei nicht geladenen SSE-Operationen, die auf den Speicher zugreifen. Intel führte später ähnliche Geschwindigkeitsverbesserungen für nicht ausgerichtete SSE in ihren Nehalem-Prozessoren ein, führte jedoch bis AVX keinen falsch ausgerichteten Zugriff durch SSE-Befehle ohne Last ein .

Namensverwirrung

Was heute als SSSE3 (Supplemental Streaming SIMD Extensions 3) bekannt ist und in der Intel Core 2- Prozessorlinie eingeführt wurde, wurde von einigen Medien als SSE4 bezeichnet, bis Intel den Spitznamen SSSE3 auf den Markt brachte. Intern Merom New Instructions genannt, plante Intel ursprünglich nicht, ihnen einen speziellen Namen zu geben, was von einigen Journalisten kritisiert wurde. Intel räumte schließlich die Verwirrung auf und reservierte den Namen SSE4 für die nächste Befehlssatzerweiterung.

Intel verwendet den Marketingbegriff HD Boost, um sich auf SSE4 zu beziehen.

Neue Anleitung

Im Gegensatz zu allen vorherigen Iterationen von SSE enthält SSE4 Anweisungen, die Operationen ausführen, die nicht spezifisch für Multimediaanwendungen sind. Es enthält eine Reihe von Befehlen, deren Aktion durch ein konstantes Feld bestimmt wird, und eine Reihe von Befehlen, die XMM0 als impliziten dritten Operanden verwenden.

Mehrere dieser Befehle werden von der Single-Cycle-Shuffle-Engine in Penryn aktiviert. (Shuffle-Operationen ordnen Bytes innerhalb eines Registers neu an.)

SSE4.1

Diese Anweisungen wurden mit der Penryn-Mikroarchitektur eingeführt , der 45-nm-Schrumpfung von Intels Core-Mikroarchitektur . Die Unterstützung wird über das Flag CPUID.01H:ECX.SSE41[Bit 19] angezeigt.

Anweisung Beschreibung
MPSADBW
Berechnen Sie acht Offset-Summen absoluter Differenzen, jeweils vier (dh |x 0 –y 0 |+|x 1 –y 1 |+|x 2 –y 2 |+|x 3 –y 3 |, |x 0 −y 1 |+|x 1 −y 2 |+|x 2 −y 3 |+|x 3 −y 4 |, ..., |x 0 −y 7 |+|x 1 −y 8 |+| x 2 – y 9 |+|x 3 – y 10 |); dieser Vorgang ist für einige HD- Codecs wichtig und ermöglicht die Berechnung einer 8×8-Blockdifferenz in weniger als sieben Zyklen. Ein Bit eines 3-Bit-Direktoperanden gibt an, ob y 0 .. y 10 oder y 4 .. y 14 vom Zieloperanden verwendet werden soll, die anderen beiden ob x 0 ..x 3 , x 4 ..x 7 , x 8 ..x 11 oder x 12 ..x 15 sollten aus der Quelle verwendet werden.
PHMINPOSUW
Setzt das unterste 16-Bit-Wort des Ziels auf das kleinste vorzeichenlose 16-Bit-Wort in der Quelle und das nächste von unten auf den Index dieses Wortes in der Quelle.
PMULDQ
Gepackte 32-Bit-Multiplikation mit Vorzeichen, "lange" Multiplikation, zwei (1. und 3.) von vier gepackten ganzen Zahlen multipliziert, was zwei gepackte 64-Bit-Ergebnisse ergibt.
PMULLD
Gepackte 32-Bit-Multiplikation mit Vorzeichen "niedrig", vier gepackte Sätze von ganzen Zahlen multipliziert, was vier gepackte 32-Bit-Ergebnisse ergibt.
DPPS, DPPD
Punktprodukt für AOS (Array von Strukturen) Daten. Dies erfordert einen unmittelbaren Operanden, der aus vier (oder zwei für DPPD) Bits besteht, um auszuwählen, welcher der Einträge in der Eingabe multipliziert und akkumuliert werden soll, und weitere vier (oder zwei für DPPD), um auszuwählen, ob 0 oder das Skalarprodukt eingegeben werden soll das entsprechende Feld der Ausgabe.
BLENDPS, BLENDPD, BLENDVPS,
BLENDVPD, PBLENDVB, PBLENDW
Bedingtes Kopieren von Elementen an einer Stelle mit einer anderen, basierend (für Nicht-V-Form) auf den Bits in einem unmittelbaren Operanden und (für V-Form) auf den Bits im Register XMM0.
PMINSB, PMAXSB, PMINUW, 
PMAXUW, PMINUD, PMAXUD, 
PMINSD, PMAXSD
Gepacktes Minimum/Maximum für verschiedene Integer-Operandentypen
ROUNDPS, ROUNDSS, ROUNDPD, ROUNDSD
Runden Sie Werte in einem Gleitkommaregister auf ganze Zahlen, indem Sie einen von vier Rundungsmodi verwenden, die durch einen unmittelbaren Operanden angegeben werden
INSERTPS, PINSRB, PINSRD/PINSRQ,
EXTRACTPS, PEXTRB, PEXTRD/PEXTRQ
Die Befehle INSERTPS und PINSR lesen 8, 16 oder 32 Bits aus einem x86-Register oder einer Speicherstelle und fügen sie in ein Feld im Zielregister ein, das durch einen unmittelbaren Operanden angegeben wird. EXTRACTPS und PEXTR lesen ein Feld aus dem Quellregister und fügen es in ein x86-Register oder eine Speicherstelle ein. Beispiel: PEXTRD eax, [xmm0], 1; EXTRACTPS [addr+4*eax], xmm1, 1 speichert das erste Feld von xmm1 in der durch das erste Feld von xmm0 gegebenen Adresse.
PMOVSXBW, PMOVZXBW, PMOVSXBD, 
PMOVZXBD, PMOVSXBQ, PMOVZXBQ, 
PMOVSXWD, PMOVZXWD, PMOVSXWQ, 
PMOVZXWQ, PMOVSXDQ, PMOVZXDQ
Packed Sign/Null Erweiterung auf breitere Typen
PTEST
Dies ähnelt dem TEST-Befehl, indem er das Z-Flag auf das Ergebnis eines UND zwischen seinen Operanden setzt: ZF wird gesetzt, wenn DEST AND SRC gleich 0 ist. Zusätzlich setzt es das C-Flag, wenn (NOT DEST) AND SRC ist gleich Null.

Dies entspricht dem Setzen des Z-Flags, wenn keines der durch SRC maskierten Bits gesetzt ist, und des C-Flags, wenn alle durch SRC maskierten Bits gesetzt sind.

PCMPEQQ
Quadword (64 Bit) auf Gleichheit vergleichen
PACKUSDW
Konvertieren Sie signierte DWORDs in unsignierte WORDs mit Sättigung.
MOVNTDQA
Effizientes Lesen aus dem schreibkombinierenden Speicherbereich in das SSE-Register; Dies ist nützlich, um Ergebnisse von Peripheriegeräten abzurufen, die an den Speicherbus angeschlossen sind.

SSE4.2

SSE4.2 fügte STTNI (String and Text New Instructions) hinzu, mehrere neue Befehle, die Zeichensuchen und -vergleiche an zwei Operanden von 16 Bytes gleichzeitig durchführen. Diese wurden (unter anderem) entwickelt, um das Parsen von XML- Dokumenten zu beschleunigen . Außerdem wurde ein CRC32-Befehl hinzugefügt, um zyklische Redundanzprüfungen zu berechnen , wie sie in bestimmten Datenübertragungsprotokollen verwendet werden. Diese Anweisungen wurden zuerst in der Nehalem- basierten Intel Core i7- Produktlinie implementiert und vervollständigen den SSE4-Befehlssatz. Die Unterstützung wird über das Flag CPUID.01H:ECX.SSE42[Bit 20] angezeigt.

Anweisung Beschreibung
CRC32
Akkumulieren Sie den CRC32 C-Wert unter Verwendung des Polynoms 0x11EDC6F41 (oder, ohne das höherwertige Bit, 0x1EDC6F41).
PCMPESTRI
Gepackte Zeichenfolgen mit expliziter Länge vergleichen, Index zurückgeben
PCMPESTRM
Gepackter Vergleich von Strings mit expliziter Länge, Rückgabemaske
PCMPISTRI
Gepackte Zeichenfolgen impliziter Länge vergleichen, Index zurückgeben
PCMPISTRM
Gepackte Zeichenfolgen impliziter Länge vergleichen, Maske zurückgeben
PCMPGTQ
Vergleichen Sie gepackte signierte 64-Bit-Daten für mehr als

POPCNT und LZCNT

Diese Befehle arbeiten mit Integer- und nicht mit SSE-Registern, da sie keine SIMD-Befehle sind, sondern gleichzeitig erscheinen und obwohl sie von AMD mit dem SSE4a-Befehlssatz eingeführt wurden, werden sie als separate Erweiterungen mit ihren eigenen dedizierten CPUID-Bits gezählt, um die Unterstützung anzuzeigen. Intel implementiert POPCNT beginnend mit der Nehalem- Mikroarchitektur und LZCNT beginnend mit der Haswell- Mikroarchitektur. AMD implementiert beides, beginnend mit der Barcelona-Mikroarchitektur .

AMD nennt dieses Befehlspaar Advanced Bit Manipulation (ABM) .

Anweisung Beschreibung
POPCNT
Population count (Anzahl der Bits auf 1 gesetzt). Die Unterstützung wird über das Flag CPUID.01H:ECX.POPCNT[Bit 23] angezeigt.
LZCNT
Führende Null zählen . Die Unterstützung wird über das Flag CPUID.80000001H:ECX.ABM[Bit 5] angezeigt.

Die Codierung von lzcnt ist ähnlich genug , um bsr (Bit - Scan umgekehrt), wenn lzcnt auf einer CPU ausgeführt wird , nicht wie Intel CPUs vor Haswell unterstützen, wird es die ausführen bsr Operation statt eine ungültige Anweisung Fehler trotz der unterschiedlichen Ergebnis der Erhöhung Werte von lzcnt und bsr .

Nachfolgende Nullen können mit den Anweisungen bsf (bit scan forward) oder tzcnt gezählt werden.

SSE4a

Die SSE4a-Befehlsgruppe wurde in AMDs Barcelona-Mikroarchitektur eingeführt . Diese Anweisungen sind bei Intel-Prozessoren nicht verfügbar. Die Unterstützung wird über das Flag CPUID.80000001H:ECX.SSE4A[Bit 6] angezeigt.

Anweisung Beschreibung
EXTRQ/INSERTQ
Kombinierte Anweisungen zum Maskenwechsel.
MOVNTSD/MOVNTSS
Anleitung für den skalaren Streaming-Store.

Unterstützte CPUs

  • Intel
  • AMD
    • K10-basierte Prozessoren (SSE4a, POPCNT und LZCNT unterstützt)
    • "Cat"-Prozessoren mit geringem Stromverbrauch
      • Bobcat-basierte Prozessoren (SSE4a, POPCNT und LZCNT unterstützt)
      • Jaguar-basierte Prozessoren und neuer (SSE4a, SSE4.1, SSE4.2, POPCNT und LZCNT werden unterstützt)
      • Puma-basierte Prozessoren und neuer (SSE4a, SSE4.1, SSE4.2, POPCNT und LZCNT werden unterstützt)
    • "Heavy Equipment"-Prozessoren (SSE4a, SSE4.1, SSE4.2, POPCNT und LZCNT werden unterstützt)
    • Zen-basierte Prozessoren (SSE4a, SSE4.1, SSE4.2, POPCNT und LZCNT werden unterstützt)
    • Zen+-basierte Prozessoren (SSE4a, SSE4.1, SSE4.2, POPCNT und LZCNT werden unterstützt)
    • Zen2-basierte Prozessoren (SSE4a, SSE4.1, SSE4.2, POPCNT und LZCNT werden unterstützt)
    • Zen3-basierte Prozessoren (SSE4a, SSE4.1, SSE4.2, POPCNT und LZCNT werden unterstützt)
  • ÜBER
    • Nano 3000, X2, QuadCore-Prozessoren (SSE4.1 unterstützt)
    • Nano QuadCore C4000-Serie-Prozessoren (SSE4.1, SSE4.2 unterstützt)
    • Eden X4-Prozessoren (SSE4.1, SSE4.2 unterstützt)
  • Zhaoxin
    • ZX-C-Prozessoren und neuer (SSE4.1, SSE4.2 unterstützt)

Verweise

Externe Links