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 :

gcc et optimisation


Sujet :

C++

  1. #1
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut gcc et optimisation
    Bonjour à tous !

    Je suis sous Ubuntu 10.04 avec gcc 4.4.3, le tout dans Code::Blocks.
    Lorsque je compile mon programme en debug, no problemo. Options -g -pedantic -std=c++0x -Wall -fexceptions.
    En mode release, je remplace le -g par -O2. Et là, j'ai plus d'image. Pour une application de traitement vidéo, c'est balo.

    Comment expliquer une telle différence avec juste un -O2 ?
    J'ai passé mon prog à valgrind au cas où et rien de bien méchant pour l'instant :
    ==4490== LEAK SUMMARY:
    ==4490== definitely lost: 0 bytes in 0 blocks
    ==4490== indirectly lost: 0 bytes in 0 blocks
    ==4490== possibly lost: 288 bytes in 1 blocks
    ==4490== still reachable: 57,299 bytes in 70 blocks
    ==4490== suppressed: 0 bytes in 0 blocks
    ==4490== Reachable blocks (those to which a pointer was found) are not shown.
    Je suis très preneur d'idées

  2. #2
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Utilisation d'un comportement indéfini quelque part, qui passe sans optimisation mais pas avec.

    Un classique, c'est qu'une variable locale a la bonne valeur en debug mais pas en optimisé, mais il y a d'autres choses.

    En passant, avec gcc tu peux faire -g -O2, ça peut t'aider à trouver le problème...
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  3. #3
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Essaie de compiler avec -Wuninitialized voire -Wextra qui pourrait pointer le problème soulevé par Jean-Marc

  4. #4
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    hum... je sais pas si c'est encourageant tout ça...
    Mon programme est pour l'instant très petit ( moins de 1000 lignes), je fais juste de l'acquisition vidéo que j'affiche. Personnellement, je pense pas avoir fait de boulettes dans mon code. J'ai tout de même cherché des causes classiques de comportement indéterminé (oubli de virtual pour le destructeur, ...), mais pour l'instant RAS.
    J'ai également mis les warnings extra, mais non j'ai rien...

    J'utilise un driver très récent d'un matériel très nouveau via V4L (Video For Linux), vous pensez que ça peut venir de là? J'ai pas mal d'appel à ioctl pour la configuration de la carte.

    Ca commence à devenir agaçant ces problèmes sous linux ...
    A noter qu'en -O, ça marche encore. Mais après -O1 ou -O2 ou -O3 ça change de comportement !


  5. #5
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Bon bah je viens de trouver... C'était une spécialization de fonction template qui n'était pas appelé, mais l'implémentation générique qui ne fait rien à la place...

    Voici la déclaration et spécialisation des template:
    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
     
    template <typename T>
    void image_fill(unsigned char* , unsigned char*, std::vector<T>& )
    {}
     
     
    /**
    * \brief function to fill unsigned char image from raw YUYV data
    */
    template <>
    void image_fill(unsigned char* begin, unsigned char* end, std::vector<unsigned char>& image)
    {	
        int comp = 0;
        unsigned char *p = begin;
        for (unsigned int i = 0; p != end; p=p+1, comp++)
        {
            if (comp%2 == 0)
            {
                image[i] = *p;
                i++;
            }
        }
    }
     
    /**
    * \brief function to fill YCrCb image from raw YUYV data
    */
    template <>
    void image_fill(unsigned char* begin, unsigned char* end, std::vector<YCbCr>& image)
    {
        unsigned char *p = begin;Le dernie
        for (unsigned int i = 0; p != end; p = p + 4, i = i + 2) // 4 bytes, two pixels
        {
            image[i]   = boost::tuples::make_tuple(*p, *(p+1), *(p+3));
            image[i+1] = boost::tuples::make_tuple(*(p+2), *(p+1), *(p+3));
        }
    }
    Rien de bien méchant, mais comme j'ai plusieurs fichiers qui la référence, j'avais une erreur de lien. Du coup j'avais décidé de mettre la spécialisation dans un .cpp...

    Mon code appelant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void CFrameGrabber::ReadFrame()
    {
    assert(buf.index < n_buffers);
     
        unsigned char* p = reinterpret_cast<unsigned char*>(m_buffers[buf.index].start);
        unsigned char* end_image = p + buf.bytesused;
     
        // Call to the template
        image_fill(p, end_image, m_buffer);
    }
    De là à savoir pourquoi il y a une différence en normal et -O2, là je donne ma langue au chat ! Pour résoudre le problème, j'ai tout mis à nouveau dans le .h, et j'ai inliner mes template pour pas avoir d'erreur d'édition de liens, et ça marche.

    C'est pas ce que je voulais faire, mais j'ai pas de meilleure idée pour l'instant !
    Si vous en avez une, n'hésitez pas !

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

Discussions similaires

  1. Optimisation dans gcc -> erreur de segmentation
    Par nuwanda03 dans le forum C
    Réponses: 7
    Dernier message: 28/05/2013, 00h53
  2. Réponses: 6
    Dernier message: 25/06/2011, 00h12
  3. Réponses: 0
    Dernier message: 03/04/2011, 16h32

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