Erweiterte Vektorerweiterungen - Advanced Vector Extensions

Advanced Vector Extensions ( AVX , auch bekannt als Sandy Bridge New Extensions ) sind Erweiterungen der x86- Befehlssatzarchitektur für Mikroprozessoren von Intel und AMD, die von Intel im März 2008 vorgeschlagen und erstmals von Intel mit der Auslieferung des Sandy Bridge- Prozessors im ersten Quartal 2011 und später unterstützt wurden on von AMD mit der Auslieferung des Bulldozer- Prozessors im dritten Quartal 2011. AVX bietet neue Funktionen, neue Anweisungen und ein neues Codierungsschema.

AVX2 (auch bekannt als Haswell New Instructions ) erweitert die meisten Integer-Befehle auf 256 Bit und führt fusionierte Multiply-Accumulate ( FMA )-Operationen ein. Sie wurden erstmals von Intel mit dem Haswell-Prozessor unterstützt, der 2013 ausgeliefert wurde.

AVX-512 erweitert AVX auf 512-Bit-Unterstützung mit einer neuen EVEX-Präfix- Codierung, die von Intel im Juli 2013 vorgeschlagen und erstmals von Intel mit dem Knights Landing- Prozessor unterstützt wurde, der 2016 ausgeliefert wurde.

Erweiterte Vektorerweiterungen

AVX verwendet sechzehn YMM-Register, um einen einzelnen Befehl für mehrere Datenelemente auszuführen (siehe SIMD ). Jedes YMM-Register kann gleichzeitige Operationen (Mathematik) halten und ausführen an:

  • acht 32-Bit-Gleitkommazahlen mit einfacher Genauigkeit oder
  • vier 64-Bit-Gleitkommazahlen mit doppelter Genauigkeit.

Die Breite der SIMD-Register wird von 128 Bit auf 256 Bit erhöht und von XMM0–XMM7 in YMM0–YMM7 (im x86-64- Modus von XMM0–XMM15 in YMM0–YMM15) umbenannt. Die Legacy- SSE- Befehle können weiterhin über das VEX-Präfix verwendet werden, um auf den unteren 128 Bits der YMM-Register zu arbeiten.

AVX-512-Registerschema als Erweiterung der Register AVX (YMM0-YMM15) und SSE (XMM0-XMM15)
511 256 255 128 127 0
  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

AVX führt ein SIMD-Befehlsformat mit drei Operanden ein , das VEX-Codierungsschema genannt wird , bei dem sich das Zielregister von den beiden Quelloperanden unterscheidet. Beispielsweise kann ein SSE- Befehl, der die herkömmliche Zwei-Operanden-Form a = a + b verwendet, jetzt eine zerstörungsfreie Drei-Operanden-Form c = a + b verwenden , wobei beide Quelloperanden erhalten bleiben. Ursprünglich war das Drei-Operanden-Format von AVX auf die Befehle mit SIMD-Operanden (YMM) beschränkt und enthielt keine Befehle mit Universalregistern (zB EAX). Es wurde später für die Codierung neuer Anweisungen für Universalregister in späteren Erweiterungen wie BMI verwendet . Die VEX-Codierung wird auch für Befehle verwendet, die auf den k0-k7-Maskenregistern arbeiten, die mit AVX-512 eingeführt wurden .

Die Ausrichtungsanforderung von SIMD-Speicheroperanden wird gelockert. Im Gegensatz zu ihren nicht-VEX-codierten Gegenstücken erfordern die meisten VEX-codierten Vektorbefehle nicht länger, dass ihre Speicheroperanden auf die Vektorgröße ausgerichtet sind. Insbesondere VMOVDQAerfordert der Befehl immer noch, dass sein Speicheroperand ausgerichtet ist.

