Advanced Vector Extensions
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 EVEX prefix proposé par Intel en . Les premiers processeurs le supportant sont les Knights Landing[2].
Advanced Vector Extensions
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 ZEROALL
.
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].
Applications
- Convient pour les calculs intensifs à virgule flottante dans le multimédia, les applications scientifiques et financières (les opérations entières sont attendues dans une extension ultérieure).
- Augmentation du parallélisme et le débit dans les calculs SIMD en virgule flottante.
- RĂ©duction de charge du registre due aux instructions non destructives.
- Améliore les performances du RAID logiciel sous Linux (AVX2 nécessaire, AVX ne suffit pas)[4].
- Prime95 / MPrime, et le logiciel GIMPS ayant permis de trouver le plus grand nombre premier Ă ce jour, utilisent les instructions AVX depuis la version 27.x.
Advanced Vector Extensions 2
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[5] :
- l'extension de la plupart des instructions AVX sur 128 bits sur les entiers Ă 256 bits,
- la récupération de données 32 ou 64 bits en mémoire non contiguës,
- la diffusion ou la permutation de données entre plusieurs mots de 128 bits,
- le décalage à gauche ou à droite d'éléments avec une valeur de décalage par élément.
Nouvelles instructions
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 soit la moitié inférieure ou soit 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 soit la moitié inférieure ou soit 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, l'é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[6]. |
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[7]. |
VPERM2F128 | Réassemble 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édiatement utilisable 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. |
Processeurs supportant AVX
- Intel
- Processeur Sandy Bridge, Q1 2011[8]
- Processeur Sandy Bridge E, Q4 2011
- Processeur Ivy Bridge, Q1 2012
- Processeur Ivy Bridge E, Q3 2013
- Processeur Haswell, Q2 2013, ajout de AVX2
- Processeur Haswell, Q3 2014
- Processeur Broadwell, Q4 2014
- Processeur Broadwell E, expected in 2016
- Processeur Skylake, Q3 2015
- Processeur Kaby Lake, Q3 2016
- Processeur Cannon Lake, Q2 2018
- AMD:
- Processeurs basés sur Bulldozer, Q4 2011[9]
- Processeurs basés sur Piledriver, Q4 2012[10]
- Processeurs basés sur Steamroller, Q1 2014
- Processeurs basés sur Excavator, Q3 2015
- Processeurs basés sur Jaguar
- Processeurs basés sur Puma
- Processeurs basés sur Zen (processeurs Ryzen), Q1 2017, ajout de AVX2
- Processeurs basés sur Zen 2, Q3 2019
- Processeurs basés sur Zen 3, Q4 2020
Les questions relatives à la compatibilité entre les futurs processeurs Intel et AMD sont examinées sous le jeu d'instruction XOP.
Support des compilateurs et assembleurs
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[11], FASM, MSNA et JWASM supportent AVX.
Système d'exploitation
La version des systèmes d'exploitation à partir duquel le jeu d'instruction AVX est pris en charge.
- Apple OS X : 10.6.8(Snow Leopard) mise à jour[12] publié le .
- Linux : supporté depuis la version du noyau 2.6.30[13], publié le [14].
- Windows : Windows 7 SP1 et Windows Server 2008 R2 SP1[15], Windows 8, Windows Server 2008 R2 SP1 avec Hyper-V nécessite un correctif pour soutenir AMD AVX (Opteron 6200 et série 4200), KB2568088[16].
- FreeBSD dans un patch présenté le [17], qui a été inclus dans la version stable 9.1[18].
- DragonFly BSD supporté au début 2013.
- OpenBSD ajouté le [19].
- Solaris 10 Mise Ă jour 10 et Solaris 11.
Références
- (en) Cet article est partiellement ou en totalité issu de l’article de Wikipédia en anglais intitulé « Advanced Vector Extensions » (voir la liste des auteurs).
- (en) « Haswell New Instruction Descriptions Now Available! | Intel® Developer Zone », sur software.intel.com, (consulté le )
- (en) « AVX-512 instructions | Intel® Developer Zone », (consulté le )
- « i386 and x86-64 Options - Using the GNU Compiler Collection (GCC) », sur gcc.gnu.org (consulté le )
- « Kernel/git/torvalds/linux.git », sur kernel.org (consulté le ).
- (en) Intel® 64 and IA-32 Architectures Software Developer’s Manual, vol. 1 : Basic Architecture, Intel Corporation, , 460 p. (lire en ligne [PDF]), chap. 14, p. 350 (14-26 Vol.1)
- (en) Agner Fog, « The microarchitecture of Intel, AMD and VIA CPUs — An optimization guide for assembly programmers and compiler makers » [PDF], (consulté le )
- https://chessprogramming.wikispaces.com/AVX2
- (en) « Intel Offers Peek at Nehalem and Larrabee - ExtremeTech », sur ExtremeTech, (consulté le ).
- http://developer.amd.com/community/blog/2009/05/06/striking-a-balance/
- http://developer.amd.com/wordpress/media/2012/10/New-Bulldozer-and-Piledriver-Instructions.pdf
- (en) « Yasm 0.7.0 - The Yasm Modular Assembler Project », sur tortall.net (consulté le ).
- « Comex on Twitter », sur Twitter (consulté le ).
- « Kernel/git/torvalds/linux.git », sur kernel.org (consulté le ).
- « Linux_2_6_30 », sur kernelnewbies.org (consulté le ).
- (en) « Using extended processor features in Windows drivers », sur microsoft.com (consulté le ).
- « https://support.microsoft.com/en-us/help/2568088/virtual-machine-does-not-start-on-a-computer-that-has-an-amd-cpu-that », sur support.microsoft.com (consulté le )
- (en) « Revision 230426 », sur freebsd.org (consulté le ).
- (en) « FreeBSD 9.1-RELEASE Announcement », sur The FreeBSD Project (consulté le ).
- « 'CVS : cvs.openbsd.org : src' », sur marc.info (consulté le ).