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 de code de calcul scientifique - Allocations de mémoire introuvables


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 8
    Points : 8
    Points
    8
    Par défaut Optimisation de code de calcul scientifique - Allocations de mémoire introuvables
    Bonjour,

    Je suis en train d'implémenter un algorithme de Monte Carlo, initialement en C, en C++. Malheureusement, les performances de mon code sont désastreuses, et un profiling avec Valgrind a révélé que je passe environ la moitié du temps à allouer et désallouer de la mémoire. Le nombre d'appels à malloc est absolument colossal (environ 23 000 000, contre 900 000 dans le code original dans une situation supposée produire les mêmes résultats).

    J'ai donc tenté d'alléger mon code au maximum, notamment en faisant des saletés comme rendre tous les attributs de mes classes publics. J'ai gagné un peu, mais c'est largement insuffisant. L'une de mes fonctions génère la moitié de ces appels, mais je n'y crée strictement rien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    bool montecarlo_dots_pointInTrans(std::vector<double> point, Medium myMedium) {
     
      if ( myMedium.getMediumTypeIndex() == 0 ) {
        for (std::vector<Sphere>::iterator it = ((myMedium.m_SphereField).m_sphereList).begin(); it != ((myMedium.m_SphereField).m_sphereList).end(); ++it) {
          if ( distanceNorm2(point, (*it).m_center) < (*it).m_radius ) {
            return true;
          }
        }
      }
     
      return false;
    }
    Quelqu'un aurait-il une idée de ce qui peut être la cause de mon problème ? Merci d'avance.

    PS : je compile avec GCC 3.4.5.

  2. #2
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    remplace :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool montecarlo_dots_pointInTrans(std::vector<double> point, Medium myMedium) {
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool montecarlo_dots_pointInTrans(std::vector<double> const & point, Medium myMedium) {
    (le const & est important, il fait que ton vecteur n'est pas copié à chaque appel, mais que la fonction ne le modifie pas).

    et j'imagine qu'il faut faire la même chose pour distanceNorm2.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Salut, je fais moi aussi bcp de calcul scientifique. Je fais toujours la même chose : au début j'alloue de la mémoire pour tout un tas de tableaux de travail. Ainsi, quand je rentre dans une fonction, sous-fonction etc... je réutilise mes tableaux de travail plutôt que de chaque fois faire des allocations mémoires.

    Sinon, en C++, je te déconseille de faire des new. Utilise directement le std::vector

  4. #4
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 20
    Points : 35
    Points
    35
    Par défaut
    J'en profite pour préciser un petit peu la réponse de white-tentacle :

    Dans les fonctions montecarlo_dots_pointInTrans() et probablement distanceNorm2(), les tableaux sont passés par copie aux fonctions. C'est à dire qu'à chaque appel de fonction, le tableau est entièrement copié (via le constructeur de copie de std::vector)

    Comme ces tableaux, eux, font des new et des delete dans leurs constructeurs et destructeur respectifs, voilà une sacrée perte de temps.

    Mais, si tu utilise la solution préconisée par white_tentacle, tes fonctions se passent des adresses mémoires de tableau (32 bits en général) au lieu de se passer des tableaux entiers (beaucoup plus de bits en général). Et en l'occurence, aucune allocation dans le heap (c'est ce qui est détecté par Valgrind)!

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    Merci pour ces réponses ! Ça devrait pas mal arranger les choses. Je vais marquer le sujet comme résolu.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 24/08/2014, 13h04
  2. comment optimiser son code en calcul ???
    Par gronaze dans le forum C
    Réponses: 5
    Dernier message: 21/03/2006, 10h41
  3. optimisation du code et var globales
    Par tigrou2405 dans le forum ASP
    Réponses: 2
    Dernier message: 23/01/2004, 10h59
  4. Optimisation en c du calcul du ppcm
    Par KORTA dans le forum C
    Réponses: 3
    Dernier message: 05/09/2003, 08h23
  5. Réponses: 2
    Dernier message: 01/04/2003, 22h09

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