Das neue VEX-Codierungsschema führt einen neuen Satz von Codepräfixen ein, der den Opcode- Raum erweitert, Befehle mit mehr als zwei Operanden ermöglicht und SIMD-Vektorregister länger als 128 Bits erlaubt. Das VEX-Präfix kann auch für die alten SSE-Anweisungen verwendet werden, wodurch sie eine Drei-Operanden-Form erhalten und sie effizienter mit AVX-Anweisungen interagieren, ohne dass VZEROUPPERund benötigt wird VZEROALL.

Die AVX-Anweisungen unterstützen sowohl 128-Bit- als auch 256-Bit-SIMD. Die 128-Bit-Versionen können nützlich sein, um alten Code zu verbessern, ohne die Vektorisierung erweitern zu müssen, und um den Nachteil zu vermeiden, von SSE zu AVX zu wechseln, sie sind auch bei einigen frühen AMD-Implementierungen von AVX schneller. Dieser Modus wird manchmal als AVX-128 bezeichnet.

Neue Anleitung

Diese AVX-Befehle sind zusätzlich zu denen, die 256-Bit-Erweiterungen der alten 128-Bit-SSE-Befehle sind; Die meisten sind sowohl für 128-Bit- als auch für 256-Bit-Operanden verwendbar.

Anweisung Beschreibung
VBROADCASTSS, VBROADCASTSD,VBROADCASTF128 Kopieren Sie einen 32-Bit-, 64-Bit- oder 128-Bit-Speicheroperanden in alle Elemente eines XMM- oder YMM-Vektorregisters.
VINSERTF128 Ersetzt entweder die untere Hälfte oder die obere Hälfte eines 256-Bit-YMM-Registers durch den Wert eines 128-Bit-Quelloperanden. Die andere Hälfte des Ziels ist unverändert.
VEXTRACTF128 Extrahiert entweder die untere Hälfte oder die obere Hälfte eines 256-Bit-YMM-Registers und kopiert den Wert in einen 128-Bit-Zieloperanden.
VMASKMOVPS, VMASKMOVPD Liest bedingt eine beliebige Anzahl von Elementen aus einem SIMD-Vektorspeicheroperanden in ein Zielregister, lässt die verbleibenden Vektorelemente ungelesen und setzt die entsprechenden Elemente im Zielregister auf Null. Schreibt alternativ eine beliebige Anzahl von Elementen aus einem SIMD-Vektorregisteroperanden bedingt in einen Vektorspeicheroperanden, wobei die restlichen Elemente des Speicheroperanden unverändert bleiben. Auf der AMD Jaguar Prozessorarchitektur benötigt dieser Befehl mit einem Speicherquellenoperand mehr als 300 Taktzyklen, wenn die Maske Null ist, in diesem Fall sollte der Befehl nichts tun. Dies scheint ein Konstruktionsfehler zu sein.
VPERMILPS, VPERMILPD Permute In-Lane. Mischen Sie die 32-Bit- oder 64-Bit-Vektorelemente eines Eingabeoperanden. Dies sind 256-Bit-In-Lane-Anweisungen, was bedeutet, dass sie auf allen 256-Bits mit zwei separaten 128-Bit-Shuffles arbeiten, sodass sie nicht über die 128-Bit-Lanes mischen können.
VPERM2F128 Mischen Sie die vier 128-Bit-Vektorelemente von zwei 256-Bit-Quelloperanden in einen 256-Bit-Zieloperanden mit einer unmittelbaren Konstanten als Selektor.
VTESTPS, VTESTPD Gepackter Bittest der gepackten Gleitkomma-Vorzeichenbits mit einfacher oder doppelter Genauigkeit, Setzen oder Löschen des ZF-Flags basierend auf AND und des CF-Flags basierend auf ANDN.
VZEROALL Setzen Sie alle YMM-Register auf Null und markieren Sie sie als unbenutzt. Wird beim Umschalten zwischen 128-Bit- und 256-Bit-Nutzung verwendet.
VZEROUPPER Setzen Sie die obere Hälfte aller YMM-Register auf Null. Wird beim Umschalten zwischen 128-Bit- und 256-Bit-Nutzung verwendet.

