# Extensions vectorials avançades

Les extensions vectorials avançades (AVX) són extensions SIMD de l'arquitectura del conjunt d'instruccions x86 per a microprocessadors d'Intel i Advanced Micro Devices (AMD). Van ser proposats per Intel el març de 2008 i amb el suport d'Intel amb el processador Sandy Bridge enviat el primer trimestre de 2011 i més tard per AMD amb el processador Bulldozer enviat el tercer trimestre de 2011. AVX ofereix noves funcions, noves instruccions i un nou esquema de codificació.
AVX2 (també conegut com Haswell New Instructions ) amplia la majoria de les ordres enteres a 256 bits i introdueix noves instruccions. Per primera vegada van ser compatibles amb Intel amb el processador Haswell, que es va enviar el 2013.
AVX-512 amplia el suport AVX a 512 bits mitjançant una nova codificació de prefix EVEX proposada per Intel el juliol de 2013 i suportada per primera vegada per Intel amb el coprocessador Knights Landing, que es va enviar el 2016. En els processadors convencionals, AVX-512 es va introduir amb el servidor Skylake i els processadors HEDT el 2017.

## Extensions vectorials avançades

AVX utilitza setze registres YMM per dur a terme una única instrucció en múltiples peces de dades (vegeu SIMD). Cada registre YMM pot contenir i fer operacions simultànies (matemàtiques) a:
* vuit nombres de coma flotant de precisió única de 32 bits o
* quatre nombres de coma flotant de doble precisió de 64 bits.
L'amplada dels registres SIMD s'augmenta de 128 bits a 256 bits, i es canvia el nom de XMM0–XMM7 a YMM0–YMM7 (en mode x86-64, de XMM0–XMM15 a YMM0–YMM15). Les instruccions SSE heretades encara es poden utilitzar mitjançant el prefix VEX per operar amb els 128 bits inferiors dels registres YMM.
Esquema de registre AVX-512 com a extensió dels registres AVX (YMM0-YMM15) i SSE (XMM0-XMM15):
| 511 256 | 255 128 | 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 |
AVX introdueix un format d'instrucció SIMD de tres operands anomenat esquema de codificació VEX, on el registre de destinació és diferent dels dos operands d'origen. Per exemple, una instrucció SSE que utilitza la forma convencional de dos operands a ← a + b ara pot utilitzar una forma no destructiva de tres operands c ← a + b, conservant els dos operands font. Originalment, el format de tres operands d'AVX es limitava a les instruccions amb operands SIMD (YMM) i no incloïa instruccions amb registres de propòsit general (per exemple, EAX). Més tard es va utilitzar per codificar noves instruccions sobre registres de propòsit general en extensions posteriors, com ara l'IMC. La codificació VEX també s'utilitza per a instruccions que operen en els registres de màscara k0-k7 que es van introduir amb AVX-512.
El requisit d'alineació dels operands de memòria SIMD es relaxa. A diferència dels seus homòlegs no codificats VEX, la majoria de les instruccions vectorials codificades VEX ja no requereixen que els seus operands de memòria estiguin alineats amb la mida del vector. En particular, la instrucció VMOVDQA encara requereix que el seu operand de memòria estigui alineat.
El nou esquema de codificació VEX introdueix un nou conjunt de prefixos de codi que amplia l'espai del codi operatiu, permet que les instruccions tinguin més de dos operands i que els registres vectorials SIMD siguin més llargs de 128 bits. El prefix VEX també es pot utilitzar a les instruccions SSE heretades, donant-los una forma de tres operands i fent-les interactuar de manera més eficient amb les instruccions AVX sense necessitat de VZEROUPPER i VZEROALL.
Les instruccions AVX admeten SIMD de 128 i 256 bits. Les versions de 128 bits poden ser útils per millorar el codi antic sense necessitat d'ampliar la vectorització, i evitar la penalització de passar de SSE a AVX, també són més ràpides en algunes implementacions primerenques d'AVX d'AMD. Aquest mode de vegades es coneix com AVX-128.

## Referències

* ↑ Kanter, David. «Intel's Sandy Bridge Microarchitecture» (en anglès americà). www.realworldtech.com, 25-09-2010. [Consulta: 17 febrer 2018].
* ↑ «Intel® Advanced Vector Extensions 2 (Intel® AVX2) - 009 - ID:655258 | 12th Generation Intel® Core™ Processors» (en anglès). [Consulta: 3 desembre 2023].
* ↑ «14.9». A: Intel 64 and IA-32 Architectures Software Developer's Manual Volume 1: Basic Architecture (en anglès). -051US. Intel Corporation, p. 349.
* ↑ «i386 and x86-64 Options - Using the GNU Compiler Collection (GCC)» (en anglès). [Consulta: 9 febrer 2014].