В используемой вами версии gcc Haswell назывался core-avx2. Другие микроархитектуры имели также дерьмовые имена. Например, Ivy Bridge, Sandy Bridge и Westmere назывались core-avx-i, corei7-avx и corei7 соответственно. Начиная с gcc 4.9.0, используются фактические имена микроархитектур, поэтому gcc будет печатать Haswell при использовании gcc -march=native -Q --help=target|grep march
на процессоре Haswell вместо core-avx2 (см. patch ).
При передаче -mtune=native
в gcc и хост-процессоре неизвестной версии gcc, которую вы используете, будет применяться настройка generic
. Ваша модель процессора (63) известна только для gcc 5.1.0 и более поздних версий (см. Патч ).
Часть для печати имен в -Q --help=target
должна выбрать какое-то имя для -march=native
. Если процессоры слишком новы, чтобы ваш GCC мог их распознавать, он выберет что-то вроде Broadwell, если процессор поддерживает ADX, или микроархитектуру, которая поддерживает максимальное расширение SIMD (до AVX2), которое поддерживается на главном процессоре (как определено * 1014). *).
Но фактический эффект из -march=native
состоит в том, чтобы включить все соответствующие опции -mavx -mpopcnt -mbmi2 -mcx16
и т. Д., Все они определяются отдельно с помощью cpuid
. Поэтому для целей генерации кода -march=native
всегда работает для включения расширений ISA, которые ваш GCC знает, как использовать, даже если он не распознает ваш ЦП.
Но для установки tune
параметров -march=native
или -mtune=native
полностью завершается неудачей и возвращается к generic
, когда он не распознает ваш процессор точно. К сожалению, он не делает такие вещи, как tune=intel
для неизвестных процессоров Intel.
На вашем процессоре gcc знает, что он поддерживает AVX2, поэтому предполагает , что это процессор Haswell (называемый core-avx2 в вашей версии gcc), поскольку AVX2 поддерживается, начиная с Haswell, но не поддерживает точно не знаю, что это на самом деле процессор Haswell. Вот почему он применяет общую настройку вместо настройки для core-avx2 (т.е. Haswell). Но в этом случае, я думаю, это будет иметь тот же эффект, что и настройка для core-avx2, потому что для этой версии компилятора только Haswell поддерживает AVX2, и компилятор знает, что хост-процессор поддерживает AVX2. Однако в целом он может не настроиться на встроенную микроархитектуру, даже если -march
правильно угадан на неизвестном процессоре.
(Примечание редактора: нет, tune=generic
не адаптируется к тому, какие опции набора команд включены. Это все еще полностью универсальная настройка, включая заботу о процессорах, таких как AMD Phenom или Intel Sandybridge, которые не поддерживают AVX2. См. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80568 и Почему gcc не разрешает _mm256_loadu_pd как один vmovupd? .
Это одна из причин , почему вы должны использовать -march=native
или -march=haswell
(с новым достаточно gcc), а не просто -mavx2 -mfma
. Другая причина в том, что вы, вероятно, забудете -mbmi2 -mpopcnt -mcx16
, а возможно, даже забудете -mfma
)