Advanced Vector Extensions (AVX) ist eine Erweiterung desBefehlssatzes fürMikroprozessoren derx86-Architektur, die vonIntel im März 2008 vorgeschlagen wurde.[1]AVX ist eine Erweiterung der älterenSIMD-BefehlssatzerweiterungStreaming 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:
| Name der Erweiterung | Daten- breite | Registeranzahl | Adressierungs- schema | vorhanden in CPUs von | |
|---|---|---|---|---|---|
| Intel | AMD | ||||
| MMX /3DNow! | 0064 | 08X(MM0…07) | MMX abPentium (P55C) | K6 (MMX) /K6-2 „Chomper“ (3DNow!) | |
| SSE (1…4.*) | 0128 | 8/16 (XMM0…15) | REX | SSE4:Core 2,Nehalem | K7 „Palomino“,K8, K8 „Venice“ |
| AVX | 0256 | 16 (YMM0…15) | VEX | Sandy Bridge,Ivy Bridge | Bulldozer,Piledriver,Steamroller,Jaguar |
| AVX2 | Haswell,Broadwell,Skylake-i,Kaby Lake-i | Excavator,Zen,Zen 2,Zen 3 | |||
| AVX-512 | 0512 | 32 (ZMM0…31) | EVEX | Skylake-X,Xeon Phi x200,Xeon Skylake-Scalable Processors,Tiger Lake | |
| 0256/512 | Zen 4,Zen 5 | ||||
| AVX10.1 | 0256/512 | 32 (ZMM0…31) | EVEX / REX2 | Granite Rapids | |
| AVX10.2 | 0512 | 32 (ZMM0…31) | EVEX / REX2 | Diamond Rapids | |
AVX2 erweitert den Befehlssatz von AVX um weitere 256-Bit-Befehle und wurde erstmals von Prozessoren derHaswell-Architektur (Intel) undExcavator-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 derKnights-Landing-Architektur (Intel) unterstützt.
AVX10 wurde 2023 veröffentlicht und soll die konvergenten Umsetzung von AVX-512 ermöglichen. Es werden alle AVX-512 Befehle unterstützt und eine Versionsbasierte Befehlssatzaufzählung eingeführt.[3] In einer früheren Version der Spezifikation wurde für AVX10.2 auch eine 256-bit Implementierung vorgesehen, ab Version 3 wurde diese entfernt, so dass eine 512-Bit-Implementierung nun verpflichtend ist.[4]

Die Breite derSIMD-Register wurde von 128 Bit (beiSSE) auf 256 Bit vergrößert. Die neuen notwendigenRegister 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-Registerwerden mit den XMM-Registern geteilt.
AVX führt ein Drei-Operanden-SIMD-Befehlsformatc :=a +b ein, das Ergebnis zerstört damit nicht mehr notwendigerweise ein Quellregister, was Kopieroperationen einspart. SSE-Befehle nutzen die Zwei-Operanden-Forma :=a +b. Das Drei-Operanden-Format kann nur mitSIMD-Operanden (YMM) verwendet werden und nicht mit Allzweckregistern, wie z. B. EAX oder RAX.
GCC ab Version 4.6, die Intel Compiler Suite ab Version 11.1 undVisual Studio 2010 unterstützen AVX.DerGNU Assembler unterstützt AVX über Inline-Assemblerbefehle, ebenso wie Intels Pendant. Außerdem unterstützenMASM in der Version für Visual Studio 2010,Yasm ab Version 1.1.0,FASM undNASM nach eigenen Angaben auch AVX. Im x86-Codegenerator des Compiler-UnterbausLLVM befindet sich eine vollständige AVX 1-Unterstützung ab Version 3.0.
AVX braucht explizite Unterstützung durch dasBetriebssystem, damit die neuen Register bei einemKontextwechsel korrekt gespeichert und wiederhergestellt werden. Die folgenden Betriebssystemversionen unterstützen AVX:
| 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. |
Eine Erweiterung stellen dieAdvanced 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 denAMD Carrizo bzw. IntelHaswell-Prozessoren vertrieben.
Da im Bereich desHochleistungsrechnens mittlerweile die Energieeffizienz immer wichtiger wird und dasSIMD-Konzept hier Fortschritte verspricht, wurde für dieIntel Xeon Phi genannten Rechenbeschleuniger 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 IntelAVX-512, sie besteht aus mehreren spezifizierten Gruppen neuer Instruktionen, welche gestaffelt implementiert werden. Die zweiteXeon Phi-Generation (Knights Corner) erhält die sogenannteFoundation, die dritte Generation (Knights Landing, 2016) zusätzlich dieCD-,PF- undER-Erweiterungen.
Im Unterschied zuXeon Phi einschließlichKnights Landing sind die BefehlsgruppenDQ,BW undVL Bestandteil der im Sommer 2017 erschienenXeon Scalable Processors und der von ihnen abgeleitetenSkylake-X-Prozessoren (ab Core i7-7800X).
Die Befehlsgruppen wurden von Intel bereits vorab dokumentiert und sind über dieCPUID-Instruktion abfragbar, bestimmte Register-Bits sind bei Vorhandensein der Befehlsgruppe gesetzt. Bei AMD Zen 4 ist AVX-512 „double-pumped“ durch zwei 256-Bit-Vektoreinheiten,[20] die Leistung ist jedoch „erstaunlich gut“.[21] 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 demRyzen AI 300, auch die gleiche Aufteilung in zwei 256-Bit-Operationen, wie schon bei Zen 4, weiterhin möglich.[22] Bei Intel ist AVX-512 als Spezifikation beziehungsweiseRoadmap zu sehen, welche Instruktionen Intel zukünftig in die AVX-Einheiten bringen will[23]:
| 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 | ECX 12 | Ice Lake | Zen 4 |
| AVX512_GFNI | Galois Field New Instructions | Ice Lake | ||
| AVX512_VPCLMULQDQ | Carry-Less Multiplication Quadword | Ice Lake | ||
| AVX512_VAES | Vector AES | Ice Lake | ||
| AVX512_BF16 | BFLOAT16Floating-Point Format | Cooper Lake, Sapphire Rapids | Zen 4 | |
Implementierung der einzelnen Befehlsgruppen dokumentiert für Xeon SP[24] und für Xeon Phi Knights Landing (x200).[25]
Die Benutzung dieser Spezialbefehle läuft auf folgendes hinaus:
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.
Programme können mithilfe vonAVX und dessen 256 Bit breiten Registern imx64-Modus in jedemTaktzyklus vierGleitkommaoperationen mitdoppelter Genauigkeit oder acht Gleitkommaoperationen miteinfacher 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-PointMultiply-Accumulate,Integeroperationen…) auf 256-Bit-Ausführung gebracht.[26] Es ändert sich somit die Anzahl der verfügbaren 256-Bit-SIMD-Operationen. Bei einer einfachen Addition auf einer64-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 denX299-Chipsatz derSkylake-Architektur für denSockel 2066 sowie seit 2016 auch auf eine Reihe derXeon-Prozessorbaureihen.