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 -> inline et constructeurs


Sujet :

C++

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 26
    Par défaut Optimisation -> inline et constructeurs
    Bonjour, je suis en train de coder une petite librairie mathématique, et j'ai quelques problemes étranges...

    J'ai commencé à coder une classe matrice3x3, entierement écrite dans le .h (beurk ), avec des mots clés inline notamment sur les surcharges d'opérateurs (meme si je suppose que les fonctions déclarées en plein .h sont passées automatiquement inline par le compilo, surtout ke je demande rapidité au détriment de la taille de l'ecécutable)

    Bref tout va bien, sur une boucle j'effectue 5 milliards de produits matriciels en 5 secondes Ca me parait tres tres rapide, j'espere ne pas etre trompé par une optimisation quelconque sachant ke je multiplie toujours les deux meme matrices...

    Le probleme vient quand j'écrit un .cpp et que j'y place les constructeurs de la classe... Les performances sont en chute libre! Par un facteur surement de plus de 10.

    Est-ce que cela vient du fait k'il n'ya plus de inline possible lorsque je place du code dans le .cpp?
    Comment retrouver les performances du début en pouvant écrire le code proprement dans un .cpp?


    Merci a vous...



    edit : 5 secondes en fait

  2. #2
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Bref tout va bien, sur une boucle j'effectue 5 milliards de produits matriciels en 5 secondes Ca me parait tres tres rapide, j'espere ne pas etre trompé par une optimisation quelconque sachant ke je multiplie toujours les deux meme matrices...
    Lance 1 milliards de produits et regarde si cela prend une seconde...

    Jc

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 26
    Par défaut
    Oui oui c'est le cas Je voulais surtout dire que je ne sais pas si ya pas des bidouilles pour éviter de recalculer ce qui vient de l'être par exemple (mécanisme de cache). M'enfin bon si c'est rapide a ce point tant mieux je suis content de pouvoir faire bruler le fortran lol

  4. #4
    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
    Je voulais surtout dire que je ne sais pas si ya pas des bidouilles pour éviter de recalculer ce qui vient de l'être par exemple (mécanisme de cache)
    Effectivement moi si j'étais toi je ferais attention à ce genre de choses.

    Sinon pour les fonctions inline, même combat que pour les templates : si le compilo ne peut accéder à la définition de la fonction inline (ie. si elle est cloîtrée dans un .cpp), il ne pourra jamais l'inliner...

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 26
    Par défaut
    Ok, donc la réponse c'est : je dois faire des .h de goret si je veux que ca fonce?

  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
    Citation Envoyé par oldfox
    Ok, donc la réponse c'est : je dois faire des .h de goret si je veux que ca fonce?
    Tu peux tout de même séparer les fichiers (mais pas de .cpp), même si pour le compilo ça reviendra au même. Ce sera un peu plus propre.

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 26
    Par défaut
    Deux .h dont l'un inclu l'autre?

    Ca va être beau tout ca


    Merci

  8. #8
    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
    Citation Envoyé par oldfox
    Deux .h dont l'un inclu l'autre?
    Plutôt un .h et un .inl (ou n'importe quoi d'autre). Ca fera toujours un peu plus classe, et ça explicitera un peu plus le rôle du fichier.

  9. #9
    Membre chevronné Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Par défaut
    Salut,

    Une petite precision sur ton test de 5 milliards d'iterations. J'ai fait beacoup de tests de performances de se genre a mon travail et je me suis rendu compte que le compilateur ignorait tout simplement la boucle si le resultat calculé a l'interieur n'est pas utilisé et ne modifie rien

    par exemple dans le cas suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void maFonctionTest()
    {
         double sum = 1.0;
         for(int i=0; i < 1 000 000 000; i++)
        {
              sum+=1.0;
         }
    }
    l'execution sera tres rapide puisque la valeur de sum n'est pas utilisé et l'interieur de la boucle ne change rien a ton environnement donc le compilateur l'ignore.

    Par contre le cas suivant va etre tres different :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void maFonctionTest()
    {
         double sum = 1.0;
         for(int i=0; i < 1 000 000 000; i++)
        {
              sum+=1.0;
         }
        std::cout << sum << "\n";
    }
    puisque le resultat de la boucle est utilisé.

    Maintenant moi j'utilise le compilo de visual studio (le payant) qui optimise beaucoup donc c'est peut etre pas le cas pour d'autre compilateur.

    XXiemeciel

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 26
    Par défaut
    Je suis aussi sur visual. Faudra que j'essaye avec des nombres aléatoires peut etre dans les matrices... Mais le fait que le temps augmente linéairement me fait pense que c'est bon, que c'est juste le c++ qui avale les matrices tres tres vite

    La il n'ya pas d'utilisation du résultat mais je mettais le cout<< avant et ca avait des perf similaires.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    QueryPerformanceCounter(&tic);
    	for (long long int i = 0; i<5000000000; ++i){
    		m3=m1*m2;
    	}
    	QueryPerformanceCounter(&tac);
    	double time = 1000.0 * (tac.QuadPart - tic.QuadPart) / Frequency.QuadPart;
    	cout << i << " multiplications matricielles 3x3 ";
    	cout << " temps ecoule : " << time << "ms " << endl<<endl<<endl;


    J'ai dailleurs perdu pres de deux secondes de traitement depuis que j'ai rajouté d'autres classes dans le programme Vous voyez de quoi ca peut venir? C'est inévitable? Mon exe ne passe pourtant que de 92ko a 100ko entre la version qui met 5s et la version qui met 7 ....

  11. #11
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Visual C++ possède (à partir de la version 7.1 je crois), une option "whole program optimisation". Je t'invite à regarder de ce côté.

    http://msdn2.microsoft.com/en-us/library/0zza0de8.aspx
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  12. #12
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par JolyLoic
    Visual C++ possède (à partir de la version 7.1 je crois), une option "whole program optimisation". Je t'invite à regarder de ce côté.

    http://msdn2.microsoft.com/en-us/library/0zza0de8.aspx
    Je croyais que c'était .NET 2005 en version non express ??

    Sinon, ta fonction est optimisée à fond, le compilo ne fait sans doute qu'une seule fois l'opération. Il est IMPOSSIBLE de fare autant de multiplications en si peu de temps.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 26
    Par défaut
    J'utilise deja toutes les options d'optimisation disponibles. La "global optimization" ne change rien a la perte de perf quand j'ajoute deux autres classes malheureusement.

    Pour le temps, je vais essayer de changer la methode de chronometrage pour etre sur. Car c'est vrai que 5 milliards de produits matriciels, ca fait un sacré paquet de multiplications

    edit: Bon j'avais bien une optimisation qui trainait comme je le craignais Mais 100 millions de produits matriciels en 5 secondes ca reste honorable
    C'est pour de la modelisation physique donc plus je peux en faire a la seconde mieux je me porte...

    De plus le probleme de baisse de perf avec plus de classe semble avoir disparu Ca devait venir de cette optimisation...

    Bon ba impécable plus qu'a rendre les .h lisibles et a continuer de bosser

  14. #14
    Membre chevronné Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Par défaut
    Salut,

    Les processeurs AMD et Pentium 4 posseedent aussi une optimisation a la compilation SSE et SSE2 qui optimise les calculations mathematique en nombres flottants.

    les performances peuvent augmenter jusqu'a 15% dans certains cas.

    XXiemeciel

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 26
    Par défaut
    J'imagine que c'est géré silencieusement par VS7.1 ca non? Car je ne vois aucune option explicite la dessus si ce n'est "optimize for processor : blended / PIV or above".

  16. #16
    Membre chevronné Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Par défaut
    Citation Envoyé par oldfox
    J'imagine que c'est géré silencieusement par VS7.1 ca non? Car je ne vois aucune option explicite la dessus si ce n'est "optimize for processor : blended / PIV or above".
    si tu parles ici de l'option SSE ou SSE2 ce n'est pas par default tu dois le demander pour l'avoir. Et generalement il faut le mettre dans la ligne de command du compilateur (tu trouveras toutes les options sur le site MSDN)

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/vclrfArchMinimumCPUArchitecture.asp

    mais attention cette option empeche le fonctionnement du programme sur des processeurs ne gerant pas SSE / SSE2.

    XXiemeciel

Discussions similaires

  1. Optimisation de votre SGBDR et de vos requêtes...
    Par SQLpro dans le forum Langage SQL
    Réponses: 35
    Dernier message: 11/01/2013, 11h49
  2. Instanciation, constructeur inline, vtable
    Par NiamorH dans le forum C++
    Réponses: 7
    Dernier message: 02/01/2008, 14h20
  3. [C#] Comment optimiser mon constructeur ?
    Par blbird dans le forum C#
    Réponses: 2
    Dernier message: 19/01/2006, 14h41
  4. [langage]Problème de temps de lecture, optimisation
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 08/01/2003, 08h47
  5. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 11/06/2002, 10h24

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