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
- Silvermont- Prozessoren (SSE4.1, SSE4.2 und POPCNT unterstützt)
- Goldmont- Prozessoren (SSE4.1, SSE4.2 und POPCNT unterstützt)
- Goldmont Plus- Prozessoren (SSE4.1, SSE4.2 und POPCNT unterstützt)
- Tremont- Prozessoren (SSE4.1, SSE4.2 und POPCNT unterstützt)
- Penryn- Prozessoren (SSE4.1 unterstützt, außer Pentium Dual-Core und Celeron )
- Nehalem- Prozessoren und Westmere- Prozessoren (SSE4.1, SSE4.2 und POPCNT werden unterstützt, außer Pentium und Celeron )
- Sandy Bridge- Prozessoren und neuer (SSE4.1, SSE4.2 und POPCNT werden unterstützt, einschließlich Pentium und Celeron )
- Haswell- Prozessoren und neuer (SSE4.1, SSE4.2, POPCNT und LZCNT werden unterstützt)
-
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)
- Bulldozer-basierte Prozessoren
- Piledriver-basierte Prozessoren
- Steamroller-basierte Prozessoren
- Baggerbasierte Prozessoren und neuer
- 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
-
Zhaoxin
- ZX-C-Prozessoren und neuer (SSE4.1, SSE4.2 unterstützt)
Verweise
Externe Links