Historique du calcul haute performance

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.

Le rapport de stage ou le pfe est un document dโ€™analyse, de synthรจse et dโ€™รฉvaluation de votre apprentissage, cโ€™est pour cela chatpfe.com propose le tรฉlรฉchargement des modรจles complet de projet de fin dโ€™รฉtude, rapport de stage, mรฉmoire, pfe, thรจse, pour connaรฎtre la mรฉthodologie ร  avoir et savoir comment construire les parties dโ€™un projet de fin dโ€™รฉtude.

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

Lire le rapport complet

Tรฉlรฉcharger aussi :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiรฉe. Les champs obligatoires sont indiquรฉs avec *