Extensions vectorials avançades

De la Viquipèdia, l'enciclopèdia lliure

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 [1] 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ó.[2]

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[modifica]

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 aa + b ara pot utilitzar una forma no destructiva de tres operands ca + 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.[3] 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.[4]

Referències[modifica]

  1. Kanter, David. «Intel's Sandy Bridge Microarchitecture» (en anglès americà). www.realworldtech.com, 25-09-2010. [Consulta: 17 febrer 2018].
  2. «Intel® Advanced Vector Extensions 2 (Intel® AVX2) - 009 - ID:655258 | 12th Generation Intel® Core™ Processors» (en anglès). [Consulta: 3 desembre 2023].
  3. «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. 
  4. «i386 and x86-64 Options - Using the GNU Compiler Collection (GCC)» (en anglès). [Consulta: 9 febrer 2014].