Вопрос по gcc – GCC: чем марш отличается от mtune?

69

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

В чем разница между-march а также-mtune ?

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

Ваш Ответ

2   ответа
86

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

Пользователи также должны понимать, что более старые компиляторы (выпущенные до того, как некоторые CPU не существуют) могут привести к различным оптимальнымmtune а такжеmarch сочетание. Этот пост в блоге освещает этот вопрос с другими:lemire.me/blog/2018/07/25/…
@ Pavel & # x160; imerda Интуитивно, ответ подразумевается в определении двух функций. Кроме того, в документации прямо говорится, чтоmarch подразумеваетmtune, Итак, ответы на ваши возражения - нет и да соответственно.
Спасибо, что объяснили это так элегантно! Вы делаете это легко понять.
Не отвечает, имеет ли смысл использовать оба или mtune является избыточным, когда установлено одно и то же значение.
Людям нужен tl; dr: используйте -march, если вы запускаете ТОЛЬКО на своем процессоре, используйте -mtune, если вы хотите, чтобы это было безопасно для других процессоров.
43

-march=X опция принимает имя процессораX и позволяет GCC генерировать код, который использует все функцииX, Руководство GCC объясняет, какие именно имена процессоров означают, какие семейства и функции процессоров.

Поскольку функции обычно добавляются, но не удаляются, двоичный файл, созданный с-march=X будет работать на процессоре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, если вы когда-либо собираетесь работать только на той же машине, на которой вы работаете.

Похожие вопросы