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

questionAnswers(2)

yourAnswerToTheQuestion