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 :

operator new et problemes d'alignement memoire + multithreading


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    620
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    Points : 453
    Points
    453
    Par défaut operator new et problemes d'alignement memoire + multithreading
    Bonjour,

    Je suis en train de decouvrir l'ecriture de ses propres operator new et delete sur la base de "Efficient C++: Performance Programming Techniques". A terme, c'est pour servir dans un code de calcul qui tournera sur differents types de machines paralleles, utilisant MPI et a terme OpenMP en plus. J'ai deux "petites" questions :

    1) les auteurs proposent, pour ds objets de taille constante, de reserver une taille memoire grace a sizeof(objet) mais ils ne disent rien des problemes d'alignement en memoire : est-ce que la taille calculee par sizeof a de fait le bon gout de fournir des objets correctement alignes ? sinon, j'imagine qu'on peut perdre du temps au lieu d'en gagner...
    2) A quoi convient-il d'etre attentif pour developper un code compatible OpenMP ? Notamment, y a-t-il des risques si on reserve un morceau de memoire et que differents bouts du calcul OpenMP creent/detruisent dans la meme zone ? Est-ce seulement le cas ? Je ne connais pas du tout OpenMP pour le moment, mais il serait bon de ne pas trop se planter a ce stade histoire de ne pas avoir a tout reecrire quand on s'y mettra... d'ou mon appel a l'aide

    Merci beaucoup

    Hugo

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    1) les auteurs proposent, pour ds objets de taille constante, de reserver une taille memoire grace a sizeof(objet) mais ils ne disent rien des problemes d'alignement en memoire : est-ce que la taille calculee par sizeof a de fait le bon gout de fournir des objets correctement alignes ? sinon, j'imagine qu'on peut perdre du temps au lieu d'en gagner...
    Non, ça ne dépend que de la fonction d'allocation elle-même. Sous Windows, malloc() aligne automatiquement sur 16 octets, ce qui est généralement suffisant pour tout.
    VirtualAlloc(), par contre, aligne sur 64 ko (ou plus précisément, sur SYSTEM_INFO::dwAllocationGranularity).

    Ensuite, si tes objets font 8 octets ou moins, c'est là qu'il devient avantageux d'en allouer tout un tableau plutôt que les allouer un par un.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    620
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    Points : 453
    Points
    453
    Par défaut
    Bonjour Medinoc,

    Un grand merci pour ta reponse !!! Je vois que je dois preciser un peu : mes objets font de fait plus de 8 octets, et les calculs seront en 64 bit (est-ce que cela affecte les affaires ?) et en environnement unix/linux. Le truc c'est que ce sont des objets assez "volatiles" (creation/destruction frequentes) d'ou mon desir de gagner du temps en ecrivant op new et delete... je devine que je vais devoir plonger un peu plus dans la doc et je reviendrai avec des questions... Merci en tout cas

    Hugo

  4. #4
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    Bonjour,

    Citation Envoyé par [Hugo] Voir le message
    1) les auteurs proposent, pour ds objets de taille constante, de reserver une taille memoire grace a sizeof(objet) mais ils ne disent rien des problemes d'alignement en memoire : est-ce que la taille calculee par sizeof a de fait le bon gout de fournir des objets correctement alignes ?
    sizeof te renvoie la taille d'un objet telle que l'a décidé le compilateur. C'est au minimum la taille de toutes tes variables membres + la vtable etc.. (bref, tout ce qui constitue ton instance en mémoire), et il peut aussi y avoir un peu de padding pour améliorer l'alignement mémoire : ça dépend entièrement de ton compilateur. Mon intuition me dit qu'il aligne sur la taille des mots mémoire de la machine (32 bits), mais je me trompe certainement.
    Ce qui est sûr, c'est que tu peux plus ou moins contrôler cela via des extensions du type #pragma pack, mais... je ne pense pas que ce soit la solution la plus intelligente.

    A mon avis, tu devrais jeter un oeil à des solution du type boost pool :
    http://www.boost.org/doc/libs/1_39_0...doc/index.html

    Citation Envoyé par Médinoc Voir le message
    Sous Windows, malloc() aligne automatiquement sur 16 octets, ce qui est généralement suffisant pour tout.
    malloc est implémentée par le compilo C/C++, donc c'est spécifique à chaque (version de) compilateur et pas vraiment lié à Windows.

    Citation Envoyé par Médinoc Voir le message
    VirtualAlloc(), par contre, aligne sur 64 ko (ou plus précisément, sur SYSTEM_INFO::dwAllocationGranularity).
    Tu fais bien de le mentionner. VirtualAlloc est la fonction système de base de gestion mémoire sous Windows et ne devrait pratiquement jamais être utilisée. Il y a tout une "pile" d'autres fonctions bâties les unes sur les autres qui offrent une gestion mémoire perso : VirtualAlloc -> HeapAlloc (tas Win32) -> malloc (tas C) -> new (tas C++) -> boost pool / conteneurs STL / etc...

    Citation Envoyé par [Hugo] Voir le message
    Le truc c'est que ce sont des objets assez "volatiles" (creation/destruction frequentes) d'ou mon desir de gagner du temps en ecrivant op new et delete...
    En fait, ce sont les appels à new/delete qui sont très couteux, car derrière il y a des algorithmes complexes de gestion de l'espace libre pour "caser" ton nouvel objet, c'est une première cause de lenteur. Il y a aussi l'aspect dégradation des performances à cause de la fragmentation mémoire (particulièrement vrai si tes objets ont des durées de vies très aléatoires). Donc l'idéal est de ne pas appeler new/delete du tout, mais plutôt d'allouer un gros tableau que tu gères à la main pour caser tes objets comme l'a dit Médinoc. C'est grosso-modo le fonctionnement de boost pool, ce qui t'évite de coder tout ça !

  5. #5
    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
    Points : 4 625
    Points
    4 625
    Par défaut
    Sous Linux, généralement, malloc (ou operator new) alloue sur un alignement de 8 octets. (ce qui n'est pas suffisant pour faire du SIMD)
    C'est à l'algorithme d'allocation de déterminer l'alignement de ses allocations. (plus l'alignement étant grand, plus il y a de potentiel de gaspillage)
    Boost ftw

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel Voir le message
    malloc est implémentée par le compilo C/C++, donc c'est spécifique à chaque (version de) compilateur et pas vraiment lié à Windows.
    Sauf que je ne connais pas de compilateur dédié à Windows qui n'utilise pas MSVCR*.DLL (à part Visual quand on compile en statique)

    Sinon, la CRT de Microsoft propose également _aligned_malloc() et _aligned_offset_malloc(), qui peuvent s'avérer utiles.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Sinon, la CRT de Microsoft propose également _aligned_malloc() et _aligned_offset_malloc(), qui peuvent s'avérer utiles.
    Je connaissais pas... intéressant !

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    620
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    Points : 453
    Points
    453
    Par défaut
    Bonjour,

    Merci a tous pour vos reponses !!! Je vais editer tout cela des la semaine prochaine (je finis mes vacances d'abord ). boost:pool a l'air effectivement bien sympa !

    Merci encore

    Hugo

Discussions similaires

  1. Placement new et alignement memoire
    Par Genjin dans le forum C++
    Réponses: 5
    Dernier message: 11/06/2007, 14h26
  2. probleme avec la memoire
    Par piff62 dans le forum C
    Réponses: 6
    Dernier message: 25/10/2005, 16h46
  3. Namespace et surcharge operator new/delete
    Par ZeLegolas dans le forum C++
    Réponses: 11
    Dernier message: 26/07/2005, 13h55
  4. probleme d'alignement vertical
    Par mangamat dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 15/02/2005, 22h46
  5. Probleme d'alignement.
    Par roots_man dans le forum ASP
    Réponses: 4
    Dernier message: 30/09/2004, 16h13

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