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



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



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



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

562   2  

2 ответов:

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

вот что я погуглил:

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

потому что функции обычно добавляются, но не удаляются, двоичный построен с -march=X будет работать на CPU X, имеет хороший шанс работать на процессорах новее, чем X, но он почти наверняка не будет работать ни на чем старше, чем X. Некоторые наборы инструкций (3DNow! наверное?) может быть специфичным для конкретного поставщика ЦП, используя их, вероятно, вы получите двоичные файлы, которые не работают на конкурирующих процессорах, более новых или других.

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

Comments

    Ничего не найдено.