Как заставить gcc встроить функцию?
Есть ли __attribute__((always_inline))
заставить функцию быть встроенной в gcc?
8 ответов
Да.
Из документации
always_inline
Как правило, функции не являются встроенными, если не указана оптимизация. Для функций, объявленных как встроенные, этот атрибут указывает на функцию, даже если уровень оптимизации не был указан.
Должно. Я большой поклонник ручного встраивания. Конечно, в избытке это плохо. Но часто при оптимизации кода возникает одна или две функции, которые просто необходимо встроить, или производительность падает. И, честно говоря, по моему опыту, компиляторы C обычно не используют эти функции при использовании ключевого слова inline.
Я совершенно готов позволить компилятору встроить большую часть моего кода для меня. Меня волнуют только те полдюжины или около того абсолютно жизненно важных дел. Люди говорят, что "компиляторы хорошо справляются с этим". Я хотел бы увидеть доказательства этого, пожалуйста. До сих пор я никогда не видел, чтобы компилятор C встроил жизненно важный фрагмент кода, о котором я говорил, без использования какого-либо принудительного встроенного синтаксиса (__forceinline
на MSVC __attribute__((always_inline))
на gcc).
Согласно документации по параметрам оптимизации gcc, вы можете настроить встраивание с параметрами:
-finline-limit=n
By default, GCC limits the size of functions that can be inlined. This flag
allows coarse control of this limit. n is the size of functions that can be
inlined in number of pseudo instructions.
Inlining is actually controlled by a number of parameters, which may be specified
individually by using --param name=value. The -finline-limit=n option sets some
of these parameters as follows:
max-inline-insns-single is set to n/2.
max-inline-insns-auto is set to n/2.
Я предлагаю прочитать более подробно обо всех параметрах для встраивания и настроить их соответствующим образом.
Я хочу добавить, что у меня есть математическая библиотека SIMD, в которой встраивание абсолютно необходимо для производительности. Первоначально я установил все функции как встроенные, но разборка показала, что даже для самых тривиальных операторов будет принято решение вызвать функцию. Это показали и MSVC, и Clang, со всеми включенными флагами оптимизации.
Я сделал как предложено в других постах в SO и добавил __forceinline
для MSVC и __attribute__((always_inline))
для всех остальных компиляторов. Наблюдается последовательное улучшение производительности на 25-35% в различных узких циклах с операциями в диапазоне от базовых умножений до синусов.
Я не догадывался, почему им было так трудно вставлять (возможно, шаблонный код сложнее?), Но суть в том, что есть очень допустимые варианты использования для вставки вручную и огромные ускорения, которые нужно получить.
Если вам интересно, вот где я это реализовал. https://github.com/redorav/hlslpp
Да. Он будет встроен в функцию независимо от других установленных параметров. Смотрите здесь.
Можно также использовать __always_inline
, Я использовал это для функций-членов C++ для GCC 4.8.1. Но не смог найти хорошее объяснение в GCC док.
На самом деле ответ "нет". Все это означает, что функция является кандидатом для встраивания, даже если оптимизация отключена.