GCC: как отличается марш от mtune?

Я попытался очистить страницу GCC для этого, но все равно не понимаю.

Какая разница между -march и -mtune?

Когда используется только -march, против обоих? Можно ли просто -mtune?

Ответ 1

Если вы используете -march, то GCC будет иметь возможность генерировать инструкции, которые работают с указанным процессором, но не включены (как правило) более ранние процессоры в семействе архитектуры. Если вы используете -mtune, тогда компилятор будет генерировать код, который работает на любом из них, но будет способствовать последовательности команд, которые работают быстрее всего на указанном вами CPU.

Ответ 2

Вот что я искал в 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, если вы когда-нибудь будете работать только на том же компьютере, на котором вы строите.