O Advanced Vector Extension (AVX)[1], também conhecido como Sandy Bridge New Extensions, são extensões da arquitetura do conjunto de instruções x86 para microprocessadores da Intel e da AMD, propostas pela Intel em março de 2008 e primeiramente suportada pela Intel com o processador Sandy Bridge[2] no início de 2011, e mais tarde então pela AMD, com o processador Bulldozer[3], lançado no final do mesmo ano. O AVX fornece novos recursos, instruções e um novo esquema de codificação.
O AVX2 expande a maioria dos comandos inteiros para 256 bits e apresenta operações de multiplicação acumulada fundidas (FMA). O AVX-512 expande o AVX para o suporte de 512 bits usando uma nova codificação de prefixo EVEX, proposta pela Intel em julho de 2013 e suportada pela primeira vez por ela, com o processador Knights Landing, lançado em 2016.[4]
O AVX utiliza dezesseis registradores YMM. Cada registrador YMM contém:
A largura do arquivo de registro SIMD é aumentada de 128 bits para 256 bits e renomeada de XMM0 – XMM7 para YMM0 – YMM7 (no modo x86-64, YMM0 – YMM15). Em processadores com o suporte a AVX, as instruções SSE (anteriormente operavam em registradores XMM de 128 bits) podem ser estendidas usando o prefixo VEX para operar nos 128 bits mais baixos dos registradores YMM.
Ele introduz um formato de instrução SIMD de três operandos, em que o registrador de destino é distinto dos dois operandos de origem. Por exemplo, uma instrução SSE usando a forma convencional de dois operandos a = a + b agora pode usar uma forma não destrutiva de três operandos c = a + b, preservando ambos os operandos fonte. O formato de três operandos do AVX é limitado às instruções com operandos SIMD (YMM) e não inclui instruções com registradores de propósito geral (por exemplo, EAX) (esse suporte aparecerá pela primeira vez no AVX2[5]). O novo esquema de codificação VEX introduz um novo conjunto de prefixos de código que estende o espaço do opcode, permitindo que as instruções tenham mais de dois operandos e que os registradores vetoriais SIMD sejam maiores que 128 bits. O prefixo VEX também pode ser usado nas instruções herdadas do SSE, dando-lhes um formato de três operandos, e fazendo com que eles interajam mais eficientemente com as instruções do AVX, sem a necessidade de VZEROUPPER e ZEROALL.
As instruções do AVX suportam o SIMD de 128 bits e 256 bits. As versões de 128 bits podem ser úteis para melhorar o código antigo sem a necessidade de ampliar a vetorização, evitando assim a penalidade de ir do SSE para o AVX. Elas são mais rápidas em algumas implementações iniciais do AMD do AVX (este modo é conhecido como AVX-128[6]).
Estas instruções são adicionais às que são extensões de 256 bits das instruções SSE de 128 bits e a maioria é utilizável em operandos de 128 e 256 bits[1].
Instrução | Descrição |
---|---|
VBROADCASTSS , VBROADCASTSD , VBROADCASTF128
|
Copia um operando de memória de 32 bits, 64 bits ou 128 bits para todos os elementos de um registrador vetorial XMM ou YMM. |
VINSERTF128
|
Substitui a metade inferior ou a metade superior de um registrador YMM de 256 bits pelo valor de um operando de origem de 128 bits. A outra metade do destino não é alterada. |
VEXTRACTF128
|
Extrai a metade inferior ou a metade superior de um registrador YMM de 256 bits e copia o valor para um operando de destino de 128 bits. |
VMASKMOVPS , VMASKMOVPD
|
Lê qualquer número de elementos de um operando de memória vetorial SIMD em um registrador de destino, deixando os elementos vetoriais restantes não lidos e definindo os elementos correspondentes no registrador de destino para zero. Grava qualquer número de elementos de um operando de registrador vetorial SIMD em um operando de memória de vetores, deixando os demais elementos do operando de memória inalterados. |
VPERMILPS , VPERMILPD
|
Embaralha os elementos vetoriais de 32 bits ou 64 bits de um operando de entrada. Estas são instruções de 256 bits em pista, o que significa que elas operam em todos os 256 bits com dois shuffles de 128 bits separados, de modo que não podem ser reproduzidos aleatoriamente nas pistas de 128 bits. |
VPERM2F128
|
Embaralha os quatro elementos de vetor de 128 bits de dois operandos de fonte de 256 bits em um operando de destino de 256 bits, com uma constante imediata como seletor |
VZEROALL
|
Define todos os registradores YMM para zero e marca-os como não utilizados. Usado ao alternar entre o uso de 128 bits e o uso de 256 bits. |
VZEROUPPER
|
Ajusta a metade superior de todos os registradores YMM para zero. Utilizado ao alternar entre o uso de 128 bits e o uso de 256 bits. |
Intel:
Nem todas as CPUs das famílias listadas acima suportam o AVX. Geralmente, CPUs com a denominação "Core i3/i5/i7" as suportam, já as CPUs "Pentium" e "Celeron" não.
AMD:
O AVX adiciona um novo estado de registro através do arquivo de registro YMM de 256 bits, portanto, é necessário suporte explícito ao sistema operacional para salvar e restaurar adequadamente os registros expandidos do AVX entre os comutadores de contexto. As seguintes versões dos sistemas operacionais suportam o AVX:
O Advanced Vector Extensions 2 (AVX2), também conhecido como Haswell New Instructions[5], é uma expansão do conjunto de instruções AVX introduzido na microarquitetura Haswell da Intel. O AVX2 faz as seguintes adições:
Instrução | Descrição |
---|---|
VBROADCASTSS , VBROADCASTSD
|
Copia um operando de registrador de 32 bits ou 64 bits para todos os elementos de um registrador vetorial XMM ou YMM. Estas são versões de registradores das mesmas instruções no AVX1. No entanto, não existe uma versão de 128 bits, mas o mesmo efeito pode ser alcançado simplesmente usando o VINSERTF128. |
VPBROADCASTB , VPBROADCASTW , VPBROADCASTD , VPBROADCASTQ
|
Copia um registrador inteiro de 8, 16, 32 ou 64 bits ou um operando de memória para todos os elementos de um registrador vetorial XMM ou YMM. |
VBROADCASTI128
|
Copia um operando de memória de 128 bits para todos os elementos de um registrador vetorial YMM. |
VINSERTI128
|
Substitui a metade inferior ou a metade superior de um registrador YMM de 256 bits pelo valor de um operando de origem de 128 bits. A outra metade do destino não é alterada. |
VEXTRACTI128
|
Extrai a metade inferior ou a metade superior de um registro YMM de 256 bits e copia o valor para um operando de destino de 128 bits. |
VGATHERDPD , VGATHERQPD , VGATHERDPS , VGATHERQPS
|
Reúne valores de ponto flutuante de precisão simples ou dupla usando índices e escala de 32 ou 64 bits. |
VPGATHERDD , VPGATHERDQ , VPGATHERQD , VPGATHERQQ
|
Reúne valores inteiros de 32 ou 64 bits usando índices e escala de 32 ou 64 bits. |
VPMASKMOVD , VPMASKMOVQ
|
Lê qualquer número de elementos de um operando de memória vetorial SIMD em um registrador de destino, deixando os elementos vetoriais restantes não lidos e definindo os elementos correspondentes no registrador de destino para zero. Grava qualquer número de elementos de um operando de registrador vetorial SIMD em um operando de memória de vetores, deixando os demais elementos do operando de memória inalterados. |
VPERMPS , VPERMD
|
Embaralha os oito elementos vetoriais de 32 bits de um operando fonte de 256 bits em um operando de destino de 256 bits, com um registrador ou operando memória como seletor. |
VPERMPD , VPERMQ
|
Embaralha os quatro elementos de vetor de 64 bits de um operando de fonte de 256 bits em um operando de destino de 256 bits, com um operando de registro ou memória como seletor. |
VPERM2I128
|
Embaralha os quatro elementos de vetor de 128 bits de dois operandos de fonte de 256 bits em um operando de destino de 256 bits, com uma constante imediata como seletor. |
VPBLENDD
|
Versão imediata da palavra dupla das instruções PBLEND do SSE4. |
VPSLLVD , VPSLLVQ
|
Troca lógica. Permite deslocamentos variáveis em que cada elemento é deslocado de acordo com a entrada compactada. |
VPSRLVD , VPSRLVQ
|
Troca lógica. Permite deslocamentos variáveis em que cada elemento é deslocado de acordo com a entrada compactada. |
VPSRAVD
|
Troca lógica aritmética. Permite deslocamentos variáveis em que cada elemento é deslocado de acordo com a entrada compactada. |
Intel:
AMD:
O AVX-512[7] são extensões de 512 bits para as instruções SIMD de extensões de vetor avançadas de 256 bits para a arquitetura de conjunto de instruções x86 propostas pela Intel em julho de 2013 e programadas para serem suportadas em 2015 com o processador Knights Landing da Intel[4].
A instrução AVX-512[8] é codificada com o novo prefixo EVEX. Ele permite 4 operandos, 7 novos registros opmask de 64 bits, modo de memória escalar com transmissão automática, controle de arredondamento explícito e modo de endereçamento de memória de deslocamento comprimido. A largura do arquivo de registro é aumentada para 512 bits e a contagem total de registros aumentada para 32 (registra ZMM0-ZMM31) no modo x86-64.
O AVX é adequado para cálculos de ponto flutuante intensivo em aplicações multimídia, científicas e financeiras (o AVX2 adiciona suporte para operações inteiras).
Aumenta o paralelismo e o rendimento em cálculos SIMD de ponto flutuante, reduz a carga do registrador devido às instruções não destrutivas e melhora o desempenho do software Linux RAID (AVX2).