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 :
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 :
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 :
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 ?).
Partager