CPUs mit AVX

Nicht alle CPUs aus den aufgeführten Familien unterstützen AVX. Im Allgemeinen unterstützen CPUs mit der kommerziellen Bezeichnung Core i3/i5/i7/i9 sie, während Pentium- und Celeron-CPUs dies nicht tun.

Probleme bezüglich der Kompatibilität zwischen zukünftigen Intel- und AMD-Prozessoren werden im XOP-Befehlssatz erörtert .

  • ÜBER :
    • Nano-QuadCore
    • Eden X4
  • Zhaoxin :
    • WuDaoKou-basierte Prozessoren (KX-5000 und KH-20000)

Compiler- und Assembler-Unterstützung

  • Absoft unterstützt mit dem Flag -mavx.
  • Der Free Pascal Compiler unterstützt AVX und AVX2 mit den Schaltern -CfAVX und -CfAVX2 ab Version 2.7.1.
  • RAD Studio (v11.0 Alexandria) unterstützt AVX2 und AVX512.
  • Die Inline-Assembler-Funktionen von GNU Assembler (GAS) unterstützen diese Anweisungen (zugänglich über GCC), ebenso wie Intel-Primitive und der Intel Inline-Assembler (nahezu kompatibel zu GAS, obwohl allgemeiner in der Handhabung lokaler Referenzen innerhalb des Inline-Codes).
  • GCC ab Version 4.6 (obwohl es einen 4.3-Zweig mit gewisser Unterstützung gab) und die Intel Compiler Suite ab Version 11.1 unterstützen AVX.
  • Die Open64- Compiler-Version 4.5.1 unterstützt AVX mit dem Flag -mavx.
  • PathScale unterstützt über das Flag -mavx.
  • Der Vector Pascal- Compiler unterstützt AVX über das Flag -cpuAVX32.
  • Der Visual Studio 2010 / 2012- Compiler unterstützt AVX über den intrinsischen und /arch:AVX-Switch.
  • Andere Assembler wie MASM VS2010 Version, YASM , FASM , NASM und JWASM .

Betriebssystemunterstützung

AVX fügt durch die 256-Bit breite YMM-Registerdatei einen neuen Registerstatus hinzu, sodass eine explizite Betriebssystemunterstützung erforderlich ist, um die erweiterten Register von AVX zwischen Kontextwechseln ordnungsgemäß zu speichern und wiederherzustellen . Die folgenden Betriebssystemversionen unterstützen AVX:

  • DragonFly BSD : Unterstützung Anfang 2013 hinzugefügt.
  • FreeBSD : Unterstützung in einem Patch hinzugefügt, der am 21. Januar 2012 eingereicht wurde und in der stabilen Version 9.1 enthalten war
  • Linux : unterstützt seit Kernel-Version 2.6.30, veröffentlicht am 9. Juni 2009.
  • macOS : Unterstützung im 10.6.8 ( Snow Leopard ) Update hinzugefügt, das am 23. Juni 2011 veröffentlicht wurde.
  • OpenBSD : Unterstützung hinzugefügt am 21. März 2015.
  • Solaris : unterstützt in Solaris 10 Update 10 und Solaris 11
  • Windows : unterstützt in Windows 7 SP1, Windows Server 2008 R2 SP1, Windows 8 , Windows 10
    • Windows Server 2008 R2 SP1 mit Hyper-V erfordert einen Hotfix zur Unterstützung von AMD AVX (Opteron 6200 und 4200 Series) Prozessoren, KB2568088

Erweiterte Vektorerweiterungen 2

Advanced Vector Extensions 2 (AVX2), auch bekannt als Haswell New Instructions , ist eine Erweiterung des AVX-Befehlssatzes, der in Intels Haswell-Mikroarchitektur eingeführt wurde . AVX2 nimmt die folgenden Ergänzungen vor:

  • Erweiterung der meisten Vektorinteger-SSE- und AVX-Befehle auf 256 Bit
  • Sammeln Sie Unterstützung, damit Vektorelemente aus nicht zusammenhängenden Speicherorten geladen werden können
  • DWORD- und QWORD-Granularität Any-to-Any-Permuten
  • Vektorverschiebungen.

