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 :

Comportements différent suivant optimisation ou non


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut Comportements différent suivant optimisation ou non
    Bonjour,

    C'est la première fois que je poste une question dans le forum là, c'est donc que mon problème est particulièrement bizarre.

    Je suis en train de réaliser une bibliothèque de fonction (enfin, bref, peu importe) et j'ai un gros problème. Le comportement du programme est différent suivant que je mettes des optimisations (à partir de -O1) ou non (je travaille avec g++ sous Windows, je n'ai pas pu tester sur une autre architecture pour l'instant).

    Mon programme est monothread et il n'y a pas d'accès asynchrone à la mémoire. En général, ce genre de problème arrive dans ces cas là, et il suffit de mettre les variables avec la qualificatif volatile. Mais ce n'est pas ça ici.

    Quelqu'un aurait-il une idée de programme qui pourrait avoir un comportement différent avec -O1 (à part l'exemple que j'ai cité) ?

    gorgonite m'avait parlé de possibilité d'optimisation bizarre sur les flottants, mais a priori, ce n'est pas ça (je n'ai en tout cas, aucun test sur des flottants).

    Je ne mets pas le code car il est assez méchant, long et technique (traitement d'images assez bourrin).

    Merci d'avance

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Ça sens la variable non initialisée tout ça.
    Ou tout autre comportement indéfini (lecture ou écriture en dehors de la zone allouée, ...).
    Bref un bug qui passe inaperçu sans optimisation, mais pas avec.

  3. #3
    Invité
    Invité(e)
    Par défaut
    je ne saurai te conseiller.

    cela dit, il semblerait que du code qui differe selon l'optimisation, tous les compilos savent faire ca.

    jette un petit coup d'oeil par ici et trouve le dernier paragraphe intitulé Optimize only what counts

  4. #4
    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
    Tu compiles bien en -Wall sans warning ?

  5. #5
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Citation Envoyé par Miles
    Tu compiles bien en -Wall sans warning ?
    Oui, j'utilisais -Wall -W.

    Je suis en train de regarder du côté du dépassement de la zone allouée...

  6. #6
    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
    Tu peux utiliser efence pour vérifier ?

  7. #7
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Hum, là, je suis sous windows et pas sur mon ordinateur, donc ce n'est pas super pratique.

    Enfin, normalement, la plupart des accès que je fais passe par une classe DataBuffer, où pour l'occasion, j'ai testé les dépassements. Et a priori, je n'en fais pas.

    Mais ce qui m'étonne, c'est que le programme marche très bien sans optimisation

  8. #8
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par millie
    Je suis en train de réaliser une bibliothèque de fonction (enfin, bref, peu importe) et j'ai un gros problème. Le comportement du programme est différent suivant que je mettes des optimisations (à partir de -O1) ou non (je travaille avec g++ sous Windows, je n'ai pas pu tester sur une autre architecture pour l'instant).

    Mon programme est monothread et il n'y a pas d'accès asynchrone à la mémoire. En général, ce genre de problème arrive dans ces cas là, et il suffit de mettre les variables avec la qualificatif volatile. Mais ce n'est pas ça ici.
    En passant, volatile n'est pas la solution. Ca peut masquer le problème sur certains systèmes, mais il reste présent.

    Quelqu'un aurait-il une idée de programme qui pourrait avoir un comportement différent avec -O1 (à part l'exemple que j'ai cité) ?
    Tout ce qui est comportement indéfini. Je suppose que tu as fait le tri des avertissements de -Wall -W?

    L'ordre des évaluations peut changer, ce qui peut jouer.

    gorgonite m'avait parlé de possibilité d'optimisation bizarre sur les flottants, mais a priori, ce n'est pas ça (je n'ai en tout cas, aucun test sur des flottants).
    Est-ce que ton code est sensible à la précision (test rapide: le faire fonctionner avec des float et avec des doubles)?

    Est-ce qu'utiliser les options pour utiliser SSE2 pour les flottants plutôt que le coprocesseur compatible 8087 aide (-msse -fpmath=sse) ?

    Et -ffloat-store?

  9. #9
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Tout ce qui est comportement indéfini. Je suppose que tu as fait le tri des avertissements de -Wall -W?
    oui oui



    Est-ce que ton code est sensible à la précision (test rapide: le faire fonctionner avec des float et avec des doubles)?
    Bon, là, j'ai pas encore essayé, il faudrait que je touche à pas mal de fichier.


    Est-ce qu'utiliser les options pour utiliser SSE2 pour les flottants plutôt que le coprocesseur compatible 8087 aide (-msse -fpmath=sse) ?

    Et -ffloat-store?
    En mettant juste les options là, je n'ai pas d'erreur.

    J'ai également essayé avec ceux indiqué dans le man (pas de ma version aussi :s) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    -fdefer-pop -fmerge-constants -fthread-jumps
    -floop-optimize -fcrossjumping -fif-conversion
    -fif-conversion2
    -fguess-branch-probability -fcprop-registers
    -fforce-mem -foptimize-sibling-calls -fstrength-reduce
    -fcse-follow-jumps  -fcse-skip-blocks
    -frerun-cse-after-loop  -frerun-loop-opt -fgcse
    -fgcse-lm   -fgcse-sm -fdelete-null-pointer-checks
    -fexpensive-optimizations -fregmove -fschedule-insns
    -fschedule-insns2 -fsched-interblock -fsched-spec
    -fcaller-saves -fpeephole2 -freorder-blocks
    -freorder-functions -fstrict-aliasing -falign-functions
    -falign-jumps -falign-loops  -falign-labels
    -finline-functions  -frename-registers
    Et ça marche bien...

    Je vais plutôt aller dans le man de mon compilateur

  10. #10
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par millie
    En mettant juste les options là, je n'ai pas d'erreur.
    En compilant en optimisé avec ces options, tu n'as pas le problème que tu as sans? Si c'est le cas, c'est un problème de précision avec les flottants, on peut déjà oublier les autres possibilités.

  11. #11
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Je voulais dire :
    Mettre -ffloat-store ne me provoque pas d'erreur (donc, ça marche bien). L'erreur ne vient donc pas de là.


    J'ai essayé avec les options qu'activent O1 (que m'a dit mon man), et ça marche !

    C'est à dire :
    Pour O1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    -fmerge-constants 
    -fthread-jumps 
    -floop-optimize 
    -fif-conversion 
    -fif-conversion2 
    -fguess-branch-probability 
    -fcprop-registers
    Et Pour O2 :
    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
    -fforce-mem 
    -foptimize-sibling-calls 
    -fstrength-reduce 
    -fcse-follow-jumps  -fcse-skip-blocks 
    -frerun-cse-after-loop  -frerun-loop-opt 
    -fgcse  -fgcse-lm  -fgcse-sm  -fgcse-las 
    -fdelete-null-pointer-checks 
    -fexpensive-optimizations 
    -fregmove 
    -fschedule-insns  -fschedule-insns2 
    -fsched-interblock  -fsched-spec 
    -fcaller-saves 
    -fpeephole2 
    -freorder-blocks  -freorder-functions 
    -fstrict-aliasing 
    -funit-at-a-time 
    -falign-functions  -falign-jumps 
    -falign-loops  -falign-labels 
    -fcrossjumpingfR
    O1 doit donc faire quelque chose en plus

  12. #12
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Citation Envoyé par millie
    J'ai essayé avec les options qu'activent O1 (que m'a dit mon man), et ça marche !

    ...

    O1 doit donc faire quelque chose en plus
    Et quand tu fais la même chose mais avec les options pour -O2 (puisque tu les as sous la main autant essayer) ?

Discussions similaires

  1. [AC-2003] comportement différent suivant les pc - liste paramétrée
    Par Dermochelys dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 04/04/2011, 13h35
  2. Liste déroulante avec comportement différent suivant les navigateurs
    Par smfoa dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 30/01/2011, 11h55
  3. Comportement différent suivant le pc
    Par peter27x dans le forum Débuter
    Réponses: 6
    Dernier message: 27/04/2010, 14h25
  4. Réponses: 0
    Dernier message: 25/10/2008, 10h50
  5. Réponses: 15
    Dernier message: 19/06/2006, 19h25

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