Большинство компиляторов автоматически определяют:
__SSE__
__SSE2__
__SSE3__
__AVX__
__AVX2__
и т.д., в соответствии с любой командной строки вы передаете. Вы можете легко проверить это с помощью GCC (или GCC-совместимые компиляторы, такие как лязг), как это:
$ gcc -msse3 -dM -E - < /dev/null | egrep "SSE|AVX" | sort
#define __SSE__ 1
#define __SSE2__ 1
#define __SSE2_MATH__ 1
#define __SSE3__ 1
#define __SSE_MATH__ 1
или:
$ gcc -mavx2 -dM -E - < /dev/null | egrep "SSE|AVX" | sort
#define __AVX__ 1
#define __AVX2__ 1
#define __SSE__ 1
#define __SSE2__ 1
#define __SSE2_MATH__ 1
#define __SSE3__ 1
#define __SSE4_1__ 1
#define __SSE4_2__ 1
#define __SSE_MATH__ 1
#define __SSSE3__ 1
или просто проверить заранее определенные макросы для сборки по умолчанию на вашей конкретной платформе:
$ gcc -dM -E - < /dev/null | egrep "SSE|AVX" | sort
#define __SSE2_MATH__ 1
#define __SSE2__ 1
#define __SSE3__ 1
#define __SSE_MATH__ 1
#define __SSE__ 1
#define __SSSE3__ 1
Новые процессоры Intel поддерживают AVX-512, который не является монолитным набором команд. Можно увидеть поддержку, доступную от GCC (версия 6.2), для двух примеров ниже.
Здесь рыцари Посадка:
$ gcc -march=knl -dM -E - < /dev/null | egrep "SSE|AVX" | sort
#define __AVX__ 1
#define __AVX2__ 1
#define __AVX512CD__ 1
#define __AVX512ER__ 1
#define __AVX512F__ 1
#define __AVX512PF__ 1
#define __SSE__ 1
#define __SSE2__ 1
#define __SSE2_MATH__ 1
#define __SSE3__ 1
#define __SSE4_1__ 1
#define __SSE4_2__ 1
#define __SSE_MATH__ 1
#define __SSSE3__ 1
Здесь Skylake AVX-512:
$ gcc -march=skylake-avx512 -dM -E - < /dev/null | egrep "SSE|AVX" | sort
#define __AVX__ 1
#define __AVX2__ 1
#define __AVX512BW__ 1
#define __AVX512CD__ 1
#define __AVX512DQ__ 1
#define __AVX512F__ 1
#define __AVX512VL__ 1
#define __SSE__ 1
#define __SSE2__ 1
#define __SSE2_MATH__ 1
#define __SSE3__ 1
#define __SSE4_1__ 1
#define __SSE4_2__ 1
#define __SSE_MATH__ 1
#define __SSSE3__ 1
Intel раскрыл дополнительные AVX-512 подмножеств (см ISA extensions). GCC (версия 7) поддерживает флаги компилятора и препроцессор символы, связанные с подмножествами 4FMAPS, 4VNNIW, IFMA, VBMI и VPOPCNTDQ из AVX-512:
for i in 4fmaps 4vnniw ifma vbmi vpopcntdq ; do echo "==== $i ====" ; gcc -mavx512$i -dM -E - < /dev/null | egrep "AVX512" | sort ; done
==== 4fmaps ====
#define __AVX5124FMAPS__ 1
#define __AVX512F__ 1
==== 4vnniw ====
#define __AVX5124VNNIW__ 1
#define __AVX512F__ 1
==== ifma ====
#define __AVX512F__ 1
#define __AVX512IFMA__ 1
==== vbmi ====
#define __AVX512BW__ 1
#define __AVX512F__ 1
#define __AVX512VBMI__ 1
==== vpopcntdq ====
#define __AVX512F__ 1
#define __AVX512VPOPCNTDQ__ 1
Что именно вы хотите проверить? Вы хотите проверить, что компилятор будет создавать инструкции AVX? Важно помнить, что только потому, что компилятор готов к их выпуску, это не означает, что процессор, который будет запущен в вашей программе, также будет поддерживать его (даже если компиляция и исполнение происходят на одной машине). – ArjunShankar
@ArjunShankar Я хочу знать, был ли avx включен во время компиляции с -mavx. –
Также обратите внимание, что поддержка ЦП и поддержка ОС - это две разные вещи. ЦП может поддерживать SSE, но ОС может не поддерживать SSE (для чего требуется, чтобы ОС сохраняла регистры XMM во время контекстного переключателя). См., Например, [Проверка для SSE] (http://wiki.osdev.org/SSE#Checking_for_SSE) в вики OSDev. – jww