Loading AI tools
extension vectorielle du jeu d'instruction de l'architecture x86 ajoutant des instructions vectorielles De Wikipédia, l'encyclopédie libre
Advanced Vector Extensions (AVX) est un jeu d'instructions de l'architecture x86 d'Intel et AMD, proposé par Intel en . Il est supporté par les processeurs Intel Sandy Bridge et par les processeurs AMD Bulldozer en 2011. AVX offre de nouvelles fonctionnalités, de nouvelles instructions et un nouveau schéma de codage « VEX ».
AVX2 élargit la plupart des commandes SSE et AVX 128 bits en 256 bits[1]. Il est supporté par les processeurs Intel Haswell en 2013 et par les processeurs AMD Excavator en 2015.
AVX-512 étend le nombre de registres SIMD à 32 et les élargit à 512 bits. Il utilise un nouveau codage utilisant le préfixe EVEX (en) proposé par Intel en . Les premiers processeurs le supportant sont les Knights Landing[2].
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 |
La largeur des registres SIMD est passée de 128 bits à 256 bits, renommant les registres XMM0-XMM7 en YMM0-YMM7 en mode 32 bits et ajoutant 8 registres YMM8-YMM15 en mode 64 bits. Sur les processeurs supportant AVX, les instructions SSE (qui opéraient auparavant sur les registres XMM de 128 bits) peuvent être étendues en utilisant le préfixe VEX (en) pour fonctionner sur les 128 bits de poids faibles des registres YMM.
AVX introduit un format d'instruction SIMD à trois opérandes, dans lequel le registre de destination est distinct des deux opérandes source. Par exemple, une instruction SSE classique à deux opérandes sous la forme A = A + B devra écrire par-dessus l'opérande A pour stocker le résultat. AVX est capable de préserver les opérandes source en utilisant un opérande destination différent, par le biais de la forme C = A + B. Le format SIMD à trois opérandes de AVX est limité aux registres YMM, et ne comprend pas d'instruction avec les registres d'usage général (par exemple EAX)[1].
Le nouveau schéma de codage VEX introduit une nouvelle série de préfixes de code qui étend l'espace d'opcode,
permettant d'avoir des instructions ayant plus de deux opérandes, et permet aux registres SIMD d'utiliser des vecteurs à plus de 128 bits.
Le préfixe VEX peut également être utilisé sur les anciennes instructions SSE en leur donnant une forme à trois opérandes, et leur permettre d’interagir plus efficacement avec des instructions AVX sans utiliser nécessairement VZEROUPPER
et VZEROALL
.
Les instructions AVX supportent des valeurs à la fois 128 bits et 256 bits. Les versions 128 bits peuvent être utiles pour améliorer d'anciens codes sans avoir besoin d'accroître la vectorisation et pour éviter la pénalité du passage de SSE à AVX, Ce mode est parfois connu comme AVX-128[3].
Instruction | Description |
---|---|
VBROADCASTSS ,VBROADCASTSD ,VBROADCASTF128 | Copie un nombre flottant 32 bits (simple précision), 64 bits (double précision) ou 128 bits d'un opérande mémoire dans tous les éléments d'un registre vectoriel XMM (128 bits) ou YMM (256 bits). |
VINSERTI128 | Remplace la moitié inférieure ou la moitié supérieure d'un registre de 256 bits YMM, avec la valeur d'un opérande source de 128 bits. L'autre moitié du registre de 256 bits YMM, considérée, est inchangée. |
VEXTRACTF128 | Extrait la moitié inférieure ou la moitié supérieure d'un registre de 256 bits YMM et copie cette valeur dans un opérande de destination de 128 bits. |
VMASKMOVPS ,VMASKMOVPD | Lit conditionnellement un nombre quelconque d'éléments d'un opérande de mémoire vectorielle SIMD dans un registre de destination, laissant les éléments vectoriels restants typés "non lus" et mettant les éléments correspondants dans le registre de destination à zéro. Alternativement, écriture conditionnelle d'un nombre quelconque d'éléments d'un opérande de registre vectoriel SIMD vers un opérande de mémoire vectorielle, laisse inchangés les éléments restants de l'opérande de mémoire.
Sur l'architecture du processeur AMD Jaguar, cette instruction avec un opérande source de mémoire prend plus de 300 cycles d'horloge lorsque le masque est à zéro, auquel cas l'instruction ne devrait rien faire. Cela semble être un défaut de conception[5]. |
VPERMILPS ,VPERMILPD | Permute en ligne et assemble les éléments vectoriels d'un opérande d'entrée de 32 bits ou 64 bits. Ces instructions en ligne de 256 bits, fonctionnent sur l'intégralité des 256 bits mais sont constituées de deux blocs distincts de 128 bits, de sorte qu'il ne peut y avoir de mélange entre ces deux blocs[6]. |
VPERM2F128 | Permute les quatre éléments vectoriels 128 bits de deux opérandes sources de 256 bits en un opérande destination de 256 bits, avec une constante immédiate comme sélecteur. |
VZEROALL | Met à zéro l'ensemble des registres YMM et les marque « inutilisés ». Cette instruction est utilisée lors de la commutation entre les modes 128 bits et 256 bits. |
VZEROUPPER | Met à zéro la moitié supérieure de l'ensemble des registres YMM (bits de poids forts). Cette instruction est utilisée lors de la commutation entre les modes 128 bits et 256 bits. |
Les questions relatives à la compatibilité entre les futurs processeurs Intel et AMD sont examinées vis-à-vis du jeu d'instructions XOP (en) proposé par AMD sur Bulldozer mais retiré à partir de l'architecture Zen.[pas clair]
Le compilateur GCC intègre le support AVX à partir de la version 4.6 (même si la version 4.3 intégrait partiellement AVX), Intel Suite l'intègre à partir de la version 11.1, le compilateur Visual Studio l'intègre à partir de la version 2010/2012, La version du compilateur d'Open64 4.5.1 le prend en charge si le flag -mavx est activé, PathScale supporte lui aussi AVX si le flag -mavx ainsi que Vector Pascal (en) via le flag -cpuAVX32.
Free Pascal supporte AVX et AVX2 depuis la version 2.7.1 avec les paramètres -CfAVX et -CfAVX2.
D'autres assembleurs tels que NASM, MASM VS2010, Yasm[10], FASM, MSNA et JWASM supportent AVX.
La version des systèmes d'exploitation à partir duquel le jeu d'instructions AVX est pris en charge.
Advanced Vector Extensions 2 (AVX2), aussi connues sous le nom nouvelles instructions Haswell[1], sont une extension du jeu d'instructions AVX introduite dans l'architecture Haswell. AVX2 supporte notamment[19] :
Instruction | Description |
---|---|
VBROADCASTSS , VBROADCASTSD |
Copie un opérande de registre 32 bits ou 64 bits dans tous les éléments d’un registre vectoriel XMM ou YMM. Il s’agit de versions pour registre des mêmes instructions dans AVX1. Il n’existe cependant pas de version 128 bits, mais le même effet peut être simplement obtenu en utilisant VINSERTF128. |
VPBROADCASTB , VPBROADCASTW , VPBROADCASTD , VPBROADCASTQ |
Copie un registre entier de 8, 16, 32 ou 64 bits ou un opérande mémoire dans tous les éléments d’un registre vectoriel XMM ou YMM. |
VBROADCASTI128 |
Copie un opérande de mémoire 128 bits dans tous les éléments d’un registre vectoriel YMM. |
VINSERTI128 |
Remplace la moitié inférieure ou la moitié supérieure d’un registre YMM de 256 bits par la valeur d’un opérande source de 128 bits. L’autre moitié de la destination est inchangée. |
VEXTRACTI128 |
Extrait la moitié inférieure ou la moitié supérieure d’un registre YMM de 256 bits et copie la valeur dans un opérande de destination de 128 bits. |
VGATHERDPD , VGATHERQPD , VGATHERDPS , VGATHERQPS |
Collecte/diffuse (en) des valeurs en virgule flottante simple ou double précision à l’aide d’indices 32 ou 64 bits et d’une échelle. |
VPGATHERDD , VPGATHERDQ , VPGATHERQD , VPGATHERQQ |
Rassemble/diffuse des valeurs entières de 32 ou 64 bits à l’aide d’indices 32 ou 64 bits et d'une échelle. |
VPMASKMOVD , VPMASKMOVQ |
Lit conditionnellement n’importe quel nombre d’éléments d’un opérande de mémoire vectorielle SIMD dans un registre de destination, en laissant les éléments vectoriels restants non lus et en mettant à zéro les éléments correspondants dans le registre de destination. Alternativement, écrit conditionnellement n’importe quel nombre d’éléments d’un opérande de registre vectoriel SIMD dans un opérande de mémoire vectorielle, en laissant les éléments restants de l’opérande de mémoire inchangés. |
VPERMPS , VPERMD |
Permute les huit éléments vectoriels 32 bits d’un opérande source 256 bits dans un opérande de destination 256 bits, avec un opérande de registre ou de mémoire comme sélecteur. |
VPERMPD , VPERMQ |
Permute les quatre éléments vectoriels 64 bits d’un opérande source 256 bits dans un opérande de destination 256 bits, avec un opérande de registre ou de mémoire comme sélecteur. |
VPERM2I128 |
Permute (deux des) quatre éléments vectoriels 128 bits de deux opérandes sources 256 bits dans un opérande de destination 256 bits, avec une constante immédiate comme sélecteur. |
VPBLENDD |
Version immédiate double mot des instructions PBLEND de SSE4. |
VPSLLVD , VPSLLVQ |
Décalage logique vers la gauche. Permet des décalages variables où chaque élément est décalé en fonction de l’entrée compressée. |
VPSRLVD , VPSRLVQ |
Décalage logique vers la droite. Permet des décalages variables où chaque élément est décalé en fonction de l’entrée compressée. |
VPSRAVD |
Décalage arithmétique vers la droite. Permet des décalages variables où chaque élément est décalé en fonction de l’entrée compressée. |
AVX-512 désigne des extensions 512 bits des instructions SIMD 256 bits Advanced Vector Extensions pour l’architecture du jeu d’instructions x86 proposées par Intel en juillet 2013, et sont prises en charge par le processeur Knights Landing d’Intel[20].
Les instructions d’AVX-512 sont encodées avec le nouveau préfixe EVEX (en). Il permet 4 opérandes, 8 nouveaux registres opmask 64 bits, un mode de mémoire scalaire avec diffusion automatique, un contrôle d’arrondi explicite et un mode d'adressage de mémoire à déplacement compressé. La largeur du fichier de registre est augmentée à 512 bits et le nombre total de registres est porté à 32 (registres ZMM0-ZMM31) en mode x86-64.
AVX-512 se compose de plusieurs sous-ensembles d’instructions, qui ne sont pas tous destinés à être pris en charge par tous les processeurs qui les implémentent. Le jeu d’instructions se compose des éléments suivants :
Seule l’extension de base AVX-512F (AVX-512 Foundation) est requise par toutes les implémentations, bien que toutes les implémentations actuelles prennent également en charge le CD (détection de conflit). Tous les CPU avec AVX-512 prennent également en charge VL, DQ et BW. Les extensions de jeu d’instructions ER, PF, 4VNNIW et 4FMAPS ne sont actuellement implémentées que dans les coprocesseurs de calcul Intel.
Les instructions SSE/AVX mises à jour dans AVX-512F utilisent les mêmes mnémoniques que les versions AVX ; elles peuvent fonctionner sur des registres ZMM 512 bits, et prendront également en charge les registres XMM/YMM 128/256 bits (avec AVX-512VL) et les opérandes entiers sur octets, mots, doubles mots et de quadruples mots (avec AVX-512BW/DQ et VBMI)[22]:23.
Sous-ensemble AVX-512 |
F | CD | ER | PF | 4FMAPS | 4VNNIW | VPOPCNTDQ | VL | DQ | BW | IFMA | VBMI | VBMI2 | BITALG | VNNI | BF16 | VPCLMULQDQ | GFNI | VAES | VP2INTERSECT | FP16 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Intel Knights Landing (2016) | Oui | Oui | Non | ||||||||||||||||||
Intel Knights Mill (2017) | Oui | Non | |||||||||||||||||||
Intel Skylake-SP, Skylake-X (2017) | Non | Non | Oui | Non | |||||||||||||||||
Intel Cannon Lake (en) (2018) | Oui | Non | |||||||||||||||||||
Intel Cascade Lake-SP (2019) | Non | Oui | Non | ||||||||||||||||||
Intel Cooper Lake (2020) | Non | Oui | Non | ||||||||||||||||||
Intel Ice Lake (2019) | Oui | Non | Oui | Non | |||||||||||||||||
Intel Tiger Lake (2020) | Oui | Non | |||||||||||||||||||
Intel Rocket Lake (2021) | Non | ||||||||||||||||||||
Intel Alder Lake (2021) | Non officiellement supporté, mais peut être activé sur certaines cartes mères avec certaines versions du BIOS[note 1] | ||||||||||||||||||||
AMD Zen 4 (2022) | Oui | Oui | Non | ||||||||||||||||||
Intel Sapphire Rapids (en) (2023) | Non | Oui | |||||||||||||||||||
AMD Zen 5 (2024) | Oui | Non |
AVX-VNNI est une variante codée VEX (en) de l’extension du jeu d’instructions AVX512-VNNI. De même, AVX-IFMA est une variante codée VEX du jeu d'instructions AVX512-IFMA. Ces extensions fournissent les mêmes ensembles d’opérations que leurs homologues AVX-512, mais sont limitées aux vecteurs 256 bits et ne prennent pas en charge les fonctionnalités supplémentaires de l’encodage EVEX, telles que la diffusion, les registres opmask ou l’accès à plus de 16 registres vectoriels. Ces extensions permettent la prise en charge des opérations VNNI et IFMA même lorsque la prise en charge complète d’AVX-512 n’est pas implémentée dans le processeur.
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.