¿Cómo fuerzo gcc para alinear una función?
gcc flags (8)
¿ __attribute__((always_inline))
fuerza una función para ser inline por gcc?
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.
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 compiladores de C normalmente no incorporan esas funciones al usar la palabra clave en línea.
Estoy perfectamente dispuesto a dejar que el compilador 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 compiladores hacen un buen trabajo en esto". Me gustaría ver una prueba de eso, por favor. Hasta ahora, nunca he visto un compilador de C en línea una pieza vital de código que le dije sin usar algún tipo de sintaxis forzada en línea ( __forceinline
en msvc __attribute__((always_inline))
en gcc).
En realidad, la respuesta es "no". Todo lo que significa es que la función es candidata para alinear incluso con optimizaciones desactivadas.
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 desmontaje 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 compiladores. 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
Sí, lo hará. Eso no significa que sea una buena idea.
Sí. Enlarzará la función independientemente de cualquier otra opción establecida. Mira here .
Sí.
De la documentation
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.
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.