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