Manchmal wird eine andere Erweiterung, die ein anderes CPU-Flag verwendet, als Teil von AVX2 betrachtet; diese Anweisungen sind auf einer eigenen Seite aufgeführt und nicht unten:

Neue Anleitung

Anweisung Beschreibung
VBROADCASTSS, VBROADCASTSD Kopieren Sie einen 32-Bit- oder 64-Bit-Registeroperanden in alle Elemente eines XMM- oder YMM-Vektorregisters. Dies sind Registerversionen der gleichen Befehle in AVX1. Es gibt jedoch keine 128-Bit-Version, aber der gleiche Effekt kann einfach mit VINSERTF128 erzielt werden.
VPBROADCASTB, VPBROADCASTW, VPBROADCASTD,VPBROADCASTQ Kopieren Sie ein 8, 16, 32 oder 64-Bit-Integer-Register oder einen Speicheroperanden in alle Elemente eines XMM- oder YMM-Vektorregisters.
VBROADCASTI128 Kopieren Sie einen 128-Bit-Speicheroperanden in alle Elemente eines YMM-Vektorregisters.
VINSERTI128 Ersetzt entweder die untere Hälfte oder die obere Hälfte eines 256-Bit-YMM-Registers durch den Wert eines 128-Bit-Quelloperanden. Die andere Hälfte des Ziels ist unverändert.
VEXTRACTI128 Extrahiert entweder die untere Hälfte oder die obere Hälfte eines 256-Bit-YMM-Registers und kopiert den Wert in einen 128-Bit-Zieloperanden.
VGATHERDPD, VGATHERQPD, VGATHERDPS,VGATHERQPS Erfasst Gleitkommawerte mit einfacher oder doppelter Genauigkeit unter Verwendung von 32- oder 64-Bit-Indizes und Skalierung.
VPGATHERDD, VPGATHERDQ, VPGATHERQD,VPGATHERQQ Erfasst 32- oder 64-Bit-Ganzzahlwerte mit 32- oder 64-Bit-Indizes und Skalierung.
VPMASKMOVD, VPMASKMOVQ Liest bedingt eine beliebige Anzahl von Elementen aus einem SIMD-Vektorspeicheroperanden in ein Zielregister, lässt die verbleibenden Vektorelemente ungelesen und setzt die entsprechenden Elemente im Zielregister auf Null. Schreibt alternativ eine beliebige Anzahl von Elementen von einem SIMD-Vektorregisteroperanden bedingt in einen Vektorspeicheroperanden, wobei die restlichen Elemente des Speicheroperanden unverändert bleiben.
VPERMPS, VPERMD Mischen Sie die acht 32-Bit-Vektorelemente eines 256-Bit-Quelloperanden in einen 256-Bit-Zieloperanden mit einem Register- oder Speicheroperanden als Selektor.
VPERMPD, VPERMQ Mischen Sie die vier 64-Bit-Vektorelemente eines 256-Bit-Quelloperanden in einen 256-Bit-Zieloperanden mit einem Register- oder Speicheroperanden als Selektor.
VPERM2I128 Mischen (zwei von) der vier 128-Bit-Vektorelemente von zwei 256-Bit-Quelloperanden in einen 256-Bit-Zieloperanden mit einer unmittelbaren Konstanten als Selektor.
VPBLENDD Sofortige Doppelwortversion der PBLEND-Befehle von SSE4 .
VPSLLVD, VPSLLVQ Logisch nach links verschieben. Ermöglicht variable Verschiebungen, bei denen jedes Element entsprechend der gepackten Eingabe verschoben wird.
VPSRLVD, VPSRLVQ Logisch nach rechts verschieben. Ermöglicht variable Verschiebungen, bei denen jedes Element entsprechend der gepackten Eingabe verschoben wird.
VPSRAVD Arithmetisch nach rechts verschieben. Ermöglicht variable Verschiebungen, bei denen jedes Element entsprechend der gepackten Eingabe verschoben wird.

