Utilizzo delle istruzioni della CPU AVX: scarse prestazioni senza “/ arch: AVX”

Il mio codice C ++ utilizza SSE e ora voglio migliorarlo per supportare AVX quando è disponibile. Quindi rilevo quando AVX è disponibile e chiama una funzione che utilizza i comandi AVX. Io uso Win7 SP1 + VS2010 SP1 e una CPU con AVX.

Per utilizzare AVX, è necessario includere questo:

#include "immintrin.h" 

e quindi è ansible utilizzare funzioni AVX intrinseche come _mm256_mul_ps , _mm256_add_ps ecc. Il problema è che, per impostazione predefinita, VS2010 produce codice che funziona molto lentamente e mostra l’avviso:

avviso C4752: trovato Intel (R) Advanced Vector Extensions; considerare l’utilizzo di / arch: AVX

Sembra che VS2010 in realtà non usi le istruzioni AVX, ma invece le emula. Ho aggiunto /arch:AVX alle opzioni del compilatore e ho ottenuto buoni risultati. Ma questa opzione dice al compilatore di usare i comandi AVX ovunque ansible. Quindi il mio codice potrebbe bloccarsi sulla CPU che non supporta AVX!

Quindi la domanda è come rendere il compilatore VS2010 in grado di produrre codice AVX, ma solo quando specifichi direttamente gli intrinsechi AVX. Per SSE funziona, uso solo le funzioni intrinseche SSE e produce codice SSE senza opzioni di compilatore come /arch:SSE . Ma per AVX non funziona per qualche motivo.