Мой C++ код использует SSE, и теперь я хочу улучшить его для поддержки AVX, когда он доступен. Поэтому я определяю, когда AVX доступен, и вызываю функцию, которая использует команды AVX. Я использую Win7 SP1 + VS2010 SP1 и процессор с AVX.
Чтобы использовать AVX, необходимо включить вот это:
#include "immintrin.h"
и тогда вы сможете использовать intrinsics AVX функции, такие как _mm256_mul_ps
, _mm256_add_ps
и т.д.
Проблема в том, что по умолчанию VS2010 выдает код, который работает очень медленно и выдает предупреждение:
warning C4752: found Intel(R) Advanced Vector Extensions; consider использование /arch:AVX
Похоже, что VS2010 на самом деле не использует инструкции AVX, а вместо этого эмулирует их. Я добавил /arch:AVX
в опции компилятора и получил хорошие результаты. Но эта опция говорит компилятору использовать команды AVX везде, где это возможно. Поэтому мой код может упасть на процессоре, который не поддерживает AVX!
Итак, вопрос в том, как заставить компилятор VS2010 производить AVX-код, но только когда я указываю AVX intrinsics напрямую. Для SSE это работает, я просто использую функции SSE intrinsics и он производит SSE код без каких-либо опций компилятора, таких как /arch:SSE
. Но для AVX это почему-то не работает.