CPUs mit AVX2

AVX-512

AVX-512 sind 512-Bit-Erweiterungen der 256-Bit Advanced Vector Extensions SIMD-Befehle für die x86-Befehlssatzarchitektur, die von Intel im Juli 2013 vorgeschlagen wurden, und werden von Intels Knights Landing- Prozessor unterstützt.

AVX-512-Befehle werden mit dem neuen EVEX-Präfix codiert . Es ermöglicht 4 Operanden, 8 neue 64-Bit- Opmaskenregister , skalaren Speichermodus mit automatischem Rundsenden, explizite Rundungssteuerung und Adressierungsmodus für komprimierte Verschiebungsspeicher . Im x86-64-Modus wird die Breite der Registerdatei auf 512 Bit und die Gesamtregisterzahl auf 32 (Register ZMM0-ZMM31) erhöht.

AVX-512 besteht aus mehreren Erweiterungen, die nicht alle von allen Prozessoren unterstützt werden sollen, die sie implementieren. Der Befehlssatz besteht aus:

  • AVX-512 Foundation – fügt mehrere neue Befehle hinzu und erweitert die meisten 32-Bit- und 64-Bit-Gleitkomma-SSE-SSE4.1- und AVX/AVX2-Befehle mit dem EVEX-Codierungsschema , um die 512-Bit-Register, Operationsmasken, Parameter-Broadcasting zu unterstützen und eingebettete Rundung und Ausnahmekontrolle
  • AVX-512 Conflict Detection Instructions (CD) – effiziente Konflikterkennung zur Vektorisierung von mehr Schleifen, unterstützt von Knights Landing
  • AVX-512 Exponential and Reciprocal Instructions (ER) – exponentielle und reziproke Operationen zur Unterstützung der Umsetzung transzendentaler Operationen, unterstützt von Knights Landing
  • AVX-512 Prefetch-Anweisungen (PF) – neue Prefetch-Funktionen, unterstützt von Knights Landing
  • AVX-512 Vector Length Extensions (VL) – erweitert die meisten AVX-512-Operationen, um auch auf XMM- (128-Bit) und YMM (256-Bit)-Registern zu arbeiten (einschließlich XMM16-XMM31 und YMM16-YMM31 im x86-64-Modus)
  • AVX-512 Byte and Word Instructions (BW) – erweitert AVX-512 um 8-Bit- und 16-Bit-Integer-Operationen
  • AVX-512 Doubleword and Quadword Instructions (DQ) – verbesserte 32-Bit- und 64-Bit-Integer-Operationen
  • AVX-512 Integer Fused Multiply Add (IFMA) – Fused Multiply Add für 512-Bit-Ganzzahlen.
  • AVX-512 Vektorbyte-Manipulationsbefehle (VBMI) fügt Vektorbyte-Permutationsbefehle hinzu, die in AVX-512BW nicht vorhanden sind.
  • AVX-512 Vector Neural Network Instructions Wortvariable Genauigkeit (4VNNIW) – Vektoranweisungen für Deep Learning.
  • AVX-512 Fused Multiply Accumulation Packed Single Precision (4FMAPS) – Vektoranweisungen für Deep Learning.
  • VPOPCNTDQ – Anzahl der Bits auf 1 gesetzt.
  • VPCLMULQDQ – Übertragslose Multiplikation von Quadwords.
  • AVX-512 Vector Neural Network Instructions (VNNI) – Vektoranweisungen für Deep Learning.
  • AVX-512 Galois Field New Instructions (GFNI) – Vektoranweisungen zur Berechnung des Galois-Feldes .
  • AVX-512 Vektor-AES-Anweisungen (VAES) – Vektoranweisungen für die AES- Codierung.
  • AVX-512 Vector Byte Manipulation Instructions 2 (VBMI2) – Byte/Wort laden, speichern und mit Shift verketten.
  • AVX-512 Bit-Algorithmen (BITALG) – Byte/Wort- Bit-Manipulationsbefehle , die VPOPCNTDQ erweitern.
  • AVX-512 Bfloat16 Gleitkommabefehle (BF16) – Vektorbefehle für die KI-Beschleunigung.
  • AVX-512 Gleitkommabefehle mit halber Genauigkeit (FP16) – Vektorbefehle zum Arbeiten mit Gleitkommazahlen und komplexen Zahlen mit reduzierter Genauigkeit.

