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]Est-ce possible ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Par défaut [Optimisation]Est-ce possible ?
    Bonjour à tous !
    J'ai une fonction "inlinée" qui est énormément appelée, et je pense qu'elle est optimisable, mais je ne vois pas bien comment...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    __inline
    const Int gClip( const Int iX )
    {
      const Int i2 = (iX & 0xFF);
      if( i2 == iX )  { return iX; }
      if( iX < 0 )    { return 0x00; }
      else            { return 0xFF; }
    }
    Je pense en particulier à virer les if() mais je n'y parviens pas.
    Si jamais ça peut vous aider, le code est destiné à un ARMv5.
    Merci d'avance !

  2. #2
    Membre éprouvé Avatar de galak63
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 126
    Par défaut
    deja tu peux enlever le dernier "else" qui ne sert a rien, apres je vois pas

  3. #3
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Visiblement tu veux faire une saturation.

    2 pistes:

    -utiliser des instructions MMX/SSE2 qui savent faire ça automatiquement dans les calculs. Cette méthode n'est cependant pas évidente à mettre en oeuvre quand on n'a pas l'habitude du calcul vectoriel.

    -tu peux remplacer tes "if" par un min suivi d'un max. Mais plutôt que d'utiliser les min et max classiques (avec "if" ou "?:" qui doivent faire une fois sur deux un saut et donc cassent le pipeline du processeur), préfère les fonctions "__min" et "__max" sous Visual (ou leur équivalent pour d'autres compilos...)

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Quand ta fonction est inlinée le if devrait déjà être enlevé...
    Regarde le code généré par ton compilateur.

  5. #5
    Membre éprouvé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Par défaut
    Justement, le code est assez fouillis, mais il contient plusieurs cmp, je pense donc que les if ne sont pas trop enlevés...

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 24
    Par défaut
    Bonjour,
    perso je ne vois pas de moyen d'optimiser encore la fonction, sauf en la codant en asm...

  7. #7
    Membre expérimenté
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Par défaut
    Citation Envoyé par Charlemagne
    -tu peux remplacer tes "if" par un min suivi d'un max. Mais plutôt que d'utiliser les min et max classiques (avec "if" ou "?:" qui doivent faire une fois sur deux un saut et donc cassent le pipeline du processeur), préfère les fonctions "__min" et "__max" sous Visual (ou leur équivalent pour d'autres compilos...)
    En Visual C 2005, j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #define __max(a,b)  (((a) > (b)) ? (a) : (b))
    #define __min(a,b)  (((a) < (b)) ? (a) : (b))
    :/

  8. #8
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Tiens oui, t'as raison. Je me suis trompé.
    J'étais convaincu du contraire, que min/max étaient implémentés différemment. J'avais pourtant eu (il me semble) des gains significatifs de vitesses grâce à __min/__max. Peut-être que dans certaines circonstances le compilo sait compiler l'opérateur "?:" sans saut.

    J'en reviens à MMX ou SSE2 qui proposent des calculs saturés, ainsi que des instructions min/max sans saut. C'est imbattable...

  9. #9
    Membre éprouvé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Par défaut
    Le processeur est un ARM, que je connais assez mal.
    Comment écrire le min/max sans saut ?

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

Discussions similaires

  1. Est-il possible d'optimiser cette requête ?
    Par kraiggy dans le forum Développement
    Réponses: 6
    Dernier message: 20/03/2009, 15h49
  2. Réponses: 61
    Dernier message: 01/08/2008, 22h56
  3. Est-il possible d'optimiser cette requête ?
    Par Katachana dans le forum Requêtes
    Réponses: 2
    Dernier message: 25/06/2008, 14h50
  4. Réponses: 5
    Dernier message: 20/08/2006, 02h55
  5. Optimiser une requête..est-ce possible ?
    Par Thierry8 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 27/09/2005, 11h31

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