Как заставить 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 док.

На самом деле ответ "нет". Все это означает, что функция является кандидатом для встраивания, даже если оптимизация отключена.

Другие вопросы по тегам