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