С большинством компиляторов 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 используют причудливые сверхскалярные конвейеры с переименованием регистров, код настройки для конкретной микроархитектуры, вероятно, не особенно важен. Тем не менее, если это может помочь, почему бы не использовать его?