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

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

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

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

Ответы на вопрос(2)

-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, если вы когда-либо собираетесь работать только на той же машине, на которой вы работаете.

Решение Вопроса

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

 17 окт. 2018 г., 01:59
Пользователи также должны понимать, что более старые компиляторы (выпущенные до того, как некоторые CPU не существуют) могут привести к различным оптимальнымmtune а такжеmarch сочетание. Этот пост в блоге освещает этот вопрос с другими:lemire.me/blog/2018/07/25/…
 26 февр. 2016 г., 01:46
@ Pavel & # x160; imerda Интуитивно, ответ подразумевается в определении двух функций. Кроме того, в документации прямо говорится, чтоmarch подразумеваетmtune, Итак, ответы на ваши возражения - нет и да соответственно.
 05 мая 2016 г., 00:23
Спасибо, что объяснили это так элегантно! Вы делаете это легко понять.
 18 февр. 2017 г., 06:50
Людям нужен tl; dr: используйте -march, если вы запускаете ТОЛЬКО на своем процессоре, используйте -mtune, если вы хотите, чтобы это было безопасно для других процессоров.
 10 февр. 2015 г., 13:35
Не отвечает, имеет ли смысл использовать оба или mtune является избыточным, когда установлено одно и то же значение.

Ваш ответ на вопрос