Les sciences informatiques sont aujourdโhui devenues un outil essentiel dans le domaine de la recherche et de lโindustrie. Ce domaine apporte en effet un moyen pratique de traiter de grandes quantitรฉs dโinformations, que ce soit au travers de la simulation numรฉrique comme outil prรฉdictif ou pour lโanalyse de donnรฉes expรฉrimentales. Au fil des annรฉes, les calculateurs mis en place pour rรฉsoudre ces problรจmes sont devenus des objets extrรชmement complexes offrant une puissance de calcul toujours croissante. Cโest ainsi que lโon a aujourdโhui atteint lโรฉchelle du pรฉtaflops permettant idรฉalement dโeffectuer 10ยนโต opรฉrations flottantes par secondes. Les nouvelles ambitions se tournent donc vers le pas suivant : lโexaflop avec 10ยนโธ opรฉrations flottantes par secondes. Lโรฉvolution technologique a toutefois effectuรฉ un tournant au courant des annรฉes 2000. Ces annรฉes ont induit des changements en profondeur des architectures faisant apparaรฎtre de nouveaux problรจmes quโil nous faut aujourdโhui prendre en compte.
Ces problรจmes viennent en partie de la consommation รฉnergรฉtique et des contraintes dโaccรจs ร lโinformation (mรฉmoire, stockage) qui tendent ร orienter les รฉvolutions matรฉrielles et logiciels. Lโarrivรฉe conjointe des architectures multicลurs permet de rรฉsoudre certains problรจmes, mais en pose de nombreux autres en demandant notamment une prise en compte explicite de ce changement de paradigme par les programmeurs. Les รฉchelles actuelles conduisent dรฉjร ร des calculateurs trรจs hiรฉrarchiques composรฉs de quelques millions de cลurs. Il en rรฉsulte lโapparition de nouvelles problรฉmatiques notamment de passage ร lโรฉchelle nรฉcessitant de revisiter certains points historiquement considรฉrรฉs comme โmaรฎtrisรฉsโ. Nous verrons que cโest le cas pour les problรจmes de gestion de la mรฉmoire au cลur de notre sujet de thรจse.
Introduction au calcul haute performance
Historique du calcul haute performance
Historiquement, le calcul haute performance prend ses racines dans les centres de recherche avec des calculateurs visant ร rรฉsoudre des systรจmes dโรฉquations complexes, notamment dans le domaine de la physique nuclรฉaire. Les plus gros systรจmes ouvrent alors la voie aux supercalculateurs modernes. On trouve dans un premier temps, de gros serveurs massivement vectoriels , conรงus spรฉcialement pour le calcul scientifique. On peut citer par exemple le CDC6600[Tho80] livrรฉ en 1964 ou le Cray-1[Rus78] de 1976 offrant 166 MFlops ร 83 MHz dotรฉ de 8 Mo de mรฉmoire. Ces calculateurs exploitent des unitรฉs vectorielles de 8 โ 64 bits et voient lโintroduction de registres spรฉcifiques dรฉdiรฉs aux instructions vectorielles pour compenser la lenteur dโaccรจs ร la mรฉmoire centrale, qui, trรจs tรดt, sโavรจre รชtre un facteur limitant les performances.
Trรจs vite lโapproche sโoriente vers une multiplication des composants en utilisant plusieurs processeurs partageant une mรชme mรฉmoire dite partagรฉe telle que le Cray-X/MP[ABHS89] de 1982 avec 4 processeurs. Un an plus tard (1985), le Cray-2 fonctionne ร 283 Mhz soit 1.7 GFlops pour 4 Go de mรฉmoire, proche des ordres de grandeur de ce que lโon trouve dans nos tรฉlรฉphones portables actuels. Lโรฉvolution des machines uniques ร mรฉmoire partagรฉe se poursuit ainsi jusquโau milieu des annรฉes 90 en utilisant jusquโร 2048 processeurs (Hitachi SR2201 [FYA+97].
Toutefois, lโaccroissement de ces systรจmes centralisรฉs pose dโรฉnormes problรจmes de conception, notamment pour les accรจs ร la mรฉmoire qui ne parviennent plus ร nourrir efficacement les unitรฉs de traitement. Les annรฉes 1990 orientent lโรฉvolution vers des supercalculateurs de type grappes[BB99, EKTB99] (clusters) composรฉs de multiples unitรฉs autonomes (nลuds) interconnectรฉes par des rรฉseaux spรฉcialisรฉs. Ce type dโapproche est dรฉjร exploitรฉ pour dโautres usages ร moindre รฉchelle tels que les systรจmes VAX/VMS[KLS86] de 1986. Chaque unitรฉ est alors plus simple ร concevoir et ร exploiter. La complexitรฉ est donc repoussรฉe sur lโutilisation de lโensemble qui doit notamment prendre en charge les communications nรฉcessaires entre les nลuds. Lโรฉvolution mรจne en 1992 au Paragon XP/S[EK93], dotรฉ de 2048 processeurs pour 32 nลuds. Ce contexte gรฉnรจre un besoin de nouveaux environnements de programmation multi-nลuds tels que PVM[FM90, Sun90]. Le travail conjoint de divers organismes et entreprises a รฉgalement menรฉ ร lโinterface MPI(Message Passing Interface [MPI94] dont on reparlera plus en dรฉtail dans la suite et qui reste aujourdโhui la maniรจre commune de programmer les calculateurs de type grappe.
Avec un coรปt croissant de dรฉveloppement, les processeurs spรฉcialisรฉs pour le calcul scientifique commencent ร devenir un facteur limitant dans les annรฉes 2000. Certains se tournent alors vers les marchรฉs grands publics pour y trouver des processeurs moins adaptรฉs, mais moins chers, tels que ceux fabriquรฉs pour les stations de travail plus classiques. Cette รฉvolution pousse donc ร un retour du calcul scalaire, lโutilisation de vecteurs intรฉressant moins lโindustrie du PC. En terme de calcul scientifique, on observe dans ces annรฉes une divergence avec lโapparition des grilles de calcul[FK99]. Cette approche est axรฉe sur des calculs intrinsรจquement parallรจles et indรฉpendants, utilisรฉs principalement pour les analyses de donnรฉes expรฉrimentales, notamment en physique des particules ou astrophysique. Pour ce type dโusage, chaque machine traite les donnรฉes dโune mini-expรฉrience sans dรฉpendance avec les autres. On รฉvite ainsi la contrainte des communications inter-nลuds qui, devenue inexistante, ne nรฉcessite plus de placer lโensemble des nลuds dans le mรชme lieu ni de recourir ร lโutilisation de rรฉseaux rapides onรฉreux. La communautรฉ scientifique dispose aujourdโhui de projets ร lโรฉchelle nationale, tels que Grid5000[CCD+05] ou mondiale avec la grille du CERN (WLCG)[Rob12]. De maniรจre complรฉmentaire, le domaine des supercalculateurs se concentre autour des simulations ร grandes รฉchelles et vise ร rรฉpartir un calcul unique sur une part importante du supercalculateur. Ce besoin maintient la nรฉcessitรฉ de faire communiquer efficacement un nombre croissant de composants.
Les annรฉes 2000 ont ainsi รฉtรฉ marquรฉes par la course au pรฉtaflops avec une approche multinลuds, multi-processeurs et multi-cลurs entraรฎnant une envolรฉe du nombre de cลurs. La barre symbolique est franchie en 2008 par les Amรฉricains (DOE/IBM) avec Roadrunner [BDH+08] : 1.046 pรฉtaflops pour 129 600 cลurs, dont une part dโaccรฉlรฉrateurs de type Cell. Du cรดtรฉ franรงais (CEA/Bull), cโest Tera 100 qui franchit le pas en 2009 : 1.05 pรฉtaflops pour 138 368 cลurs. La barre symbolique du million de cลurs est atteinte fin 2012 par la machine Sequoia (DOE/IBM). Cette รฉvolution continue aujourdโhui avec 3.1 millions de cลurs pour le supercalculateur chinois Thiane-2 (NUDT), offrant 33.8 pรฉtaflops. La tendance se poursuit ; il nous faut donc apprรฉhender le dรฉveloppement de logiciels devant ร lโavenir fonctionner sur des millions de cลurs.
Lโhistoire du HPC est ponctuรฉe de tests de performances qui permettent de comparer les capacitรฉs de calcul des machines dans le temps. ร ce titre, le Linpack [Don88] sert de base au classement mondial des 500 calculateurs les plus puissants[Top10].
รvolution actuelle des architectures
Dans cette section, nous allons nous centrer sur lโรฉvolution survenue dans les processeurs au cours des annรฉes 2000. Cette รฉvolution notamment marquรฉe par lโarrรชt de lโaugmentation des frรฉquences sโest vue associรฉe ร lโarrivรฉe du multicลur. Ceci change la maniรจre dโexploiter le matรฉriel et impacte les mรฉcanismes de gestion de la mรฉmoire en faisant apparaรฎtre les problรฉmatiques abordรฉes dans cette thรจse.
Un รฉquilibre entre dรฉbit et latenceย
Avant dโentrer dans les dรฉtails de lโรฉvolution des architectures, il semble important dโintroduire les notions capitales de dรฉbit et latence pour les architectures informatiques. On dรฉfinira tout dโabord le dรฉbit comme le nombre dโactions effectuรฉes en un laps de temps dรฉterminรฉ. Remarquons que lโon ne sโintรฉresse pas ici au temps propre de ces actions, mais au temps de lโensemble. ร lโopposรฉ, la latence sโintรฉresse au temps dโexรฉcution dโune instruction, donc le temps que lโappelant doit attendre pour voir cette action se terminer. Les recherches dโoptimisation des architectures, peuvent, dโune certaine maniรจre, se dรฉcrire comme une recherche dโรฉquilibre entre ces deux concepts.
Ces concepts sโappliquent ร lโexรฉcution des instructions par le processeur, aux transferts mรฉmoires ou aux รฉchanges rรฉseau. Idรฉalement, le dรฉbit devrait รชtre favorisรฉ pour maximiser les performances en effectuant un maximum dโactions en un temps limitรฉ. Un programme est toutefois conรงu comme une suite dโactions dont certaines dรฉpendent du rรฉsultat de la prรฉcรฉdente. Dans un tel contexte, la rรฉduction de la latence est critique car elle contraint la capacitรฉ ร exรฉcuter rapidement lโaction suivante, donc le dรฉbit dโexรฉcution. Lโ augmentation des frรฉquences de fonctionnement est par exemple un moyen mรฉcanique de gagner sur les deux postes. Ceci en rรฉduisant par dรฉfinition la latence et en augmentant le dรฉbit. Nous verrons toutefois quโelle a aujourdโhui atteint ses limites au niveau de lโexรฉcution des instructions.
Les รฉchanges entre les composants physiques peuvent toutefois introduire des contraintes sur ces dรฉbits et latences en fonction des capacitรฉs des liens utilisรฉs pour les faire communiquer. Les amรฉliorations basรฉes sur la sรฉmantique dโรฉchange entre composants sont malheureusement souvent contraintes ร favoriser lโun des deux points. Nous รฉvoquerons indirectement ce problรจme dans les sections qui suivent au vu des architectures exploitรฉes dans les calculateurs actuels.
Lโarrivรฉe du multicลurย
ร ses dรฉbuts, lโinformatique a connu une croissance exponentielle des performances permise par la vรฉrification des lois de Moore[Moo65, Moo75] et Dennard[DGR+74]. La premiรจre loi prรฉdit un doublement du nombre de transistors imprimables sur une surface donnรฉe tous les dix-huit mois. La seconde remarque que la rรฉduction de taille des transistors permet de rรฉduire leur consommation รฉlectrique. Ces deux lois ont une consรฉquence sur les performances. Tout dโabord, la rรฉduction de taille des transistors permet dโaugmenter leur frรฉquence de fonctionnement. A partir les quelques MHz des premiers calculateurs, on atteint le GHz peu avant lโan 2000, donc une croissance de 2 ordres de grandeur en 25 ans. Dโautre part, la loi de Moore implique une augmentation du nombre de transistors utilisรฉs dans les puces. Cela se traduit, dรจs les annรฉes 80[RF92], par une multiplication des unitรฉs de traitement ร lโintรฉrieur du processeur, offrant la possibilitรฉ dโextraire du parallรฉlisme dโapplications sรฉquentielles (parallรฉlisme dโinstruction, ILP ou Instruction Level Parallelism) implรฉmentรฉ par deux approches complรฉmentaires : utilisation de pipeline et dโarchitectures superscalaires.
Lโintroduction de la notion de pipeline[HP06]ย permet de dรฉcouper lโexรฉcution dโune instruction en plusieurs รฉtages, ร la maniรจre dโune chaรฎne dโassemblage dโusine. Plusieurs instructions peuvent donc รชtre en cours de dรฉcodage et traitement. Cette technique ne rรฉduit pas le temps dโexรฉcution de lโinstruction, mais permet dโaugmenter le dรฉbit par lโexรฉcution simultanรฉe de plusieurs dโentre elles. Les processeurs actuels utilisent essentiellement des pipelines dโune profondeur allant de 10 ร 20. Dโautre part, certaines unitรฉs de traitement lentes peuvent รชtre la source de ralentissement (accรจs mรฉmoire, calcul flottant…). Disposer de plus de transistors permet donc de dupliquer certaines dโentre elles (architectures superscalaires). Lโexploitation efficace de ces unitรฉs passe donc par un ordonnancement adaptรฉ des instructions pour maximiser lโutilisation des unitรฉs disponibles. Cet ordonnancement peut รชtre pris en charge de maniรจre statique par le compilateur (architecture dite in-order) ou de maniรจre dynamique par le processeur (architecture dites out-of-order). Le rรฉordonnancement dynamique des instructions offre รฉgalement un moyen efficace de rรฉduire lโimpact des latences dโaccรจs ร la mรฉmoire. Ceci en permettant au processeur dโexรฉcuter dans lโintervalle les instructions disposant dรฉjร de leurs donnรฉes.
Or, au dรฉbut des annรฉes 2000, ces dรฉmarches atteignent leurs limites. Les raisons tiennent en partie ร la fin dโapplication de la loi de Dennart[DCK07]. La fin dโapplication de cette loi entraรฎne des problรจmes de consommation รฉlectrique et de dissipation thermique non compensรฉs par lโรฉvolution des finesses de gravure. De plus, lโรฉvolution plus lente des technologies de stockage mรฉmoire creuse le fossรฉ entre la vitesse de traitement dโune donnรฉe et son temps dโaccรจs en mรฉmoire. Les augmentations de frรฉquences sont donc rendues moins intรฉressantes, voir inefficaces. Ce problรจme est connu sous le nom de mur de la mรฉmoire depuis sa formalisation en 1995 par Wulf[WM95]. Dโun autre cรดtรฉ, lโexploitation du parallรฉlisme dโinstruction se heurte ร une problรฉmatique de complexitรฉ croissante. Concernant lโallongement des pipelines, on observe ainsi chez Intel, un pic ร 30 niveaux pour les Pentium 4, contre 14 pour les Core 2 Duo qui suivent. Avec des pipelines trรจs longs, les opรฉrations impliquant une purge de ces derniers deviennent trรจs pรฉnalisantes avec un temps important de re-remplissage de ce dernier. Le rรฉordonnancement des instructions, lui, se trouve limitรฉ par les dรฉpendances entre ces derniรจres, limitant les gains au-delร dโun certain seuil.
|
Table des matiรจres
INTRODUCTION
I Contexte
1 Introduction au calcul haute performance
1.1 Introduction
1.2 Historique du calcul haute performance
1.3 รvolution actuelle des architectures
1.3.1 Un รฉquilibre entre dรฉbit et latence
1.3.2 Lโarrivรฉe du multicลur
1.3.3 Processeur versus GPGPU
1.4 Les dรฉfis de lโExaflops
1.4.1 Gestion de lโรฉnergie
1.4.2 La mรฉmoire
1.4.3 Nombre de cลurs
1.4.4 Pannes
1.4.5 Entrรฉes/sorties
1.4.6 Rรฉsumรฉ
1.5 Environnement de calcul de la thรจse
1.6 Modรจles dโexรฉcution
1.7 Modรจles de programmation
1.7.1 Modรจle ร mรฉmoire partagรฉe ou distribuรฉe
1.7.2 MPI : Message Passing Interface
1.7.3 Threads : pthread, OpenMP
1.7.4 CUDA / OpenCL
1.7.5 Tรขches : Cilk, OpenMP-3
1.7.6 Les PGAS
1.7.7 Rรฉsumรฉ
1.7.8 Problรจme du mรฉlange
1.7.9 Le projet MPC
1.8 Question ouverte sur les DSL
1.9 Le systรจme dโexploitation
1.10 Applications tests
1.11 Conclusion
2 Gestion de la mรฉmoire
2.1 Introduction
2.2 Le systรจme dโexploitation
2.2.1 Problรฉmatiques du multiprogramme/multiutilisateur
2.2.2 Adresses virtuelles, adresses physiques
2.2.3 Segmentation et pagination
2.2.4 Notion de processus et threads
2.2.5 Espace noyau et utilisateur
2.3 Interface avec les applications
2.3.1 Les appels systรจmes
2.3.2 Fautes de pages
2.4 Lโallocateur mรฉmoire (malloc)
2.4.1 Interface
2.4.2 Fragmentation
2.4.3 Ramasse-miettes
2.4.4 Problรฉmatique dโimplรฉmentation
2.5 Accรจs ร la mรฉmoire
2.5.1 Les caches
2.5.2 MMU et TLB
2.5.3 Grosses pages
2.5.4 Accรจs mรฉmoire non uniformes : NUMA
2.5.5 OS et support NUMA
2.6 Conclusion
II Contribution
3 Interfรฉrences des mรฉcanismes dโallocations
3.1 Pagination et associativitรฉ
3.2 Politiques de pagination
3.2.1 Pagination alรฉatoire : Linux
3.2.2 Coloration de pages
3.2.3 Grosses pages
3.2.4 Conclusion
3.3 Rรฉsultats expรฉrimentaux
3.3.1 Protocole expรฉrimental
3.3.2 Rรฉsultats des NAS sรฉquentiels
3.3.3 Rรฉsultats des NAS parallรจles
3.3.4 Rรฉsultats sur EulerMHD
3.4 Pagination et stratรฉgie de malloc
3.4.1 Impact de lโimplรฉmentation de malloc
3.4.2 Problรฉmatique des paginations rรฉguliรจres
3.4.3 Associativitรฉ des caches partagรฉs
3.4.4 Parallรฉlisme des accรจs en lecture et รฉcriture
3.4.5 Effet de la table des pages et des TLB
3.4.6 Impacte de la table des pages
3.5 Analyse gรฉnรฉrale et recommandations
3.5.1 Consรฉquence sur les politiques de pagination
3.5.2 Extension matรฉrielle pour les grosses pages ?
3.5.3 Consรฉquence sur malloc
3.6 Outil dโanalyse
3.6.1 Objectifs
3.6.2 Points techniques sur la mรฉthode
3.6.3 Informations collectรฉes
3.7 Application de rรจgles de dรฉcalage
3.8 Conclusion
4 Mรฉcanismes dโallocations parallรจles et contraintes mรฉmoires
4.1 Approche gรฉnรฉrale
4.2 Description du besoin
4.3 Aspects gรฉnรฉriques des allocateurs
4.3.1 Gestion des blocs libres
4.3.2 Fusion et scission de blocs
4.3.3 Contraintes dโalignements
4.3.4 Placement des mรฉtadonnรฉes
4.4 Allocateurs disponibles
4.4.1 Linux : dlmalloc et ptmalloc
4.4.2 Hoard
4.4.3 Jemalloc
4.4.4 TCmalloc
4.4.5 MAMA
4.5 Impact des allocateurs
4.6 Structure de lโallocateur
4.6.1 Organisation gรฉnรฉrale
4.6.2 Gestion des blocs
4.6.3 Discussion ร propos des petits blocs
4.6.4 Suivi des macro-blocs allouรฉs
4.6.5 Surchage possible de la fonction de libรฉration
4.6.6 Libรฉrations distantes
4.6.7 Realloc
4.7 Rรฉutilisation des gros segments
4.7.1 Mรฉthode de rรฉutilisation de TCMalloc
4.7.2 Mรฉthode proposรฉe
4.7.3 Recomposition de gros segments
4.7.4 Problรจme de surallocation
4.8 Remise ร zรฉro pour calloc
4.9 Destruction du tas
4.10 Adaptation consommation versus performances
4.11 Aspect NUMA
4.12 NUMA et initialisation
4.13 Gestion de segments utilisateurs
4.14 Mรฉthode dโimplรฉmentation
4.15 รvaluation
4.15.1 Micro-benchmarks
4.15.2 Rรฉsultats sur sysbench
4.15.3 Rรฉsultats sur la simulation numรฉrique Hera
4.16 Bilan gรฉnรฉral
4.17 Discussion dโamรฉliorations possibles
4.17.1 Niveaux topologiques
4.17.2 Politique de consommation dynamique
4.17.3 Surcharge de mmap/munmap ?
4.17.4 Modification de Jemalloc ?
4.17.5 API, sรฉmantique NUMA ?
5 Problรฉmatique de remise ร zรฉro de la mรฉmoire
5.1 รvaluation du problรจme de performance
5.2 Utilisation de grosses pages
5.3 Le problรจme de la remise ร zรฉro
5.4 Solutions existantes
5.5 Proposition : rรฉutilisation des pages
5.6 Extension de la sรฉmantique mmap/munmap
5.7 Dรฉtails dโimplรฉmentation
5.7.1 Modification de Linux
5.7.2 Capture des zones sans rรฉutilisation ?
5.7.3 Limite de consommation et rรฉclamation
5.7.4 Intรฉgration dans les allocateurs
5.8 Rรฉsultats expรฉrimentaux
5.8.1 Micro-benchmark
5.8.2 Application HydroBench
5.8.3 Application Hera
5.9 Conclusion
6 รtude complรฉmentaire sur le problรจme de consommation : KSM
6.1 Introduction
6.2 Mรฉmoire partagรฉe
6.3 Principe de KSM
6.3.1 Lโidรฉe maรฎtresse
6.3.2 Fonctionnement interne
6.3.3 Marquage des pages
6.3.4 Activation et configuration
6.4 Test sur Hera
6.4.1 Mรฉthode de test
6.4.2 Rรฉsultats
6.5 Limitations de KSM
6.6 Bรฉnรฉfices potentiels de KSM
6.7 Piste non รฉvaluรฉe : extension de la sรฉmantique de mmap
6.8 Conclusion
III Conclusion
CONCLUSION