Использование gcc --target-help
-march=CPU[,+EXTENSION...]
generate code for CPU and EXTENSION, CPU is one of:
generic32, generic64, i386, i486, i586, i686,
pentium, pentiumpro, pentiumii, pentiumiii, pentium4,
prescott, nocona, core, core2, corei7, l1om, k1om,
iamcu, k6, k6_2, athlon, opteron, k8, amdfam10,
bdver1, bdver2, bdver3, bdver4, znver1, znver2,
btver1, btver2
...
Часто это не общая архитектура, такая как x86
или x86-64
, а конкретные микроархитектуры. Но есть x86-64
(не x86_64
) для универсального процессора x86 с 64-битными расширениями. Полный список для каждой архитектуры можно найти в GCC's -march
manual . Для x86:
-march=cpu-type
Создание инструкций для типа машины cpu-type. В отличие от -mtune=cpu-type
, который просто настраивает сгенерированный код для указанного cpu-type
, -march=cpu-type
позволяет GCC генерировать код, который может вообще не работать на процессорах, отличных от указанного. Задание -march=cpu-type
подразумевает -mtune=cpu-type
.
...
https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html#index-march-13
В то время как базовая версия -march
равна -march=x86-64
, опция базовой линии / настройки по умолчанию равна -mtune=generic
. Это делается, чтобы нигде не быть ужасным, избегая ошибок производительности даже за счет дополнительных инструкций или размера кода.
-march=native
выберет правильные настройки арки и настройки для машины, на которой работает компилятор, или tune=generic
, если компилятор не распознает конкретную модель процессора, на котором он работает.
(например, старый gcc на Skylake, по-прежнему будет включать -mavx2 -mpopcnt -mbmi2
и т. Д., Но будет устанавливать -mtune=generic
вместо чего-то более подходящего.)