Lediglich die Core-Erweiterung AVX-512F (AVX-512 Foundation) wird von allen Implementierungen benötigt, wobei alle aktuellen Prozessoren auch CD (Conflict Detection) unterstützen; Computing-Coprozessoren werden zusätzlich ER, PF, 4VNNIW, 4FMAPS und VPOPCNTDQ unterstützen, während zentrale Prozessoren VL, DQ, BW, IFMA, VBMI, VPOPCNTDQ, VPCLMULQDQ usw. unterstützen.

Die aktualisierten SSE/AVX-Anweisungen in AVX-512F verwenden dieselben Mnemoniken wie AVX-Versionen; sie können mit 512-Bit-ZMM-Registern betrieben werden und werden auch 128/256-Bit-XMM/YMM-Register (mit AVX-512VL) sowie Byte-, Wort-, Doppelwort- und Vierwort-Integer-Operanden (mit AVX-512BW/DQ und VBMI) unterstützen.

CPUs mit AVX-512

AVX-512-Untergruppe F CD ER PF 4FMAPS 4VNNIW VPOPCNTDQ VL DQ BW IFMA VBMI VBMI2 BITALG VNN VPCLMULQDQ GFNI VAES VP2INTERSECT
Intel Knights Landung (2016) Jawohl Jawohl Nein
Intel Knights Mill (2017) Jawohl Nein
Intel Skylake-SP , Skylake-X (2017) Nein Jawohl Nein
Intel Cannon Lake (2018) Jawohl Nein
Intel Cascade Lake-SP (2019) Nein Jawohl Nein
Intel Eissee (2019) Nein Jawohl Nein
Intel Tiger Lake (2020) Jawohl
Intel Rocket Lake (2021) Nein

Compiler, die AVX-512 unterstützen

  • GCC 4.9 und höher
  • Clang 3.9 und neuer
  • ICC 15.0.1 und neuer
  • Microsoft Visual Studio 2017 C++-Compiler

AVX-VNNI

AVX-VNNI ist eine VEX- kodierte Variante der AVX512-VNNI- Befehlssatzerweiterung. Es bietet die gleichen Operationen, ist jedoch auf 256-Bit-Vektoren beschränkt und unterstützt keine zusätzlichen Funktionen der EVEX- Codierung wie Broadcasting, Opmask-Register oder den Zugriff auf mehr als 16 Vektorregister. Diese Erweiterung ermöglicht die Unterstützung von VNNI-Operationen, selbst wenn die volle AVX-512- Unterstützung vom Prozessor nicht implementiert wird.

CPUs mit AVX-VNNI

Anwendungen

  • Geeignet für Gleitkomma -intensive Berechnungen in Multimedia, Wissenschaft und Finanzanwendungen (AVX2 fügt Unterstützung für Integer - Operationen).
  • Erhöht Parallelität und Durchsatz bei Gleitkomma- SIMD- Berechnungen.
  • Reduziert die Registerbelastung aufgrund der zerstörungsfreien Befehle.
  • Verbessert die Leistung der Linux-RAID-Software (erforderlich AVX2, AVX ist nicht ausreichend)

