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 : 46
    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 : 46
    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 : 46
    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