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

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

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

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

2 ответа

Решение

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

Это то, что я погуглил:

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

Другие вопросы по тегам