Utilizando instrucciones de CPU AVX: bajo rendimiento sin "/ arch: AVX"

Mi código C ++ usa SSE y ahora quiero mejorarlo para que sea compatible con AVX cuando esté disponible. Así que detecto cuando AVX está disponible y llamo a una función que usa comandos AVX. Uso Win7 SP1 + VS2010 SP1 y una CPU con AVX.

Para usar AVX, es necesario incluir esto:

#include "immintrin.h"

y luego puede usar funciones AVX intrínsecas como_mm256_mul_ps, _mm256_add_ps etc. El problema es que, por defecto, VS2010 produce código que funciona muy lentamente y muestra la advertencia:

warning C4752: se encontraron extensiones de vectores avanzadas de Intel (R); considere usar / arch: AVX

Parece que VS2010 en realidad no usa instrucciones AVX, sino que las emula. Yo añadí/arch:AVX a las opciones del compilador y obtuve buenos resultados. Pero esta opción le dice al compilador que use comandos AVX en todas partes cuando sea posible. ¡Entonces mi código puede fallar en la CPU que no es compatible con AVX!

Así que la pregunta es cómo hacer que el compilador VS2010 produzca código AVX, pero solo cuando especifico intrínsecos AVX directamente. Para SSE funciona, solo uso las funciones intrínsecas de SSE y produce código SSE sin ninguna opción de compilador como/arch:SSE. Pero para AVX no funciona por alguna razón.

Respuestas a la pregunta(2)

Su respuesta a la pregunta