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

RedHat / CentOS / Fedora Discussion :

Comment se passe la gestion des Hugepages


Sujet :

RedHat / CentOS / Fedora

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 11
    Points : 14
    Points
    14
    Par défaut Comment se passe la gestion des Hugepages
    Bonjour,
    Je rencontre quelques difficultés à comprendre comment fonctionnent les HugePages (les pages de 2MB).
    Je travaille sur CentOs 6.3 avec un noyau 3.11.1. Ma machine est un Xeon E5-2620.

    Suivant la façon dont j'alloue ma mémoire, j'observe d'importantes variations de temps de calculs sur des programmes qui font des calculs matriciels de grandes tailles. Après investigations, j'ai pu remarquer que la quantité de Transparent HugePages allouées variait d'un programme à l'autre, voir même au cours du temps.

    Voici un exemple de problèmes que je rencontre sur des programmes effectuant une multiplication matricielle. Seul le temps que prends la multiplication matricielle est mesurée (les temps d'allocation et d'initialisation de la mémoire ne sont pas mesurés.)

    Cas 1 : Si j'alloue la mémoire sous la forme de tableaux 2D avec mmap :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    a = (int**)mmap(0, FILESIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE| MAP_ANONYMOUS, -1, 0);
        for( i=0;i< b_c; i++)
            a[i]=(int*)mmap(0, FILESIZE2, PROT_READ | PROT_WRITE, MAP_PRIVATE| MAP_ANONYMOUS , -1, 0);
    Mes tableaux sont alloués sous formes de HugePages et le temps de calculs est de l'ordre de 82s.

    Cas 2 : Si j'alloue la mémoire sous la forme de tableaux 2D avec malloc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    a=(int **) malloc(sizeof(int *)*a_r);
    for( i=0;i<a_c; i++)
    	a[i]=(int *) malloc(sizeof(int)*a_c);
    Mes tableaux ne sont pas alloués sous formes de HugePages et le temps de calculs est de l'ordre de 140s. Dans ce cas-là, malloc fait appel à mmap et je retrouve les mêmes appels systèmes que dans le cas précédent.

    Cas 3 : Si j'alloue la mémoire sous la forme d'un tableau 1D avec malloc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a=(int *) malloc(sizeof(int *)*a_r*a_r);
    Mes tableaux sont alloués sous formes de HugePages et le temps de calculs est de l'ordre de 42s.

    J'aimerais principalement savoir qui décide d'allouer des HugePages (le noyau, l'OS) ? Et sous quelles conditions ?
    Bien sûr, j'aimerais comprendre pourquoi les cas 1 et 2 qui font exactement les mêmes appels systèmes n'ont pas le même comportement.
    Pour les cas 1 et 3, j'essaie aussi de comprendre pourquoi le cas 3 est deux fois plus lent. (Peut-être le niveau d'indirection supplémentaire ?).

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 894
    Points : 219 531
    Points
    219 531
    Billets dans le blog
    124
    Par défaut
    Bonjour,

    Pour le cas 2, il y a un grand risque de mémoire non contigue, faisant que les accès mémoires seront un peu moins optimisés, je pense.
    Pareil pour le cas 1, je crois.
    Par contre, ici, vous avez un bogue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a=(int *) malloc(sizeof(int *)*a_r*a_r);
    sizeof(int), et non sizeof(int*), je pense.

Discussions similaires

  1. Réponses: 0
    Dernier message: 10/09/2009, 17h48
  2. Comment se passe la gestion des licences avec Kaspersky ?
    Par pepito62 dans le forum Autres Logiciels
    Réponses: 6
    Dernier message: 16/06/2008, 09h42
  3. Réponses: 11
    Dernier message: 15/02/2006, 14h45
  4. [MEA] Comment modéliser la gestion des années ?
    Par ronando dans le forum Schéma
    Réponses: 6
    Dernier message: 10/11/2004, 17h25

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