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 Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    F�vrier 2006
    Messages
    2 155
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 2 155
    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 confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    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...

  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 : 46
    Localisation : France, Is�re (Rh�ne Alpes)

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

  4. #4
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    F�vrier 2006
    Messages
    2 155
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 2 155
    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 Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    F�vrier 2006
    Messages
    2 155
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 2 155
    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