IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Autres éditeurs Discussion :

Forcer 'inline' avec GCC ou ICC


Sujet :

Autres éditeurs

  1. #1
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut Forcer 'inline' avec GCC ou ICC
    J'ai un programme avec pleins de fonctions inlines et de templates imbriqués.
    Il est essentiel que toutes (ou presque) les fonctions déclarées 'inline' soit réellement inlinées dans l'exécutable afin que la vitesse d'exécution soit correcte.

    Je l'ai compilé sous Windows.NET, ça marche bien, il est rapide. Et si j'utilise '__forceinline' il est encore plus rapide.

    Mais avec GCC 3.4 (Cygwin et Linux) ou ICC (Linux), il est environ 5 fois plus lent que sous Windows.
    L'option '-Winline' de GCC me montre que beaucoups de functions ne sont pas inlinées comme il faudrait.
    J'essaye de jouer sur les options de GCC, mais rien n'est satisfaisant pour l'instant.
    -finline-limit
    --param large-function-growth
    --param max-inline-insns-single
    ...

    Quelqu'un a des suggestions?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Il n'y a pas moyens de forcer l'inline, c'est juste un hint qu'on donne au compilateur. Visual c++ se reserve meme le droit de ne pas honorer le forceinline s'il juge que c'est mieux ainsi.

    En general, je dirais de faire confiance au compilateur pour les inline. Les version recentes de gcc (et vc++) font du tres bon boulot de ce cote. Par contre, tu peux essayer d'optimiser a d'autre endroits, comme en utilisant -fomit-frame-pointer et les -Ox.

    A partir de -O3, gcc va tenir compte de la possibilite d'inliner les fonctions que tu as marquees avec le mot cle inline. (-fomit-frame-pointer est aussi active avec -O3)

    Ensuite, si c'est un programme dont tu connais d'avance le type d'architecture sur lequel il va fonctionner, tu peux activer les optimisation par rapport a cette architecture. Ma ligne de commande pour tout ce que je compile (sur gentoo) ressemble a ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -O2 -march=athlon-xp -mcpu=i686 -fomit-frame-pointer -pipe
    Ce ne sont pas des settings tres agressifs, mais c'est un bon trade-off entre le temps de compilation et le temps d'execution.

  3. #3
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Justement non, GCC fait du mauvais boulot, du TRES mauvais boulot.
    Y'a qu'à comparer la vitesse d'exécution de mon programme compilé par Intel C++ Compiler (Windows) et compilé par GCC (Cygwin & Linux).

    L'option -Winline m'ôte le moindre doute qui pouvait subsister.

    On dirait que GCC coupe l'arbre de son analyseur au niveau des feuilles plutôt qu'au niveau des branches ou du tronc. Si c'est le cas, il pouvait pas choisir pire.

    Voici les options que j'avais utilisées
    -Winline -O3 -march=pentium4 -lm -msse -mfpmath=sse -fexpensive-optimizations -ffast-math -mno-ieee-fp

  4. #4
    Invité
    Invité(e)
    Par défaut
    Je suis curieux: de quelle facon tu determine la difference de performance? As-tu jete un coup d'oeil au code assembleur genere? Peut-etre y trouvera tu un indice.

  5. #5
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Sous Visual, y'a moyen de debogger en mode release. Ca permet de voir le code assembleur et même si j'y comprends pas grand chose, c'est facile de voir si les fonctions sont réellement inlinées ou pas. Et elles le sont, là ou il faut.

    Je suis pas habitué à GCC, ni à Linux. J'utilisais jusqu'à présent GCC sous cygwin uniquement pour confirmer que le code c++ était correct, en complément à ICL (intel C++ Compiler sous Windows, mon compilo favoris).
    Mais maintenant je veux publier la bibliothèque, et veux donc la compiler sous différent système.

    Une simple comparaison du temps d'exécution montre que GCC n'atteint pas ICL à la cheville, du moins quand les fonctions 'inline' sont fortement imbriquées. Je veux bien être convaincu du contraire, mais aucun de mes essais de paramétrage des fonctions inline n'est concluant.

    La commande 'time' sous Linux est utile, mais j'ai également des fonctions de mesure du temps d'exécution dans la bibliothèque.
    Sinon un chronomètre ferait aussi l'affaire...

Discussions similaires

  1. Inlining des getters / setters auto avec GCC?
    Par _skip dans le forum Débuter
    Réponses: 45
    Dernier message: 17/08/2009, 12h51
  2. inline avec icc
    Par vandamme dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 18/09/2007, 09h51
  3. asm inline avec gcc
    Par snakemetalgear dans le forum Autres éditeurs
    Réponses: 27
    Dernier message: 08/04/2007, 02h10
  4. les .a avec gcc
    Par Groove dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 31/03/2003, 07h59
  5. getch() avec gcc
    Par Jorus dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 16/12/2002, 14h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo