Использование инструкций процессора AVX: Низкая производительность без "/arch:AVX"

Мой 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 это почему-то не работает.

49
задан Mysticial 5 April 2012 в 14:51
поделиться