Консервативный
Если вы присмотритесь к значениям по умолчанию gcc, самого старого компилятора в вашем списке, вы поймете, что они очень консервативны:
- По умолчаниюна x86 активирован только SSE 2;даже не SSE 4.
- Набор флагов в
-Wall
и -Wextra
не менялся годами;Есть новые полезные предупреждения, они НЕ добавляются в -Wall
или -Wextra
.
Почему?Потому что это сломало бы вещи!
Существуют целые цепочки разработки, основанные на этих удобных значениях по умолчанию, и любое изменение влечет за собой риск либо сломать их, либо создать двоичные файлы, которые не будут работать на целях.
Чем больше пользователей, тем больше угроза, поэтому разработчики gcc очень и очень консервативны, чтобы избежать поломок по всему миру.И разработчики следующей партии компиляторов идут по стопам своих старших: доказано, что это работает.
Примечание: rustc
по умолчанию будет использовать статическое связывание и может похвастаться тем, что вы можете просто скопировать двоичный файли бросить его на другую машину;очевидно, что -march=native
будет препятствием там.
MASS Friendly
И, по правде говоря, это, вероятно, не имеет значения.Вы действительно узнали это сами:
По моему опыту, этот флаг может обеспечить значительное ускорение для числового кода
Большая часть кода заполнена виртуальными вызовами и ветвями (как правило, код ОО), а не числовой.Таким образом, для большей части кода часто достаточно SSE 2.
Несколько кодовых баз, для которых производительность действительно имеет значение, в любом случае потребуют значительных затрат времени на настройку производительности, как на уровне кода, так и на уровне компилятора.И если векторизация имеет значение, она не останется на усмотрение компилятора: разработчики будут использовать встроенные встроенные функции и сами писать векторизованный код, поскольку это дешевле, чем установка инструмента мониторинга, чтобы гарантировать, что авто-векторизация действительно произошла.
Кроме того, даже для числового кода хост-компьютер и целевой компьютер могут немного отличаться.Компиляция выигрывает от большого количества ядер, даже на более низкой частоте, в то время как выполнение выигрывает от высокой частоты и, возможно, меньшего количества ядер, если работа не может быть легко распараллеливаемой.
Заключение
Не активировать -march=native
с помощьюнастройка по умолчанию облегчает пользователям начало работы;поскольку даже те, кто ищет производительность, могут не заботиться об этом больше, это означает, что можно потерять больше, чем выиграть.
В альтернативной истории, где значением по умолчанию было -march=native
с самого начала;пользователи будут использоваться для определения целевой архитектуры, и у нас не будет этого обсуждения.