Я попытался очистить страницу GCC для этого, но все равно не понимаю.
Какая разница между -march
и -mtune
?
Когда используется только -march
, против обоих? Можно ли просто -mtune
?
Я попытался очистить страницу GCC для этого, но все равно не понимаю.
Какая разница между -march
и -mtune
?
Когда используется только -march
, против обоих? Можно ли просто -mtune
?
Если вы используете -march
, то GCC будет иметь возможность генерировать инструкции, которые работают с указанным процессором, но не включены (как правило) более ранние процессоры в семействе архитектуры. Если вы используете -mtune
, тогда компилятор будет генерировать код, который работает на любом из них, но будет способствовать последовательности команд, которые работают быстрее всего на указанном вами CPU.
Вот что я искал в google:
Параметр -march=X
принимает имя процессора X
и позволяет GCC генерировать код, который использует все функции X
. Руководство GCC точно объясняет, какие имена процессоров означают, какие семейства и функции процессора.
Поскольку функции обычно добавляются, но не удаляются, двоичный код, созданный с помощью -march=X
, запускается на CPU X
, имеет хорошие шансы для запуска на процессорах, более новых, чем X
, но он почти наверняка не будет работать на ничего старше X
. Некоторые наборы инструкций (3DNow!, Я предполагаю?) Могут быть специфическими для конкретного поставщика ЦП, поэтому использование этих, вероятно, даст вам двоичные файлы, которые не запускаются на конкурирующих процессорах, новее или иначе.
Опция -mtune=Y
настраивает сгенерированный код, который будет работать быстрее на Y
, чем на других процессорах, на которых он может работать. -march=X
означает -mtune=X
. -mtune=Y
не будет переопределять -march=X
, поэтому, например, это, вероятно, не имеет смысла для -march=core2
и -mtune=i686
- ваш код не будет работать ни на чем старше core2
в любом случае из-за -march=core2
, поэтому почему на Земле вы хотели бы оптимизировать что-то более старое (менее функциональное), чем core2? -march=core2 -mtune=haswell
имеет смысл: не используйте никаких функций, кроме того, что предоставляет core2
(что еще намного больше, чем дает -march=i686
!), но оптимизирует код для гораздо более новых haswell
процессоров, а не для core2
.
Там также -mtune=generic
. generic
делает GCC кодом, который лучше всего работает на текущих процессорах (значение generic
изменяется от одной версии GCC к другой). На форумах Gentoo есть слухи, что -march=X -mtune=generic
создает код, который работает быстрее на X
, чем код, созданный -march=X -mtune=X
(или просто -march=X
, как подразумевается -mtune=X
). Не знаю, верно это или нет.
Как правило, если вы точно не знаете, что вам нужно, кажется, что лучший способ - указать -march=<oldest CPU you want to run on>
и -mtune=generic
(-mtune=generic
здесь, чтобы встретить неявный -mtune=<oldest CPU you want to run on>
, потому что вы, вероятно, не хотите для оптимизации для самого старого процессора). Или просто -march=native
, если вы когда-нибудь будете работать только на том же компьютере, на котором вы строите.