web-dev-qa-db-fra.com

Comment forcer gcc à incorporer une fonction?

__attribute__((always_inline)) force-t-elle une fonction à être alignée par gcc?

53
HaltingState

Oui.

De documentation

toujours_en ligne

Généralement, 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 attribut inline la fonction même si aucun niveau d'optimisation n'a été spécifié.

42
RCE

Cela devrait. Je suis un grand fan de l'incrustation manuelle. Bien sûr, utilisé en excès, c'est une mauvaise chose. Mais souvent, lors de l'optimisation du code, il y aura une ou deux fonctions qui devront simplement être intégrées ou les performances tomberont dans les toilettes. Et franchement, d'après mon expérience, les compilateurs C font généralement pas inline ces fonctions lors de l'utilisation du mot-clé inline.

Je suis parfaitement disposé à laisser le compilateur incorporer la plupart de mon code pour moi. Ce ne sont que ces demi-douzaines de cas absolument vitaux qui m'intéressent vraiment. Les gens disent que "les compilateurs font du bon travail dans ce domaine". J'aimerais en voir la preuve, s'il vous plaît. Jusqu'à présent, j'ai jamais vu un compilateur C en ligne un morceau de code essentiel que je lui ai dit sans utiliser une sorte de syntaxe en ligne forcée (__forceinline Sur msvc __attribute__((always_inline)) sur gcc).

29
Joe

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

24
jmkeyes

Selon la documentation options d'optimisation gcc , vous pouvez régler l'inline avec les paramètres:

-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 paramètres pour l'inline et de les régler de manière appropriée.

11

Oui. Il alignera la fonction indépendamment de tout autre ensemble d'options. Voir ici .

3
Matt Joiner

Je veux ajouter ici que j'ai une bibliothèque mathématique SIMD où l'inline est absolument essentiel pour les performances. Initialement, j'ai mis toutes les fonctions en ligne, mais le démontage a montré que même pour les opérateurs les plus triviaux, il déciderait d'appeler réellement la fonction. MSVC et Clang l'ont 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 MSVC et __attribute__((always_inline)) pour tous les autres compilateurs. Il y avait une amélioration constante de 25 à 35% dans la performance dans diverses boucles serrées avec des opérations allant des multiplications de base aux sinus.

Je n'ai pas compris pourquoi ils avaient eu tant de mal à intégrer (le code modèle est peut-être plus difficile?) Mais la conclusion est la suivante: il existe des cas d'utilisation très valables pour l'inclusion manuelle et d'énormes accélérations à gagner.

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

1
RedOrav

On peut également utiliser __always_inline. Je l'utilise pour les fonctions membres C++ pour GCC 4.8.1. Mais n'a pas pu trouver une bonne explication dans le document GCC.

0
Jie Xu