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

C++ Discussion :

[Optimisation] Meta-prog deux fois moins vite et compilation


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 77
    Par défaut [Optimisation] Meta-prog deux fois moins vite et compilation
    Bonjour,
    Je m'intéresse à la meta-prog pour optimiser des calculs entre des vecteurs(class Point). Cependant je remarque que le calcul fait sur une recursion et specialisation pour boucler va deux moins vite que d'écrire directement le code.
    Est-ce normal? Ai-je mal codé?
    Merci de vos réponse.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    template <int Begin, int End> struct Boucle
    {
      template<class T>
      static void Add( T & p1, const T &p2)
        {
          p1[Begin]+=p2[Begin];
          Boucle<Begin+1,End>::Add(p1,p2);
        }
    };
     
    template <int N> struct Boucle<N, N>
    {
      template<class T>
      static void Add( T & p1, const T &p2) {}
    };
     
    template <int dim, class T>
    class Point
    {
    public:
     
      T dat[dim];
      inline Point<dim,T> & Add(const Point<dim,T>& p)
        {
          Boucle<0, dim>::Add(*this, p);
          return *this;
        }
        inline Point<dim,T> & Addf(const Point<dim,T>& p)
        {
          (*this)[0]+=p[0];
          (*this)[1]+=p[1];
          (*this)[2]+=p[2];
          (*this)[3]+=p[3];
          return *this;
        }
      inline const T & operator []( int i)
        const
        {
          return   this->dat[i];
        }
      inline  T & operator []( int i)
     
        {
          return   this->dat[i];
        }
    };
     
    int main(void){
     
      Point<4,int > p1,p2;
     
      int t1=time(NULL);
      for(int i=0;i<100000;i++)
        for(int j=0;j<1000;j++)
      {
        p1.Add(p2);
      }
      int t2=time(NULL);
      cout<< t2-t1<<endl;
     
      t1=time(NULL);
      for(int i=0;i<100000;i++)
        for(int j=0;j<1000;j++)
      {
        p1.Addf(p2);
      }
     t2=time(NULL);
     cout<< t2-t1<<endl;
    }
    Affichage console:

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 58
    Par défaut
    tu compiles en release?
    théoriquement, c'est censé donner le même resultat. essaie peut-etre de rajouter des __forceinline dans ta struct Boucle. sinon, il faut regarder le code assembleur généré pour comprendre la différence.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 77
    Par défaut
    tu compiles en release?
    je compile avec g++-4.0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    g++-4.0 _rm.cpp -o exe
    Je n'ai que des vagues souvenirs d'assembleur....

    Dans l'article de Gomila, il ne parle pas de _Forceinline.
    Je pense que le compilateur est assez fort pour générer un bon code.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 58
    Par défaut
    je connais pas trop gcc, mais je dirais qu'il faut rajouter -O3 a ta ligne de compilation pour activer les optimisations.
    pour __forceinline, c'est spécifique à visual c++ me semble t'il, donc ça marchera pas dans ton cas. il faut quand même peut-etre mettre juste 'inline'.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 77
    Par défaut
    je connais pas trop gcc, mais je dirais qu'il faut rajouter -O3 a ta ligne de compilation pour activer les optimisations.
    J'ai multiplié par 50 le nombres de tours de boucles:
    J'obtiens:
    Donc à peu de chose près la même chose.

    Il faudrait dire à Gomila de rajouter les spécifications de compilation dans son article

    Merci PierroElMito

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Il faudrait dire à Gomila de rajouter les spécifications de compilation dans son article
    Ca n'a pas vraiment de rapport avec la méta-programmation, ce serait un algo de tri ou un jeu d'échecs ce serait pareil : pas de comparaison valable sans option d'optimisation.
    Pour ça il faut plutôt regarder les tutoriels du genre "bien utiliser son environnement de développement"

    Et pour ceux qui ont un petit background ASM, regarder le code généré sera toujours plus parlant et fiable qu'un benchmark.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 77
    Par défaut
    Intérêt par rapport à un code classique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      t1=time(NULL);
      for(int i=0;i<100000;i++)
        for(int j=0;j<50000;j++)
      {
        for(int k=0;k<4;k++)
        {
          p1[k]+=p2[k];
        }
      }
     t2=time(NULL);
     cout<< t2-t1<<endl;
    Le benchmark est de 46s donc on a gagné plus de 3fois en vitesse.

    Ce que je trouve étrange est pourquoi mon compilateur avec l'option -O3 ou moins -O4 ne déroule pas la boucle???

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 58
    Par défaut
    il faut peut-etre rajouter le parametre:
    -funroll-loops
    a ta ligne de compilation.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 12
    Dernier message: 01/03/2014, 00h58
  2. Réponses: 77
    Dernier message: 15/06/2012, 17h01
  3. Réponses: 4
    Dernier message: 06/04/2012, 17h42
  4. Hosteur.com les panne au moins deux fois par semaine
    Par Akim13 dans le forum Hébergement
    Réponses: 2
    Dernier message: 20/10/2011, 01h51
  5. Sélectionner un même enregistrement deux fois...
    Par Manu0086 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 02/02/2004, 13h09

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