¿Cómo fuerzo gcc para alinear una función?

¿ __attribute__((always_inline)) fuerza una función para ser inline por gcc?

    Sí.

    De la documentación

    always_inline

    En general, las funciones no están en línea a menos que se especifique la optimización. Para las funciones declaradas en línea, este atributo indica la función incluso si no se especificó ningún nivel de optimización.

    Debería. Soy un gran admirador de la creación manual de líneas. Claro, usado en exceso, es algo malo. Pero muchas veces cuando se optimiza el código, habrá una o dos funciones que simplemente tienen que estar en línea o el rendimiento se va por el inodoro. Y, francamente, en mi experiencia, los comstackdores de C normalmente no incorporan esas funciones al usar la palabra clave en línea.

    Estoy perfectamente dispuesto a dejar que el comstackdor en línea la mayor parte de mi código para mí. Solo me importan esa media docena de casos absolutamente vitales. La gente dice “los comstackdores hacen un buen trabajo en esto”. Me gustaría ver una prueba de eso, por favor. Hasta ahora, nunca he visto un comstackdor de C en línea una pieza vital de código que le dije sin usar algún tipo de syntax forzada en línea ( __forceinline en msvc __attribute__((always_inline)) en gcc).

    Sí, lo hará. Eso no significa que sea una buena idea.

    De acuerdo con la documentación de opciones de optimización de gcc , puede sintonizar la alineación con parámetros:

     -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. 

    Sugiero leer más en detalle sobre todos los parámetros para enlining y configurarlos de manera apropiada.

    Sí. Enlarzará la función independientemente de cualquier otra opción establecida. Mira aquí .

    Quiero agregar aquí que tengo una biblioteca de matemáticas SIMD donde la línea interna es absolutamente crítica para el rendimiento. Inicialmente establecí todas las funciones en línea, pero el desassembly mostró que incluso para los operadores más triviales decidiría llamar realmente a la función. Tanto MSVC como Clang mostraron esto, con todos los indicadores de optimización activados.

    Hice lo sugerido en otras publicaciones en SO y agregué __forceinline para __attribute__((always_inline)) y __attribute__((always_inline)) para todos los demás comstackdores. Hubo una mejora consistente del 25-35% en el rendimiento en varios bucles apretados con operaciones que van desde las multiplicaciones básicas hasta los senos.

    No me di cuenta de por qué les costaba trabajo forzar (¿quizás el código de plantilla es más difícil?), Pero la conclusión es: hay casos de uso muy válidos para realizar manualmente y enormes aceleraciones.

    Si tienes curiosidad aquí es donde lo implementé. https://github.com/redorav/hlslpp

    También se puede usar __always_inline . Lo he estado utilizando para las funciones miembro de C ++ para GCC 4.8.1. Pero no pudo encontrar una buena explicación en el documento de GCC.

    En realidad, la respuesta es “no”. Todo lo que significa es que la función es candidata para alinear incluso con optimizaciones desactivadas.