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 :

Nombres complexes - alternative à la SL ?


Sujet :

C++

  1. #1
    Membre régulier

    Inscrit en
    Juin 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 49
    Points : 114
    Points
    114
    Par défaut Nombres complexes - alternative à la SL ?
    Bonjour,

    Je travaille actuellement sur de la simulation numérique et j'utilise des nombres complexes dans mes calculs. En fait, je n'utilise que des opérations arithmétiques de base, donc pas de sin(), cos() ou autre fonction mathématique.

    Pour l'instant, je me suis tourné vers la classe std::complex de la SL, mais je me demandais si il n'existait pas une autre alternative.
    Des mesures ont montré que je passais près de 20% du temps d'exécution du programme dans la fonction operator-(double, complex) et environ 10% dans operator*. Ce sont donc de vrais goules d'étranglement.
    Je me suis demandé si récrire une classe de nombres complexes en utilisant des expressions templates pour optimiser les calculs serait une bonne solution, mais avant cela, je préfère me renseigner pour savoir si il existe une réelle alternative.

    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Hum. Je sens le truc vicieux.
    Pour avoir des infos de profiling, tu as dû passer en debug, ce qui a désactivé l'inlining (des fonctions de cette classe template)
    Tu peux tenter avec des expressions templates, mais je ne suis pas sûr que tu y gagnes énormément.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  3. #3
    Membre régulier

    Inscrit en
    Juin 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 49
    Points : 114
    Points
    114
    Par défaut
    Effectivement, les chiffres sont à prendre avec des pincettes. Ils ont été obtenus en désactivant l'optimisation d'inlining. Si je la réactive, je ne vois plus aucun appel de fonction et ne peu donc rien conclure.
    C'est en quelque sorte le moindre mal que de devoir désactiver l'inlining pour voir où sont les "points chauds".

    De plus, une fois le code inliné, il ne doit rester dans le code que des opérations arithmétiques impliquant des nombres complexes. D'où mon espoir de pouvoir améliorer cette partie du code.
    Je ne peux pas changer l'algorithme ni la méthode utilisée. Il me faut donc chercher du côté de l'implémentation.

  4. #4
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Nanoc Voir le message
    Effectivement, les chiffres sont à prendre avec des pincettes. Ils ont été obtenus en désactivant l'optimisation d'inlining. Si je la réactive, je ne vois plus aucun appel de fonction et ne peu donc rien conclure.
    C'est en quelque sorte le moindre mal que de devoir désactiver l'inlining pour voir où sont les "points chauds".
    Sauf qu'entre la version inlinée et la version non inlinée, les points chauds ne sont pas au même endroit...
    Est-ce que tu as globalement les mêmes performances entre les versions inlinées et les versions non inlinées ?

    Comme Luc, j'ai l'intuition que les expression templates ne vont pas forcément te gagner beaucoup pour ce genre de code. Est-ce que tu as des possibilités de paralléliser ?
    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.

  5. #5
    Membre régulier

    Inscrit en
    Juin 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 49
    Points : 114
    Points
    114
    Par défaut
    Oui oui, j'en suis bien conscient. La version inlinée est beaucoup plus rapide que la version avec les appels de fonction. (Environ 10x plus rapide en -O2 que sans). Mais ce qui peut être gagné sur la version "lente" ne devrait pas péjorer la version rapide. En tout cas j'ose l'espérer.

    J'utilise déjà du parallélisme basique (OpenMP).

    En fait, je pensais me tourner vers des expressions templates en dernier recours. Mais comme c'est un gros boulot, je préfère me renseigner avant.

  6. #6
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    Si tu as une grosse différence entre les deux versions, tu vas passer du temps à optimiser du code qui n'existe pas et n'est donc jamais exécuté

    Est-ce que tu as fait du profiling orienté parallélisme ? Histoire de voir si tu n'es pas dans des situations de false sharing ou autre ?
    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.

  7. #7
    Membre régulier

    Inscrit en
    Juin 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 49
    Points : 114
    Points
    114
    Par défaut
    C'est vrai que je risque d'optimiser du "dead code".
    Comme j'avais un peu de temps à tuer, j'ai essayé de réécrire une classe Complexe ne contenant que les opérateurs dont j'ai besoin et en prenant soin d'utiliser une forme canonique pour les signatures.

    Sur mon Core 2 Duo 2GHz, mon code passe de 47s à 42s. Sur une autre station de travail, quadti-coeur, la différence est plus faible mais toujours en faveur de ma version pourtant assez basique. Les deux versions sont compilées avec GCC 4.4.x et utilisent le niveau d'optimisation -O2.
    Aucune différence au niveau des résultats par rapport à la version utilisant std::complex<double>

    Comme tout ça m'a l'air bien parti (bien que très surprenant), je vais me lancer dans des expressions templates.

Discussions similaires

  1. nombre complexes en C
    Par hicham.jakjoud dans le forum C
    Réponses: 4
    Dernier message: 23/10/2006, 16h51
  2. [Nombre Complexe]affichage formatte
    Par parsy dans le forum Langage
    Réponses: 2
    Dernier message: 20/08/2005, 00h36
  3. Les nombres complexe et delphi
    Par wikers dans le forum Langage
    Réponses: 3
    Dernier message: 04/08/2005, 11h47
  4. [LG]Nombres complexes et forme polaire
    Par chavernac dans le forum Langage
    Réponses: 3
    Dernier message: 28/03/2005, 18h36

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