Как узнать, какие функции AVX C доступны на разных моделях процессоров

В основном название. Например, я пытаюсь запустить такие инструкции, как:

_mm256_load_pd, _mm256_add_pd, _mm256_stream_pd и 128-битная версия на процессоре: Intel Xeon, E5630, 2,53 ГГц, IBM HS22. Но у меня есть Illegal instruction какие-либо идеи для сайта, где я мог бы увидеть, какие функции доступны для этого процессора?


person C. Cristi    schedule 02.05.2021    source источник


Ответы (1)


Проверьте свой /proc/cpuinfo, если вы используете ОС, в которой он есть.

Или используйте clang или gcc -march=native - они откажутся компилировать любые встроенные функции, которые не поддерживает ваш процессор. (В отличие от MSVC или ICC, которые позволят вам использовать встроенные функции, не сообщая, что целевая машина их поддерживает.)


Чтобы найти его по модели процессора, погуглите модель, например. Xeon, E5630 -› https://ark.intel.com/content/www/us/en/ark/products/47924/intel-xeon-processor-e5630-12m-cache-2-53-ghz-5-86-gt-s-intel-qpi.html

  • Расширения набора инструкций: Intel® SSE4.2

Так что никакого AVX, потому что это микроархитектура Westmere-EP 2010 года (до Sandybridge).

Для получения более подробной информации о процессорах вы также можете проверить http://instlatx64.atw.hu/ и проверить CPUID. дамп для этой модели (или одной из той же микроархитектуры), если вы можете его найти. например снимок экрана Aida64 CPUID, работающего на Westmere-EX, и результаты контрольных показателей задержки/пропускной способности инструкций с информацией в верхней части текстового файла, включая декодированный CPUID информация, показывающая, какие у него расширения ISA. Также необработанные дампы CPUID, которые можно сопоставить с битом функции CPUID. требуется (https://sandpile.org/x86/cpuid.htm) любым расширением, которое вы вас интересуют (например, cmpxchg16b или FSGSBASE, которые не упоминаются на страницах ковчега Intel).


связанные: https://software.intel.com/sites/landingpage/IntrinsicsGuide/ говорит вам, какое расширение ISA требуется соответствующей инструкцией asm для каждой встроенной функции.

person Peter Cordes    schedule 02.05.2021
comment
В macOS: sysctl machdep.cpu.features machdep.cpu.leaf7_features - person Paul R; 02.05.2021
comment
Здравствуйте, спасибо за ваш ответ! Можете ли вы показать мне способ проверить это в коде C? Запускать этот код, только если он имеет AVX512 или AVX2? Может быть, некоторые макрос ЕСЛИ - person C. Cristi; 02.05.2021
comment
@C.Cristi: Это отдельный вопрос. Конечно, вы можете определить это во время сборки с помощью #if __AVX__, если хотите, чтобы люди компилировали ваш код с помощью -march=native на своих машинах. Если вы хотите выполнить диспетчеризацию во время выполнения (например, установить указатели на функции), вам нужно выбрать достаточно большие функции, для которых стоит ветвление (например, сделать их не встраиваемыми), но вы можете использовать ifunc материал GCC или свернуть свой собственный с __builtin_cpu_supports("avx") или что угодно в GNU C. Ищите в Google / Stack Overflow, чтобы узнать больше. - person Peter Cordes; 02.05.2021
comment
@PeterCordes Итак, для AVX2 у нас есть #if __AVX__, а для AVX512 у нас есть #if __AVX512__? и компилируется, конечно, с -march=native, и должно быть хорошо, верно? - person C. Cristi; 02.05.2021
comment
@C.Cristi: да, если вы не используете MSVC, все это очень хорошо работает с использованием -march=native. MSVC разработан на основе модели создания одного двоичного файла, который вы распространяете, и не имеет эквивалентной опции для создания двоичного файла, предназначенного конкретно для хоста. Итак, похоже, что для ваших целей вам нужно gcc или clang -O3 -march=native, возможно, с -ffast-math и т. д. и т. д. (определенно -fno-math-errno). - person Peter Cordes; 02.05.2021
comment
Для конкретных макросов Google — ваш друг: Как обнаружить SSE/SSE2/AVX/AVX2/AVX-512/AVX-128-FMA/KCVI доступность во время компиляции? было первым обращением к gcc macro avx avx512 - person Peter Cordes; 02.05.2021