Usando as instruções da CPU do AVX: Baixo desempenho sem “/ arch: AVX”
Meu código C ++ usa SSE e agora quero aprimorá-lo para dar suporte ao AVX quando estiver disponível. Por isso, detecto quando o AVX está disponível e chamo uma função que usa os comandos do AVX. Eu uso o Win7 SP1 + VS2010 SP1 e uma CPU com AVX.
Para usar o AVX, é necessário incluir o seguinte:
#include "immintrin.h"
e você pode usar funções intrínsecas do AVX como_mm256_mul_ps
, _mm256_add_ps
etc. O problema é que, por padrão, o VS2010 produz código que funciona muito lentamente e mostra o aviso:
warning C4752: encontrado Intel (R) Advanced Vector Extensions; considere usar / arch: AVX
Parece que o VS2010 realmente não usa instruções AVX, mas sim as emula. Eu adicionei/arch:AVX
às opções do compilador e obteve bons resultados. Mas essa opção informa ao compilador para usar comandos AVX em qualquer lugar, quando possível. Portanto, meu código pode falhar na CPU que não suporta o AVX!
Então, a questão é como fazer o compilador VS2010 produzir código AVX, mas somente quando eu especificar diretamente os intrínsecos do AVX. Para o SSE funciona, eu apenas uso funções intrínsecas do SSE e produz código SSE sem nenhuma opção de compilador como/arch:SSE
. Mas, para o AVX, ele não funciona por algum motiv