С большинством компиляторов C/C++ имеется флаг, -march=native
для компилятора, -march=native
, который сообщает компилятору настроить сгенерированный код для -march=native
и расширений ISA центрального процессора. Даже если это не одно имя, обычно существует эквивалентная опция для компиляторов на основе LLVM, таких как rustc
или swiftc
.
По моему собственному опыту этот флаг может обеспечить массовые ускорения для численно-интенсивного кода, и похоже, что он не будет иметь компромиссов для кода, который вы просто компилируете для своей собственной машины. Тем не менее, я не думаю, что видел какую-либо систему сборки или статический компилятор, который позволяет по умолчанию:
-
Очевидно, что любой исполняемый файл компилятора командной строки, который требует его передачи, не использует его по умолчанию.
-
Я не могу думать о какой-либо среде IDE, которая позволяет это по умолчанию.
-
Я не могу придумать какую-либо общую систему сборки, с которой я работал (
cmake
,automake
,cargo
,spm
и т.д.), Что позволяет использовать ее по умолчанию даже для оптимизированных сборок.
Я могу придумать несколько причин для этого, но ни один из них не является действительно удовлетворительным:
-
Использование
-march=native
не подходит для двоичных файлов, которые будут распространены на другие машины. Тем не менее, я считаю, что компиляция источников для своей собственной машины гораздо чаще, чем для других, и это не объясняет ее отсутствие использования в отладочных сборках, где нет намерения для распространения. -
По крайней мере, на процессорах Intel x86, я понимаю, что использование команд AVX редко может ухудшить производительность или энергоэффективность, поскольку модуль AVX отключается, когда он не используется, требуя его включения питания, и многие процессоры Intel для запуска инструкций AVX. Тем не менее, это только объясняет, почему AVX не будет включен, а не почему код не будет настроен для конкретной обработки микро-архитектуры обычных инструкций.
-
Поскольку большинство процессоров x86 используют причудливые сверхскалярные конвейеры с переименованием регистров, код настройки для конкретной микроархитектуры, вероятно, не особенно важен. Тем не менее, если это может помочь, почему бы не использовать его?