Software

  • Blender verwendet AVX, AVX2 und AVX-512 in der Cycles-Render-Engine.
  • Bloombase verwendet AVX, AVX2 und AVX-512 in ihrem Bloombase Cryptographic Module (BCM).
  • Botan verwendet sowohl AVX als auch AVX2, wenn verfügbar, um einige Algorithmen wie ChaCha zu beschleunigen.
  • Crypto++ verwendet sowohl AVX als auch AVX2, wenn verfügbar, um einige Algorithmen wie Salsa und ChaCha zu beschleunigen.
  • OpenSSL verwendet seit Version 1.0.2 AVX- und AVX2-optimierte kryptografische Funktionen. Diese Unterstützung ist auch in verschiedenen Klonen und Forks vorhanden, wie LibreSSL
  • Prime95 /MPrime, die für GIMPS verwendete Software, verwendet seit Version 27.x die AVX-Anweisungen.
  • dav1d AV1- Decoder können AVX2 auf unterstützten CPUs verwenden.
  • dnetc , die von Distributed.net verwendete Software , verfügt über einen AVX2-Kern für sein RC5-Projekt und wird in Kürze einen für sein OGR-28-Projekt veröffentlichen.
  • Einstein@Home verwendet AVX in einigen ihrer verteilten Anwendungen, die nach Gravitationswellen suchen .
  • Folding@home verwendet AVX auf Rechenkernen, die mit der GROMACS- Bibliothek implementiert sind .
  • Helios verwendet AVX- und AVX2-Hardwarebeschleunigung auf 64-Bit-x86-Hardware.
  • Horizon: Zero Dawn verwendet AVX1 in seiner Decima-Spiel-Engine.
  • RPCS3 , ein Open Source PlayStation 3- Emulator, verwendet AVX2- und AVX-512- Anweisungen, um PS3-Spiele zu emulieren.
  • Network Device Interface , ein von NewTek entwickeltes IP-Video-/Audio-Protokoll für die Live-Broadcast-Produktion, verwendet AVX und AVX2 zur Leistungssteigerung.
  • TensorFlow seit Version 1.6 und tensorflow über Versionen erfordert eine CPU, die mindestens AVX unterstützt.
  • x264- , x265- und VTM -Videoencoder können AVX2 oder AVX-512 verwenden, um die Codierung zu beschleunigen.
  • Verschiedene CPU-basierte Kryptowährungs- Miner (wie der cpuminer von Pooler für Bitcoin und Litecoin ) verwenden AVX und AVX2 für verschiedene kryptografiebezogene Routinen, einschließlich SHA-256 und scrypt .
  • libsodium verwendet AVX bei der Implementierung der Skalarmultiplikation für die Algorithmen Curve25519 und Ed25519 , AVX2 für BLAKE2b , Salsa20 , ChaCha20 und AVX2 und AVX-512 bei der Implementierung des Argon2- Algorithmus.
  • libvpx Open-Source-Referenzimplementierung von VP8/VP9-Encoder/Decoder, verwendet AVX2 oder AVX-512, wenn verfügbar.
  • FFTW kann AVX, AVX2 und AVX-512 verwenden, wenn verfügbar.
  • LLVMpipe, ein Software-OpenGL-Renderer in Mesa , der Gallium- und LLVM- Infrastruktur verwendet, verwendet AVX2, wenn verfügbar.
  • glibc verwendet AVX2 (mit FMA ) zur optimierten Implementierung (dh expf, sinf, powf, atanf, atan2f) verschiedener mathematischer Funktionen in libc .
  • Der Linux-Kernel kann AVX oder AVX2 zusammen mit AES-NI als optimierte Implementierung des kryptografischen AES-GCM- Algorithmus verwenden.
  • Der Linux-Kernel verwendet AVX oder AVX2, wenn verfügbar, in optimierter Implementierung mehrerer anderer kryptografischer Verschlüsselungen: Camellia , CAST5 , CAST6 , Serpent , Twofish , MORUS-1280 und andere Primitive: Poly1305 , SHA-1 , SHA-256 , SHA-512 . ChaCha20 .
  • POCL, eine portable Computersprache, die OpenCL implementiert , verwendet nach Möglichkeit AVX, AVX2 und AVX512.
  • .NET und .NET Framework können AVX, AVX2 über den generischen System.Numerics.VectorsNamespace nutzen.
  • .NET Core kann ab Version 2.1 und ausführlicher nach Version 3.0 alle AVX-, AVX2-Intrinsics über den System.Runtime.Intrinsics.X86Namespace direkt verwenden .
  • EmEditor 19.0 und höher verwendet AVX-2, um die Verarbeitung zu beschleunigen.
  • Der Massive X Softsynth von Native Instruments benötigt AVX.
  • Microsoft Teams verwendet AVX2-Anweisungen, um einen verschwommenen oder benutzerdefinierten Hintergrund hinter Videochat-Teilnehmern zu erstellen und um Hintergrundgeräusche zu unterdrücken.
  • simdjson, eine JSON- Parsing-Bibliothek, verwendet AVX2, um eine verbesserte Decodierungsgeschwindigkeit zu erreichen.

