Comment forcer gcc à intégrer une fonction?

Est- __atsortingbute__((always_inline)) que __atsortingbute__((always_inline)) force une fonction à être insérée par gcc?

Oui.

De la documentation

always_inline

En règle générale, les fonctions ne sont pas intégrées, sauf si l’optimisation est spécifiée. Pour les fonctions déclarées en ligne, cet atsortingbut intègre la fonction même si aucun niveau d’optimisation n’a été spécifié.

Cela devrait. Je suis un grand fan de l’inlining manuel. Bien sûr, utilisé en excès, c’est une mauvaise chose. Mais souvent, lors de l’optimisation du code, il y a une ou deux fonctions qui doivent simplement être incorporées ou les performances descendent dans les canvasttes. Et franchement, selon mon expérience, les compilateurs C n’intègrent généralement pas ces fonctions lors de l’utilisation du mot clé en ligne.

Je suis tout à fait disposé à laisser le compilateur incorporer la plupart de mon code pour moi. Ce ne sont que ces demi-douzaines de cas absolument vitaux qui me tiennent à cœur. Les gens disent “les compilateurs font du bon travail à ce sujet”. J’aimerais en voir la preuve, s’il vous plaît. Jusqu’à présent, je n’ai jamais vu un compilateur C incorporer une partie essentielle du code dont je lui avais parlé sans utiliser une syntaxe en ligne forcée ( __forceinline sur msvc __atsortingbute__((always_inline)) sur gcc).

Oui, il sera. Cela ne veut pas dire que c’est une bonne idée.

Selon la documentation des options de gcc Optim, vous pouvez régler l’inclusion avec des parameters:

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

Je suggère de lire plus en détail tous les parameters pour l’inline, et les configurer de manière appropriée.

Oui. Il va aligner la fonction indépendamment de tout autre ensemble d’options. Voir ici

Je veux append ici que j’ai une bibliothèque mathématique SIMD où l’inclusion est absolument essentielle pour la performance. Au départ, je mets toutes les fonctions en ligne, mais le déassembly a montré que même pour les opérateurs les plus sortingviaux, il déciderait d’appeler la fonction. MSVC et Clang l’ont tous deux montré, avec tous les indicateurs d’optimisation activés.

J’ai fait comme suggéré dans d’autres articles dans SO et ajouté __forceinline pour __atsortingbute__((always_inline)) et __atsortingbute__((always_inline)) pour tous les autres compilateurs. Il y avait une amélioration constante de 25 à 35% des performances dans diverses boucles serrées avec des opérations allant des multiplications de base aux sinus.

Je n’ai pas compris pourquoi ils avaient tant de mal à s’incruster (peut-être que le code basé sur des modèles est plus difficile?) Mais l’essentiel est: il y a des cas d’utilisation très valables pour insérer manuellement et des gains énormes.

Si vous êtes curieux, c’est là que je l’ai implémenté. https://github.com/redorav/hlslpp

On peut également utiliser __always_inline . Je l’ai utilisé pour les fonctions membres C ++ pour GCC 4.8.1. Mais n’a pas trouvé une bonne explication dans GCC doc.

En fait, la réponse est “non”. Tout ce que cela signifie, c’est que la fonction est candidate à l’inclusion même avec des optimisations désactivées.