Вот этот смежный вопрос: GCC: как отличается марш от mtune?
Однако существующие ответы не идут намного дальше, чем руководство GCC. В лучшем случае получим:
Если вы используете
-mtune
, тогда компилятор будет генерировать код, который работает на любой из них, но будет способствовать последовательности команд, которые работают быстрее всего указанный вами CPU.
и
Опция
-mtune=Y
настраивает сгенерированный код для ускорения на Y, чем на других процессорах он может работать.
Но как именно GCC предпочитает одну конкретную архитектуру при запуске, все еще будучи способным запускать сборку на других (обычно более старых) архитектурах, хотя и медленнее?
Я знаю только одно (но я не компьютерный ученый), который был бы способен на такое, и что диспетчер CPU. Тем не менее, мне кажется, что mtune
генерирует диспетчер за кулисами, и, вероятно, действует какой-то другой механизм.
Я чувствую это по двум причинам:
- Поиск "gcc mtune cpu dispatcher" не находит ничего актуального; и
- Если он был основан на диспетчере, я думаю, что он может быть более умным (даже если по какой-либо опции, кроме
mtune
), и проверитьcpuid
на обнаружение поддерживаемых инструкций во время выполнения, вместо того, чтобы полагаться на именованную архитектуру, которая предоставляемые во время сборки.
Итак, как это работает?