Heruntertakten

Da AVX-Befehle breiter sind und mehr Wärme erzeugen, verfügen einige Intel-Prozessoren über Vorkehrungen, um die Turbo-Boost- Frequenzgrenze zu reduzieren , wenn solche Befehle ausgeführt werden. Bei Skylake und seinen Derivaten ist die Drosselung in drei Stufen unterteilt:

  • L0 (100%): Das normale Turbo-Boost-Limit.
  • L1 (~85%): Das "AVX-Boost"-Limit. Soft-getriggert durch 256-Bit-"Heavy"-Befehle (Gleitkommaeinheit: FP-Mathematik und Integer-Multiplikation). Hartgetriggert durch "leichte" (alle anderen) 512-Bit-Befehle.
  • L2 (~60%): Das Limit "AVX-512 Boost". Weichgetriggert durch 512-Bit schwere Befehle.

Der Frequenzübergang kann weich oder hart sein. Harter Übergang bedeutet, dass die Häufigkeit reduziert wird, sobald eine solche Anweisung entdeckt wird; weicher Übergang bedeutet, dass die Häufigkeit erst nach Erreichen einer Schwellenwertanzahl von übereinstimmenden Befehlen reduziert wird. Das Limit gilt pro Thread.

In Ice Lake bestehen nur zwei Ebenen:

  • L0 (100%): Das normale Turbo-Boost-Limit.
  • L1 (~97%): Ausgelöst durch alle 512-Bit-Befehle, aber nur, wenn Single-Core-Boost aktiv ist; wird nicht ausgelöst, wenn mehrere Kerne geladen werden.

Rocket-Lake- Prozessoren lösen bei der Ausführung jeglicher Art von Vektorbefehlen unabhängig von der Vektorgröße keine Frequenzreduktion aus. Aus anderen Gründen kann es jedoch trotzdem zu einem Heruntertakten kommen, z. B. beim Erreichen von Wärme- und Leistungsgrenzen.

Downclocking bedeutet, dass die Verwendung von AVX in einer gemischten Arbeitslast mit einem Intel-Prozessor zu einer Frequenzeinbuße führen kann, obwohl es in einem "reinen" Kontext schneller ist. Das Vermeiden von breiten und schweren Anweisungen hilft, die Auswirkungen in diesen Fällen zu minimieren. AVX-512VL ermöglicht die Verwendung von 256-Bit- oder 128-Bit-Operanden in AVX-512, was es zu einem sinnvollen Standard für gemischte Lasten macht.

Bei unterstützten und freigeschalteten Prozessorvarianten, die heruntertakten, sind die Verhältnisse einstellbar und können vollständig über Intels Overclocking / Tuning-Dienstprogramm oder im BIOS, falls dort unterstützt, ausgeschaltet (auf 0x gesetzt) ​​werden.

Siehe auch

Verweise

Externe Links