Advanced Vector Extensions (AVX) ist eine Erweiterung des Befehlssatzes für Mikroprozessoren der x86-Architektur, die von Intel im März 2008 vorgeschlagen wurde.[1]
AVX ist eine Erweiterung der älteren SIMD-Befehlssatzerweiterung Streaming SIMD Extensions 4, die ebenfalls von Intel initiiert wurde. Die Breite der Register und Datenwörter erhöht sich auf 256 Bit.
Die folgende Tabelle zeigt die Weiterentwicklung der SIMD-Instruktionen in der x86-Architektur:
AVX2 erweitert den Befehlssatz von AVX um weitere 256-Bit-Befehle und wurde erstmals von Prozessoren der Haswell-Architektur (Intel) und Excavator-Architektur (AMD) unterstützt.
AVX-512 wurde 2013 veröffentlicht und erweiterte die AVX-Befehle von 256 auf 512 Bit.[2] Es wurde erstmals von Prozessoren der Knights-Landing-Architektur (Intel) unterstützt.
Als Intel APX für Advanced Performance Extensions überarbeitet Intel die bestehenden AVX-Befehlssatzerweiterungen, sodass auch bestehende Software durch Neukompilierung von den doppelt so vielen Registern (32 bei AVX-512 statt 16 bei SSE/AVX/AVX2) profitieren sollen. Der Name der auf AVX-512 aufbauenden Weiterentwicklung wird in AVX10 geändert, die vielen unterschiedlichen Erweiterungen für Server und Client vereinheitlicht und das Featureset dazu jeweils eingefroren. AVX10.1 soll bei den kommenden Intel Xeon „Scalable Processors“ der 5. Generation „Granite Rapids“ eingeführt werden. Spätere E- und P-Kerne sollen dann AVX10.2 erhalten. Mit AVX10 wird auch eine optionale variable Vektorlänge von 128, 256 und 512 Bit möglich; Zen-4-Prozessoren von AMD, die erstmals AVX-512 implementieren, unterstützen bereits zusätzlich eine Vektorlänge von 256 Bits.[3]
Die Breite der SIMD-Register wurde von 128 Bit (bei SSE) auf 256 Bit vergrößert. Die neuen notwendigen Register heißen YMM0 bis YMM15. Die Prozessoren, die AVX unterstützen, führen die älteren SSE-Befehle auf den unteren 128 Bit der neuen Register aus, d. h. die unteren 128 Bit der YMM-Register
werden mit den XMM-Registern geteilt.
AVX führt ein Drei-Operanden-SIMD-Befehlsformat c := a + b ein, das Ergebnis zerstört damit nicht mehr notwendigerweise ein Quellregister, was Kopieroperationen einspart. SSE-Befehle nutzen die Zwei-Operanden-Form a := a + b. Das Drei-Operanden-Format kann nur mit SIMD-Operanden (YMM) verwendet werden und nicht mit Allzweckregistern, wie z. B. EAX oder RAX.
Anwendung
Nützlich für gleitkommaintensive Berechnung, vor allem im Multimedia-, wissenschaftlichen oder Finanzbereich. Ganzzahloperationen folgten 2013.
Erhöht Parallelität und Durchsatz von Gleitkomma- und Ganzzahl-SIMD-Berechnungen.
Verringert die Registerlast durch nicht destruktive Drei-Operanden-Form.
Unterstützung in Compilern und Assemblern
GCC ab Version 4.6, die Intel Compiler Suite ab Version 11.1 und Visual Studio 2010 unterstützen AVX.
Der GNU Assembler unterstützt AVX über Inline-Assemblerbefehle, ebenso wie Intels Pendant. Außerdem unterstützen MASM in der Version für Visual Studio 2010, Yasm ab Version 1.1.0, FASM und NASM nach eigenen Angaben auch AVX. Im x86-Codegenerator des Compiler-Unterbaus LLVM befindet sich eine vollständige AVX 1-Unterstützung ab Version 3.0.
Betriebssystemunterstützung
AVX braucht explizite Unterstützung durch das Betriebssystem, damit die neuen Register bei einem Kontextwechsel korrekt gespeichert und wiederhergestellt werden. Die folgenden Betriebssystemversionen unterstützen AVX:
Ice Lake: Jeder P-Kern (Performance-Kern) hat nur zwei AVX2-Einheiten, die für AVX512 zu einer AVX512-Einheit zusammengeschaltet werden, sodass sich gegenüber AVX2, abgesehen von den erweiterten Instruktionen, keine Leistungssteigerung erzielen lässt. Die E-Kerne (Effizienz-Kerne) verfügen über keine AVX512-Einheit.[15]
Tiger Lake: Jeder P-Kern hat nur zwei AVX2-Einheiten, die für AVX512 zu einer AVX512-Einheit zusammengeschaltet werden, sodass sich gegenüber AVX2, abgesehen von den erweiterten Instruktionen, keine Leistungssteigerung erzielen lässt. Die E-Kerne verfügen über keine AVX512-Einheit.[16]
Alder Lake: Nur in frühen CPU-Steppings nutzbar, AVX512 nicht offiziell unterstützt, ausschließlich in den P-Kernen implementiert. Zuerst von Intel über BIOS und Microcode-Updates deaktiviert, in späteren Steppings komplett in Hardware deaktiviert.
Registerschema von AVX-512 als Erweiterung der AVX- (YMM0-YMM15) und SSE-Register (XMM0-XMM15)
511256
255128
1270
ZMM0
YMM0
XMM0
ZMM1
YMM1
XMM1
ZMM2
YMM2
XMM2
ZMM3
YMM3
XMM3
ZMM4
YMM4
XMM4
ZMM5
YMM5
XMM5
ZMM6
YMM6
XMM6
ZMM7
YMM7
XMM7
ZMM8
YMM8
XMM8
ZMM9
YMM9
XMM9
ZMM10
YMM10
XMM10
ZMM11
YMM11
XMM11
ZMM12
YMM12
XMM12
ZMM13
YMM13
XMM13
ZMM14
YMM14
XMM14
ZMM15
YMM15
XMM15
ZMM16
YMM16
XMM16
ZMM17
YMM17
XMM17
ZMM18
YMM18
XMM18
ZMM19
YMM19
XMM19
ZMM20
YMM20
XMM20
ZMM21
YMM21
XMM21
ZMM22
YMM22
XMM22
ZMM23
YMM23
XMM23
ZMM24
YMM24
XMM24
ZMM25
YMM25
XMM25
ZMM26
YMM26
XMM26
ZMM27
YMM27
XMM27
ZMM28
YMM28
XMM28
ZMM29
YMM29
XMM29
ZMM30
YMM30
XMM30
ZMM31
YMM31
XMM31
Instruktion
Beschreibung
VBROADCASTSS VBROADCASTSD VBROADCASTF128
Kopiert einen 32-Bit-, 64-Bit- oder 128-Bit-Speicheroperanden in alle Elemente eines XMM- oder YMM-Registers.
VINSERTF128
Ersetzt entweder die obere oder untere Hälfte eines 256-Bit-YMM-Register mit dem Wert aus dem 128-Bit-Operanden. Die andere Hälfte bleibt unverändert.
VEXTRACTF128
Extrahiert entweder die obere oder untere Hälfte eines 256-Bit-YMM-Registers und kopiert den Wert in den 128-Bit-Operanden.
VMASKMOVPS VMASKMOVPD
Liest eine beliebige Anzahl von Vektorelementen bedingt aus einem SIMD-Speicheroperand in ein Zielregister, wobei der verbleibende Platz mit Nullen gefüllt wird. Alternativ schreibt es eine beliebige Anzahl von Vektorelementen bedingt von einem SIMD-Register in ein SIMD-Speicheroperanden, wobei der verbleibende Platz im Speicher nicht verändert wird.
VPERMILPS VPERMILPD
Tauscht 32-Bit- oder 64-Bit-Vektorelemente aus.
VPERM2F128
Mischt die vier 128-Bit-Vektorelemente aus zwei 256-Bit-Ursprungsoperanden in ein 256-Bit-Zieloperanden.
VTESTPS, VTESTPD
Setzt die Flag-Bits CF und ZF entsprechend einem Vergleich aller Vorzeichenbits.
VZEROALL
Füllt alle YMM-Register mit Nullen und markiert sie als unbenutzt. Wird beim Umschalten zwischen 128-Bit- und 256-Bit-Modus verwendet.
VZEROUPPER
Füllt die obere Hälfte aller YMM-Register mit Nullen. Wird beim Umschalten zwischen 128-Bit- und 256-Bit-Modus verwendet.
Erweiterung AVX 2
Eine Erweiterung stellen die Advanced Vector Extensions 2 (AVX2) dar, bei der einige neue Instruktionen eingeführt wurden und zahlreiche bestehende Instruktionen nun ebenfalls 256 Bit breit sind. AVX2 wird erstmals mit den AMD Carrizo bzw. Intel Haswell-Prozessoren vertrieben.
Erweiterung AVX-512
Da im High-Performance-Computing (HPC) mittlerweile die Energieeffizienz immer wichtiger wird und das SIMD-Konzept hier Fortschritte verspricht, wurde für die Intel Xeon Phi genannten Rechenbeschleunigerkarten die Befehlssatzerweiterung AVX2 nochmals komplett überarbeitet. Unter anderem wurde hierbei die Daten- und Registerbreite auf 512 Bit verdoppelt sowie die Anzahl der Register auf 32 verdoppelt. Diese überarbeitete Erweiterung nennt Intel AVX-512, sie besteht aus mehreren spezifizierten Gruppen neuer Instruktionen, welche gestaffelt implementiert werden. Die zweite Xeon Phi-Generation (Knights Corner) erhält die sogenannte Foundation, die dritte Generation (Knights Landing, 2016) zusätzlich die CD-, PF- und ER-Erweiterungen.
Im Unterschied zu Xeon Phi einschließlich Knights Landing sind die Befehlsgruppen DQ, BW und VL Bestandteil der im Sommer 2017 erschienen Xeon Scalable Processors und der von ihnen abgeleiteten Skylake-X-Prozessoren (ab Core i7-7800X).
Die Befehlsgruppen wurden von Intel bereits vorab dokumentiert und sind über die CPUID-Instruktion abfragbar, bestimmte Register-Bits sind bei Vorhandensein der Befehlsgruppe gesetzt. Bei AMD Zen 4 ist AVX-512 „double-pumped“ durch zwei 256-Bit-Voktoreinheiten,[19] die Leistung ist jedoch „erstaunlich gut“.[20] Bei AMD Zen 5 ist AVX-512 „voll“ implementiert, arbeitet also eine 512-Bit-AVX-Berechnung in einem Takt ab, jedoch ist aus Gründen der Einsparung (Platz und Energie), für z. B. Mobilprozessoren wie dem Ryzen AI 300, auch die gleiche Aufteilung in zwei 256-Bit-Operationen, wie schon bei Zen 4, weiterhin möglich.[21] Bei Intel ist AVX-512 als Spezifikation beziehungsweise Roadmap zu sehen, welche Instruktionen Intel zukünftig in die AVX-Einheiten bringen will[22] :
Befehlssatz
Name Set
CPUID-Bit
Prozessoren
Intel
AMD
AVX512F (Basisbefehlssatz, restliche Befehle sind optional)
Foundation
EBX 16
Xeon Phi x200, Xeon SP
Zen 4
AVX512PF
Prefetch
EBX 26
Xeon Phi x200
AVX512DQ
Vector Double Word and Quad Word
EBX 17
Xeon SP
Zen 4
AVX512BW
Vector Byte and Word
EBX 30
Xeon SP
Zen 4
AVX512VL
Vector Length
EBX 31
Xeon SP
Zen 4
AVX512CD
Conflict Detection
EBX 28
Xeon Phi x200, Xeon SP
Zen 4
AVX512ER
Exponential and Reciprocal
EBX 27
Xeon Phi x200
AVX512IFMA
Integer Fused Multiply-Add mit 512 Bit
EBX 21
Cannon Lake
Zen 4
AVX512_VBMI
Vector Bit Manipulation
ECX 01
Cannon Lake
Zen 4
AVX512_VBMI2
Vector Bit Manipulation 2
ECX 06
Cannon Lake
Zen 4
AVX512_4FMAPS
Vector Fused Multiply Accumulation Packed Single precision
EDX 03
Xeon Phi 72x5
AVX512_4VNNIW
Vector Neural Network Instructions Word Variable Precision
EDX 02
Xeon Phi 72x5
AVX512_VPOPCNTDQ
Vector POPCOUNT Dword/Qword
ECX 14
Xeon Phi 72x5
Zen 4
AVX512_VNNI
Vector Neural Network Instructions
ECX 11
Xeon Cascade Lake
Zen 4
AVX512_BITALG
Bitalgorithmen, Support for VPOPCNT[B,W] and VPSHUF-BITQMB
Implementierung der einzelnen Befehlsgruppen dokumentiert für Xeon SP[23] und für Xeon Phi Knights Landing (x200).[24]
Benutzung
Die Benutzung dieser Spezialbefehle läuft auf folgendes hinaus:
Isolation der zu optimierenden Programmteile, nur diese müssen überhaupt betrachtet werden
zu optimieren sind dort:
Speicherlayout der verwendeten Datenstrukturen (Alignment, Cache-Effizienz, Lokalität von Speicherzugriffen)
Zerlegungen der Berechnungen in viele unabhängige Threads, die parallel und z. T. auf verschiedenen Architekturen abgearbeitet werden können (z. B. auf eine/mehrere GPU(s) ausgelagert werden können)
Nutzen dieser erweiterten Befehlssätze durch …
Nutzung von Compilern, die diese Befehlssätze unterstützen
Nutzung von Bibliotheken, die wiederum solche Bibliotheken nutzen (z. B. Graphikbibliotheken)
Nutzung von Programmiersprachen, die von sich aus Gebrauch von diesen Befehlen machen (z. B. Python mit dem numpy-Paket)
Bei sehr kritischen Applikation kann das Nutzen von Compiler Intrinsics oder das Schreiben von Assembler-Routinen zu einer weiteren Performance-Steigerung notwendig sein.
Die Probleme sind aber nicht neu und das Nutzen der Befehlssatzerweiterungen ist von diesen Optimierungen noch der Teil, der sich am besten automatisieren lässt.
Fazit
Programme können mithilfe von AVX und dessen 256 Bit breiten Registern im x64-Modus in jedem Taktzyklus vier Gleitkommaoperationen mit doppelter Genauigkeit oder acht Gleitkommaoperationen mit einfacher Genauigkeit bei bspw. einer einfachen Addition berechnen. Dabei befinden sich jeweils vier Werte doppelter Genauigkeit oder acht Werte einfacher Genauigkeit in jeweils einem der 16 AVX-Register, die dann mit jeweils einem Partner verrechnet werden.
Mit AVX2 verändert sich die Registerbreite nicht, es wurden lediglich einige der zuvor (bei AVX) noch mit 128 Bit ausgeführten Operationen (z. B. FMA3: Fused-Multiply Add/Floating-Point Multiply-Accumulate, Integeroperationen…) auf 256-Bit-Ausführung gebracht.[25] Es ändert sich somit die Anzahl der verfügbaren 256-Bit-SIMD-Operationen. Bei einer einfachen Addition auf einer 64-Bit-Architektur werden weiterhin (nur) vier Gleitkommaoperationen mit doppelter Genauigkeit oder acht Gleitkommaoperationen mit einfacher Genauigkeit gleichzeitig berechnet.
Bei AVX-512 sind es aufgrund der Registerbreite von 512 Bit damit pro Befehl acht Additionen in doppelter Genauigkeit oder 16 Additionen in einfacher Genauigkeit.
Die Nutzung von AVX-512 beschränkt sich im Desktop-Segment gegenwärtig (2018) auf den X299-Chipsatz der Skylake-Architektur für den Sockel 2066 sowie seit 2016 auch auf eine Reihe der Xeon-Prozessorbaureihen.
Mit der auf AVX-512 aufbauenden Weiterentwicklung APX (Advanced Performance Extensions), später in AVX10 umbenannt, verdoppelt sich die Anzahl der 512 Bit breiten Register auf 32 pro physischem CPU-Kern.
↑Carsten Spille: AMD Ryzen AI 300: Überraschende Details zu Zen 5 sowie RDNA 3.5 und XDNA2. In: Heise online.24. Juli 2024. Abgerufen am 11. September 2024.; Zitat: „Auch die Befehlssatzerweiterung AVX512 ist wie schon bei Zen 4 wieder mit an Board. Die Zen-5-Kerne können, anders als bei Zen 4, AVX512 theoretisch auch in einem statt in zwei Durchgängen ausführen und so für die doppelte Rechenleistung pro Takt sorgen. Allerdings bewahrte sich AMD auch die Möglichkeit, die breiten Instruktionen platz- und energiesparend in zwei 256-Bit-Häppchen nacheinander abzuarbeiten, wie es schon Zen 4 tat.“.