Как проверить с помощью Intel intrinsics, поддерживаются ли расширения AVX процессором?

Я пишу программу с использованием встроенных процессоров Intel. Я хочу использовать _mm_permute_pd intrinsic, который доступен только на процессорах с AVX. Для процессоров без AVX я могу использовать _mm_shuffle_pd но согласно спецификациям он намного медленнее, чем _mm_permute_pd. Файлы заголовков для Intel intrinsics определяют константы, которые позволяют мне различать, поддерживается ли AVX, чтобы я мог писать sth следующим образом:

#ifdef __IS_AVX_SUPPORTED__  // is there sth like this defined?
// use _mm_permute_pd
# else
// use _mm_shuffle_pd
#endif

? Я нашел в этом уроке, который показывает, как выполнить проверку времени выполнения но мне нужно сделать статическую проверку времени компиляции для текущей машины.

3 ответов


Я предполагаю, что вы используете компилятор Intel C++. В данном случае-да, есть такие макросы:Справочник По Компилятору Intel C++: __AVX__, __AVX2__.

P.S. имейте в виду, что если вы скомпилируете приложение с включенным набором инструкций AVX, оно потерпит неудачу на процессорах, не поддерживающих AVX. Если вы собираетесь распространять свои программы, как пакет исходного кода и компиляции на целевой машине - это может быть жизнеспособным решением. В противном случае вы должны проверить AVX динамично.

P. P. S. существует несколько вариантов ICC. Взгляните на следующие параметры компилятора а также ссылки из нее на другие.


GCC, ICC, MSVC и Clang определяют макрос __AVX__ Что вы можете проверить. На самом деле это единственная константа SIMD, определенная всеми этими компиляторами (MSVC-это тот, который ломает форму). Это только говорит вам, если ваш код был скомпилирован с поддержкой AVX (например,- mavx с GCC или /arch:AVX с MSVC), он не говорит вам, поддерживает ли ваш процессор AVX. Если вы хотите знать, поддерживает ли процессор AVX, вам нужно проверить CPUID. Вот,asm-in-c-error - Это пример для чтения CPUID от всех этих компиляторов.

чтобы сделать это правильно, я предлагаю вам сделать диспетчер ЦП.

Edit: если кто-то хочет знать, как использовать значения из CPUID, чтобы узнать, доступен ли AVX, см. https://github.com/Mysticial/FeatureDetector


Мне кажется, что единственный способ-скомпилировать и запустить программу, которая определяет, доступен ли AVX. Затем вручную или автоматически компилируйте отдельный код с функциями AVX или без них. Для VS 2013 я бы использовал свой код в папке commomAVX в следующем, чтобы идентифицировать hasAVX (или нет) и использовать это для выполнения одного из двух разных файлов BAT для компиляции и связывания соответствующего программа.

http://www.roylongbottom.org.uk/gigaflops-benchmarks.zip

мой вопрос состоял в том, чтобы помочь определить решение относительно использования подходящих параметров компиляции, таких как /arch:AVX.