title: Advanced Vector Extension
text: # Advanced Vector Extension
  
  Con il nome di Advanced Vector Extension (abbreviate in AVX) viene indicato un set di istruzioni SIMD proposte e sviluppate da Intel, annunciate durante l'Intel Developer Forum del 2008, e che segue alle SSE4 grazie all'architettura di decima generazione conosciuta come Sandy Bridge, successiva a Nehalem.
  
  ## Caratteristiche tecniche
  
  Queste istruzioni prevedono l'introduzione di vettori a 256 bit (a differenza di quelli a 128 bit usati precedentemente) che consentiranno di ottenere un raddoppio dei calcoli in virgola mobile e migliorare l'organizzazione dei dati, rendendola più efficiente; le istruzioni a 128 bit verranno comunque eseguite sfruttando la metà inferiore dei nuovi registri ed è probabile una futura ulteriore espansione a 512 bit o addirittura 1024 bit.
  
  Inoltre, il limite di istruzioni con al più 2 operandi verrà esteso fino a 3 operandi in maniera non distruttiva qualora il registro di destinazione sia differente dai 2 registri sorgente: ciò significa che ad esempio l'operazione $a=a+b$ verrà rimpiazzata da $c=a+b$ in modo che il registro $a$ rimanga inalterato dopo l'esecuzione dell'istruzione.
  
  ### Benefici nelle applicazioni
  
  Le applicazioni che dovrebbero trarre i maggiori benefici dovrebbero essere quelle di tipo multimediale, in particolare quelle di modellazione 3D e di calcolo scientifico, anche in virtù del fatto che la scalabilità in relazione al numero di core del processore dovrebbe essere massima, e questo tipo di applicazioni sono proprio quelle che sono comunque in grado di avvantaggiarsi di un alto numero di core.
  
  Le istruzioni AVX dovrebbero consentire inoltre di accelerare i calcoli relativi alla criptazione AES.
  
  ## Advanced Vector Extensions 2
  
  Advanced Vector Extensions 2 (AVX2), noto anche come Haswell New Instructions, è un'espansione del set di istruzioni AVX introdotto nella microarchitettura Haswell di Intel. AVX2 apporta le seguenti aggiunte:
  
  * espansione della maggior parte delle istruzioni SSE e AVX a 256 bit.
  * manipolazione e moltiplicazione dei bit per uso generale a tre operandi
  * raccogliere il supporto, consentendo il caricamento di elementi vettoriali da posizioni di memoria non contigue
  * DWORD- e QWORD- a qualsiasi permanente
  * spostamenti vettoriali
  
  A volte un'altra estensione che utilizza un diverso flag cpuid è considerata parte dell'AVX2; queste istruzioni sono elencate nella propria pagina e non di seguito:
  
  * supporto FMA a tre operandi (FMA3)
  
  ### Nuove istruzioni
  
  | Istruzioni | Descrizione |
  | - | - |
  | VBROADCASTSS, VBROADCASTSD | Copiare un operando di registro a 32 o 64 bit su tutti gli elementi di un registro vettoriale XMMM o YMMM. Queste sono versioni di registro delle stesse istruzioni nell'AVX1. Non esiste tuttavia una versione a 128 bit, ma lo stesso effetto può essere ottenuto semplicemente utilizzando VINSERTF128. |
  | VPBROADCASTB, VPBROADCASTW, VPBROADCASTD, VPBROADCASTQ | Copiare un registro intero a 8, 16, 32 o 64 bit o un operando in memoria su tutti gli elementi di un registro vettoriale XMMM o YMMM. |
  | VBROADCASTI128 | Copiare un operando di memoria a 128 bit su tutti gli elementi di un registro vettoriale YMMM. |
  | VINSERTI128 | Sostituisce la metà inferiore o superiore di un registro YMMM a 256 bit con il valore di un operando sorgente a 128 bit. L'altra metà della destinazione rimane invariata. |
  | VEXTRACTI128 | Estrae la metà inferiore o superiore di un registro YMMM a 256 bit e copia il valore in un operando di destinazione a 128 bit. |
  | VGATHERDPD, VGATHERQPD, VGATHERDPS, VGATHERQPS | Raccoglie valori in virgola mobile a singola o doppia precisione utilizzando indici e scale a 32 o 64 bit. |
  | VPGATHERDD, VPGATHERDQ, VPGATHERQD, VPGATHERQQ | Raccoglie valori interi a 32 o 64 bit utilizzando indici e scale a 32 o 64 bit. |
  | VPMASKMOVD, VPMASKMOVQ | Legge condizionalmente un qualsiasi numero di elementi da un operando di memoria vettoriale SIMD in un registro di destinazione, lasciando i restanti elementi vettoriali non letti e azzerando gli elementi corrispondenti nel registro di destinazione. In alternativa, scrive condizionalmente un qualsiasi numero di elementi da un operando del registro vettoriale SIMD ad un operando a memoria vettoriale, lasciando invariati i restanti elementi dell'operando in memoria. |
  | VPERMPS, VPERMD | Mescolare gli otto elementi vettoriali a 32 bit di un operando sorgente a 256 bit in un operando di destinazione a 256 bit, con un registro o un operando di memoria come selettore. |
  | VPERMPD, VPERMQ | Mescolare i quattro elementi vettoriali a 64 bit di un operando sorgente a 256 bit in un operando di destinazione a 256 bit, con un registro o un operando di memoria come selettore. |
  | VPERM2I128 | Mescolare i quattro elementi vettoriali a 128 bit di due operandi sorgente a 256 bit in un operando di destinazione a 256 bit, con una costante immediata come selettore. |
  | VPBLENDD | Versione immediata a doppia parola delle istruzioni PBLEND di SSE4. |
  | VPSLLVD, VPSLLVQ | Spostamento logico a sinistra. Permette spostamenti variabili in cui ogni elemento viene spostato in base all'input confezionato. |
  | VPSRLVD, VPSRLVQ | Spostare logico a destra. Permette spostamenti variabili in cui ogni elemento viene spostato in base all'input confezionato. |
  | VPSRAVD | Spostare aritmeticamente a destra. Permette spostamenti variabili in cui ogni elemento viene spostato in base all'input confezionato. |
  
  ### CPU con AVX2
  
  * Intel
     * Haswell, Q2 2013
     * Haswell E, Q3 2014
     * Broadwell, Q4 2014
     * Broadwell E, Q3 2016
     * Skylake, Q3 2015
     * Kaby Lake, Q3 2016 (ULV mobile) / Q1 2017 (desktop/mobile)
     * Skylake-X, Q2 2017
     * Coffee Lake, Q4 2017
     * Cannon Lake, previsto nel 2018
     * Cascade Lake, previsto nel 2018
     * Ice Lake, previsto nel 2018
  * AMD
     * Excavator e successivi, Q2 2015
     * Zen, Q1 2017
     * Zen+, Q2 2018
  