Оптимизация под конкретную архитектуру машины / процессора

в этом высоко проголосовали ответ на вопрос о различиях в производительности между C++ и Java я узнаю, что компилятор JIT иногда может оптимизировать лучше, потому что он может определить точную специфику машины (процессор, размеры кэша и т. д.):

Как правило, C# и Java могут быть так же быстро или быстрее, потому что JIT компилятор -- компилятор, который компилирует Il в первый раз выполняется -- может делать оптимизации, которые C++ скомпилированная программа не может потому что он может запросить машину. Оно может определить если машина Intel или AMD; Pentium 4, Core Solo или Core Duo; или если поддерживает SSE4, так далее.

программа на C++ должна быть скомпилирована заранее, как правило, со смешанным оптимизации, чтобы он работал прилично хорошо на всех машинах, но не оптимизировано столько, сколько может быть для одной конфигурации (т. е. процессор, набор инструкций, другое оборудование).

вопрос: есть ли способ чтобы сказать компилятору оптимизировать специально для моей текущей машины? Есть ли компилятор, который способен это сделать?

2 ответов


для GCC, вы можете использовать флаг -march=native. Имейте в виду, что сгенерированный код не может выполняться на других процессорах, потому что

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

поэтому конкретной сборки процессора можно произвести.

Если вы хотите, чтобы ваш код работал на других типах ЦП, но настроить его для лучшей производительности на вашем ЦП, то вы должны использовать -mtune=native:

указать имя процессора для настройки производительности. Этот код будет настроен так, как если бы целевой процессор был такого типа указанный в этом параметре, но все еще использующий инструкции, совместимые с целевой процессор, указанный параметром-mcpu=.


конечно, компилятор может быть проинструктирован для оптимизации для конкретной архитектуры. Это верно для gcc, если вы посмотрите на множество архитектура флаги что вы можете пройти. То же самое верно в меньшей степени в Visual Studio, так как он имеет -автомат и /arch параметры.

однако, в отличие от Java, это, вероятно, означает, что сгенерированный код только (безопасен) для запуска на том оборудовании, которое является целевым. Утверждение что Java может быть так же быстро или быстрее, вероятно, имеет место только в случае обобщенно скомпилированного кода C++. Учитывая целевую архитектуру, код c++, скомпилированный для этой конкретной архитектуры, вероятно, будет таким же быстрым или быстрее, чем эквивалентный код Java. Конечно, это гораздо больше работы для поддержки нескольких архитектур таким образом.