Как проверить с помощью встроенных функций Intel, поддерживаются ли расширения AVX процессором?
Я пишу программу с использованием встроенных функций Intel. Я хочу использовать _mm_permute_pd
встроенный, который доступен только на процессорах с AVX. Для процессоров без AVX я могу использовать _mm_shuffle_pd
но в соответствии со спецификациями это намного медленнее, чем _mm_permute_pd
, Определите ли заголовочные файлы для встроенных функций Intel константы, которые позволяют мне различать, поддерживается ли AVX, чтобы я мог писать вот так:
#ifdef __IS_AVX_SUPPORTED__ // is there sth like this defined?
// use _mm_permute_pd
# else
// use _mm_shuffle_pd
#endif
? Я нашел этот учебник, который показывает, как выполнить проверку во время выполнения, но мне нужно сделать статическую проверку во время компиляции для текущего компьютера.
3 ответа
Я предполагаю, что вы используете Intel C++ Compiler. В этом случае - да, есть такие макросы: Справочное руководство по компилятору Intel C++: __AVX__
, __AVX2__
,
PS Имейте в виду, что если вы скомпилируете свое приложение с включенным набором инструкций AVX, оно не будет работать на процессорах, не поддерживающих AVX. Если вы собираетесь распространять свое программное обеспечение в виде пакета с исходным кодом и компилировать его на целевой машине - это может быть жизнеспособным решением. В противном случае вы должны проверить AVX динамически.
PPS Есть несколько вариантов ICC. Взгляните на следующие параметры компилятора, а также ссылки на него для других.
GCC, ICC, MSVC и Clang все определяют макрос __AVX__
который вы можете проверить. Фактически это единственная константа SIMD, определенная всеми этими компиляторами ( MSVC - та, которая нарушает шаблон). Это только говорит вам, если ваш код был скомпилирован с поддержкой AVX (например, -mavx с GCC или /arch:AVX с MSVC), но не сообщает вам, поддерживает ли ваш процессор AVX. Если вы хотите узнать, поддерживает ли процессор AVX, вам нужно проверить CPUID. Здесь asm-in-c-error является примером для чтения CPUID из всех этих компиляторов.
Чтобы сделать это правильно, я предлагаю вам сделать диспетчер процессора.
Изменить: В случае, если кто-то хочет знать, как использовать значения из CPUID, чтобы узнать, доступен ли AVX, см. https://github.com/Mysticial/FeatureDetector
Мне кажется, что единственный способ - это скомпилировать и запустить программу, которая определяет, доступен ли AVX. Затем вручную или автоматически скомпилируйте отдельный код с функциями AVX или без них. Для VS 2013 я использовал свой код в папке commomAVX в следующем, чтобы идентифицировать hasAVX (или нет), и использовать его для запуска одного из двух разных файлов BAT, чтобы скомпилировать и связать соответствующую программу.
http://www.roylongbottom.org.uk/gigaflops-benchmarks.zip
Мой вопрос состоял в том, чтобы помочь найти решение относительно использования подходящих параметров компиляции, таких как /arch:AVX.