D2.1 État de l’art sur les supports d’exécution pour environnements petascales VERSION DATE EDITORIAL MANAGER AUTHORS STAFF Copyright 1.0 2010 Sylvain Peyronnet Camille Coti, Elisabeth Brunet, Thomas Herault, Sylvain Peyronnet ANR SPADES. 08-ANR-SEGI-025. D2.1 État de l’art sur les supports d’excution pour environnements petascales Contents 1 Introduction 2 État de l’art 2.1 Environnements parallèles . . . . . . 2.1.1 OpenMP . . . . . . . . . . . 2.1.2 Thread Building Blocks(TBB) 2.2 Environnements distribués . . . . . . 2.2.1 MPICH2 . . . . . . . . . . . 2.2.2 OpenMPI . . . . . . . . . . . 2.2.3 HARNESS . . . . . . . . . . 2.2.4 KAAPI/TakTuk . . . . . . . 2.2.5 MRNet . . . . . . . . . . . . 2.3 Environnements hybrides . . . . . . 2.3.1 UPC/GASNet . . . . . . . . 2.3.2 PM2 . . . . . . . . . . . . . . 2.3.3 La suite CHARM++ . . . . . 3 Conclusion ANR SPADES. 08-ANR-SEGI-025 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 6 8 8 8 9 10 10 11 12 12 13 16 Page 3 D2.1 État de l’art sur les supports d’excution pour environnements petascales Chapter 1 Introduction L’environnement d’exécution, aussi appelé runtime environment, est un élément essentiel dans les architectures de type grappes de machines, grands calculateurs et grilles. Son rôle consiste à interfacer l’ensemble des ressources physiques d’une machine – qu’elles soient locales ou distantes – afin que les applications s’y exécutant soient en mesure de profiter de toute la puissance possible et ce, de manière transparente. Idéalement, un environnement d’exécution propose donc, d’un point de vue local, une unification de l’environnement pour que chacune des fonctions soit exécutéee de la manière la plus adaptéee à l’ensemble des ressources; d’un point de vue distant, un système de communication efficace qui permettent d’échanger données, informations et ordres aux différentes ressources distantes à travers des communications de types point-à-point ou de diffusion. Une définition des services rendus par l’environnement d’exécution à l’application a été établie dans [20]. On peut citer les fonctions principales : lancement de l’application sur les nœuds de calcul (bien que cette tâche peut être déléguée à une application tiers spécialisée, l’environnement d’exécution doit être interfacé avec cette application), mettre en relation les processus de l’application les uns avec les autres (échange des informations de contact), transférer les entrées/sorties et les signaux, assurer un monitoring des processus et des ressources (que ce soit binaire, du type “processus lancé” vs “processus mort”, ou donnant des informations plus précises comme la charge CPU, etc) Que ce soit au sein d’un nœud ou d’une plateforme distribuée, un environnement d’exécution idéeal doit également être capable de pallier aux pannes éventuelles. Cela passe par la collection d’informations sur les différentes ressources afin d’établir (si possible) un état global de la machine et ainsi de maintenir la cohérence de perception des ressources (en en désactivant/ajoutant certaines, le cas échéant). Nombre de travaux se sont penchés sur l’élaboration de telles solutions. Cependant, aucun ne propose de solution répondant entièrement à ce cahier des charges. Nous verrons donc comment certains se combinent. L’objectif de la tâche 2 intitulée Runtime pour architecture Petascale étant de concevoir un environnement d’exécution passant à l’échelle et tolérant aux pannes, nous allons ici étudier les runtimes majeurs actuellement proposés et mettre en évidence l’environnement d’exécution le plus adapté à une telle évolution. ANR SPADES. 08-ANR-SEGI-025 Page 4 D2.1 État de l’art sur les supports d’excution pour environnements petascales Chapter 2 État de l’art Il s’agit d’étudier les principes fondamentaux des runtimes, leur architecture, d’extraire leurs composants, d’étudier l’implémentation de ces derniers et leur système de communication. Cet état de l’art doit produire une sorte de spécification des principes et des mécanismes utilisés dans les runtimes pour les applications parallèles. On étudiera particulièrement ces principes et ces mécanismes sous l’angle de l’extensibilité et de la tolérance aux défaillances. Les runtimes actuels n’ont pas tous la même portée. Certains s’attachent à répartir la charge de travail sur l’ensemble des processeurs d’une même machine, c’est ce qu’on appelle ici les environnements parallèles. D’autres sont plus orientés sur le déploiement sur des machines distantes, appelés ici envrionnements distribués. Un dernière catégorie s’attaquent aux deux fronts par combinaison de techniques ici nommés environnements hybrides. 2.1 Environnements parallèles Avec l’expansion des processeurs multicœurs, il est de première importance de savoir extraire un maximum de parallélisme (parallélisme à grain fin) d’une application de manière à utiliser efficacement l’ensemble les processeurs. 2.1.1 OpenMP Le standard OpenMP [38] définit un ensemble d’annotations pour la parallélisation de programmes séquentiels. L’annotation de certaines portions de code écrites de manière séquentielle génère des soustâches qui vont alors pouvoir s’exécuter en parallèle sur la machine à travers l’utilisation de threads. C’est ce qu’on appelle une approche Fork/Join : le processus invocant la section parallèle crée les threads (fork) et attent leur terminaision avant de continuer son exécution (join). L’illustration typique porte sur la parallélisation d’une boucle (voir Figure 2.1): en l’annotant, les itérations du corps de boucle vont être réparties et exécutées par différents threads. Le nombre de threads maximum est fixé par l’utilisateur grâce une variable d’environnement. Plusieurs implémentations de ce standard sont proposées comme GOMP [23] de GNU, Sun Studio Compiler [47] de Sun Microsystems, OpenMP PGI Compiler [41]. Question scalabilité, les performances de chacune de ces implémentations sont principalement dépendantes de celles des bibliothèques de threads sur lesquelles elles reposent. [Le système de threads de GNU/Linux est scalable car il fait attention à la localité de ses threads : chaque processeur crée les threads générés par ce qu’il exécute et les placent en local, l’ordonnancement est fait à partir de cette même file en local avant d’aller plus loin dans la machine et faire du vol de travail. Il n’y a pas de système centralisé.] En général, chaque implémentation d’OpenMP développe sa propre bibliothèque de threads de niveau utilisateur de manière à garder le contrôle sur l’ordonnancement qui est fait. Les plus “intelligents” utilisent le principe de vol de travail comme celui fait dans GNU/Linux. Par contre, la plupart ne prenne pas en compte des paramètres ANR SPADES. 08-ANR-SEGI-025 Page 5 D2.1 État de l’art sur les supports d’excution pour environnements petascales int main (int argc, char **argv) { ... #pragma omp parallel for for(int i=0; i < 4; i++){ //corps de boucle } ... return 0; } Figure 2.1: Boucle séquentielle paralélisée grâce à OpenMP. fondamentaux à l’obtention de performances dans ce type d’environnement. En effet, tous les aspects liés au placement de threads ainsi qu’à la localité (avec ce que cela engendre en terme de contention d’accès et de faux partage) sont primordiaux pour dans un tel contexte [26, 39]. Les ordonnanceurs de threads n’ont en général pas à leur disposition d’outils performants qui leur permettent d’être aussi fins [10]. Ainsi, afin que les performances des systèmes ne s’écroulent pas, les implémentations d’OpenMP fixent en général un thread par coeur de la machine. ForestGOMP [50] est une extension du GOMP (le runtime OpenMP de GNU). Son objectif est de prendre en compte ce type d’information afin de faire un ordonnancement dynamique est accord avec les affinités mémoire et la topologie de la machine. ForestGOMP est une brique logicielle de la suite PM2 que nous allons détailler dans la Section 2.3.2 de cet état de l’art. 2.1.2 Thread Building Blocks(TBB) TBB [29] est une bibliothèque open-source template de C++ développée par Intel qui a pour but de faciliter l’expression du parallèlisme d’une application écrite en C++. TBB a été conu en adéquation avec les spécificités du langage sur lequel il s’appuie afin de combiner parallélisme de tâches et parallélisme par données. L’aspect orienté objet de C++ permet à l’utilisateur d’exprimer différentes tâches de travail à réaliser qui pourront s’exécuter en parallèle ou successivement selon leurs inter-dépendances en les encapsulant dans des objets C++ de différente nature. Lors de l’implémentation de ces objets/tâches, l’utilisateur peut également exprimer l’aptitude d’une tâche à être subdivisée en plusieurs tâches. Un constructeur spécifique doit pour cela être spécifié qui décrire comment subdiviser l’espace de données traiter par la tâche originale en deux – et ceci de manière récursive – et générer une seconde tâche qui se chargera du traitement de ce nouvel sous-ensemble de données. Ainsi, le traitement est parallélisé selon un paradidme de parallélisation de données. De plus, les templates de C++ permettent de la description généraliste de la parallélisation de structures de boucles. L’exécution de telles structures ne va pas se traduire par la génération de threads comme le fait OpenMP mais par celle de tâches. Ainsi, les threads ne vont ni être spécialisés dans l’exécution d’un type de tâche comme l’illustre la Figure 2.2 ni tous assignés à la même opération sur des sous-ensemble de données du problème comme illustrés dans la Figure 2.31 mais se voient assigner différentes tâches pour lesquelles d’autres threads pourront venir donner main forte sur un sous-ensemble de données, comme l’illustre la Figure 2.41 . Ainsi, du point de vue de l’utilisateur, TBB abstrait les aspects techniques relatifs aux threads au travers de ses tâches. Les 1 Figure tirée du livre [42]. 08-ANR-SEGI-025 Page 6 D2.1 État de l’art sur les supports d’excution pour environnements petascales Figure 2.2: Parallélistaion par tâche : Une tâche est générée pour chaque opération à exécuter. Figure 2.3: Parallélisation de données : chaque sous-ensemble de données est assigné une entité traitante. différentes tâches générées sont ensuite exécutées sur les directives de l’ordonnanceur de tâches qui va les assigner aux threads qu’il aura lui-même créés. Ces derniers sont alimentés selon le principe de vol de travail, vol qui lui-même procède selon l’approche du diviser pour régner. En effet, si aucune tâche n’est disponible, l’ordonnanceur est alors en mesure de provoquer la division d’une tâche afin de récupérer du travail. Lors de la conception de TBB , une attention particulière a été portée au problème de la scalabilité. Ainsi, de nombreaux aspects ont été pris en compte comme la synchronisation entre threads, les problèmes de partage de données, les affinités mémoire, les défauts de cache, etc. En partique, l’ordonnanceur de tâches de TBB est basé sur l’agorithme de vol de travail de Cilk [6] qui utilise un système de queues sans verrou, des primitives de synchronisation atomique ont été mises en avant et un allocateur de mémoire passant à l’échelle est développé afin de privilégier les affinités aux niveaux des caches et limiter les contentions. Figure 2.4: Combinaison de parallélisation : les tâches sont subdivisées en plusieurs sousensemble le cas échéant. 08-ANR-SEGI-025 Page 7 D2.1 État de l’art sur les supports d’excution pour environnements petascales 2.2 Environnements distribués Dans le contexte des grappes et grilles de calcul, la problématique de déploiement des applications parallèles ne se focalise plus sur l’utilisation de chaque unité de calcul d’une machine mais sur l’utilisation de toutes les machines de l’environnement. L’échelle de parallélisme considérée dans ce type de support d’exécution monte d’un niveau. L’exécution d’une application se déroule alors au travers de celle de plusieurs processus totalement indépendants qui sont ordonnancés en parallèle sur des ressources distantes via un environnement d’exécution distribué. 2.2.1 MPICH2 L’environnement d’exécution de MPICH2 [24] est MPD [12]. Il s’agit d’un ensemble de démons s’exécutant en permanence sur les nœuds de calcul. Lorsqu’une application MPI est démarrée, les démons MPD créent un nouveau processus sur chaque nœud impliqué, appelé PM (Process Manager ). Ces processus créent une instance de l’environnement d’exécution de l’application. Les démons MPD, eux, sont partagés entre les multiples applications exécutées, et sont persistents. MPD a été conçu dans une optique de simplicité afin d’être potentiellement exécuté par le superutilisateur des machines. C’est pourquoi certains choix techniques ont été faits dans ce sens. Les démons sont interconnectés selon une topologie en anneau, non scalable. C’est acceptable jusqu’à quelques dizaines de processus, au-delà les performances s’en ressentent fortement. Ce choix a été fait dans le cadre de cet objectif de simplicité. À l’époque où MPD a été conçu, c’était une limite raisonnable : tous les utilisateurs n’avaient pas de clusters composés de milliers de nœuds, et les super-calculateurs composés de plusieurs dizaines de milliers de nœuds utilisent un lanceur dédié, spécialisé pour la machine. Aujourd’hui, cette option n’est plus raisonnable. MPD tolère les défaillances dans le sens où l’ensemble des démons ne meurent pas en cas de mort d’un démon. L’anneau est reconstruit en établisssant une connexion entre les deux voisins du démon mort. On réduit ainsi la taille du système, mais il n’est pas possible d’ajouter de nouveaux démons dans l’anneau. ADI 3 (Abstract Device Interface) CH3 Channel SOCK (TCP socket) SHMEM RDMA Système d'exploitation Figure 2.5: Architecture de MPICH2 2.2.2 OpenMPI L’environnement d’exécution d’OpenMPI [21] est appelé ORTE [13]. Il est composé d’un ensemble de démons s’executant sur chaque nœud impliqué dans le calcul. Deux modes d’utilisation sont disponibles : un mode dédié, où l’environnement d’exécution est déployé pour chaque application, et un mode persistent, où l’environnement d’exécution s’exécute en permanence et est partagé entre les multiples applications exécutées. 08-ANR-SEGI-025 Page 8 D2.1 État de l’art sur les supports d’excution pour environnements petascales Tout comme le reste d’OpenMPI, ORTE est basé sur une architecture modulaire par composants [46]. Chaque fonctionnalité devant être remplie est implementée dans un framework, qui définissent une API. Chaque façon d’implémenter cette API est implémentée dans un composant. Une instance d’un composant chargée lors de l’exécution est un module. Par exemple, le framework chargé des communications point-à-point pour les fonctions MPI est appelé BTL (Byte Transfer Layer ). Plusieurs composants sont disponibles pour ce framework : il existe un composant pour les réseaux TCP, un autre pour les réseaux Myrinet (un composant pour le pilote MX, un autre composant pour le pilote GM), etc. Si plusieurs cartes réseaux sont disponibles, plusieurs modules peuvent être utilisés en même temps. Chaque composant est compilé sous forme d’une bibliothèque à liaison dynamique, qui est chargée à l’initialisation de l’exécution. Cette modularité rend ORTE particulièrement facile à étendre en ajoutant des fonctionnalités. Par exemple, le support d’un nouveau lanceur ou d’un nouveau type de cartes réseaux ne nécessite que la ré-implémentation de l’API du framework concerné. La modularité permet également un réglage particulièrement fin des paramètres d’OpenMPI et d’ORTE, grâce au choix des composants utilisés et à leurs paramétrage. Des composants spécialement orientés vers la scalabilité (plusieurs milliers de nœuds) sont disponibles pour plusieurs frameworks. Par exemple, les communications collectives constitue une fonctionalité importante d’un environnement d’exécution. Il existe un framework dédié, et un composant utilisant des algorithmes de communications optimisés. Dans l’état présent, ORTE peut raisonnablement être utilisé pour des exécutions impliquant plusieurs milliers de nœuds. Actuellement, ORTE n’est pas tolérant aux défaillances. La comportement par défaut est d’assurer la terminaison de l’application en tuant les autres processus. Un mécanisme de tolérance aux pannes par prise d’état coordonnée est disponible, mais tous les processus étant relancés, il implique le redémarrage de toute l’application, environnement d’exécution y compris. OMPI ORTE OPAL Système d'exploitation Figure 2.6: Architecture d’OpenMPI 2.2.3 HARNESS HARNESS est un environnement d’exécution d’ancienne génération. Plus généraliste, il est utilisé par l’implémentation MPI FT-MPI [18, 19] et PVM [48]. Sa scalabilité repose sur la topologie interne, basée sur des arbres binomiaux utilisés pour les communications et routant les flux de données. La topologie utilisée a des propriétés de résilience [2] lui permettant de survivre aux pannes et de 08-ANR-SEGI-025 Page 9 D2.1 État de l’art sur les supports d’excution pour environnements petascales continuer à fonctionner. Cette résilience l’a rendu particulièrement adapté à des systèmes de communications tolérants aux pannes comme FT-MPI ou PVM. L’architecture de HARNESS n’est pas modulaire ; il est par conséquent difficile de l’étendre en lui ajoutant des fonctionalités. De plus, le projet HARNESS et les projets l’utilisant ne sont à ce jour plus actifs : PVM est encore maintenu mais n’est plus développé, et FT-MPI a été interrompu pour former OpenMPI. 2.2.4 KAAPI/TakTuk KAAPI [22] est un système d’ordonnancement de tâches sur des systèmes multi-processeurs. Les tâches sont décrites au moyen de l’interface Athapascan, en définissant les fonctions à exécuter et les dépendances entre les tâches. Athapascan construit alors le graphes de dépendances entre les tâches, et les ordonnances en utilisant des algorithmes de vol de cycle. KAAPI utilise le lanceur TakTuk [35] comme environnement d’exécution “rudimentaire” et la bibliothèque de communications Inuktitut [34]. TakTuk permet notamment de lancer l’application en parallèle, mais aussi de transférer des fichiers (par exemple, les fichiers de données) et de compiler l’application sur les machines cible. Cette dernière fonctionnalité s’avère particulièrement utile dans des environnements hétérogènes comme les grilles, qui constituent une cible importante de KAAPI. TakTuk est un outil qui a pour vocation de déployer des commandes en parallèles sur un ensemble de ressources distantes. Basé sur un algorithme adaptatif de vol de cycles, il s’auto-déploie et met en place une infrastructure de communication qui sera utilisée pour propager les commandes et les données. Il peut propager une commande, copier un fichier, effectuer des communications le long de cette infrastructure et du multiplexage/démultiplexage d’entrées-sorties. L’algorithme d’adaptation sur lequel il se base tient compte dynamiquement des performances des machines et des interconnexions et de la charge de travail sur chacune des ressources. TakTuk peut s’auto-déployer sur des machines où il n’est pas installé. Une fois l’infrastructure TakTuk en place, il est possible de propager des commandes entre les démons TakTuk, à la manière des lanceurs spécialisés. TakTukComm, une bibliothèque de communications est disponible pour effectuer des communications sur cette infrastructure. TakTuk cible principalement les systèmes à grande échelle, potentiellement hétérogènes, comme les grandes clusters et les grilles de calcul. Il n’est pas tolérant aux défaillances. Son architecture n’est pas modulaire, et les choix techniques le rendent difficilement extensible. De plus, il s’agit principalement d’un outil de propagation, et il ne remplit pas toutes les fonctions d’un environnement d’exécution. La bibliothèque TakTukComm peut cependant permettre d’écrire une surcouche permettant de l’exploiter comme tel, comme c’est le cas dans KAAPI. 2.2.5 MRNet MRNet [4, 43] (Multicast/Reduction Network) est un réseau d’overlay fournissant des outils de communications pour des systèmes parallèles et distribués. Les communications se basent sur les deux primitives de diffusion et de réductions, permettant de transférer et d’aggréger des données entre des nœuds selon une topologie scalable. La topologie utilisée est un arbre, choisi pour ses qualités de scalabilité. Les processus MRNet sont répartis selon une topologie d’arbre et supportent les processus de l’application cible, qui sont situés au niveau des feuilles de l’arbre. Un processus particulier, la frontale du réseau MRNet, déploie les autres processus MRNet et sert de point central pour les communications. En particulier, la frontale peut initier des communications point-à-point ou collectives avec le reste de l’application. Les communications passent par des canaux logiques ou flux, qui peuvent être montants (des processus vers la frontale) et descendants (de la frontale vers les processus). Les processus de l’application peuvent être groupés selon des communicateurs semblables aux communicateurs MPI : une communication collective sur un communicateur est effectuée par tous les processus faisant partie de ce communicateur. Comme en MPI, l’opération effectuée lors d’une réduction peut être définie par le programmeur d’une application MRNet. Ces opérations sont appelées des filtres. 08-ANR-SEGI-025 Page 10 D2.1 État de l’art sur les supports d’excution pour environnements petascales nutmeg:0 => c01:0 c02:0 c03:0 c04:0 ; c03:0 => c05:0 ; c04:0 => c06:0 c07:0 c08:0 c09:0 ; c08:0 => c10:0 ; c09:0 => c11:0 ; nutmeg | | ------/| |\ / | | \ / | | \ / | | \ c01 c02 c03 c04 | | c05 | ------/ | | \ / | | \ / | | \ c06 c07 c08 c09 | | c10 c11 Figure 2.7: Exemple de topologie MRNet, décrite (à gauche) par les liens entre les nœuds. En se basant sur une redondance de l’information inhérente dans les processus de l’arbre, MRNet établit une structure de données cohérentes (la cohérence est caractérisée comme “faible”, c’est-à-dire que plusieurs copies de chaque donnée existent dans le système avec différents niveaux de cohérence) permettant de rétablir la structure de l’arbre MRNet en cas de défaillance. La localité des données redondées dans les processus survivants assure une limitation du nombre de processus impliqués dans le réablissement de la structure après une défaillance. Le modèle de rétablissement sur défaillance de MRNet est appelé “compensation d’état” (state compensation) [3]. La topologie de l’arbre peut être décrite dans un fichier en décrivant les liens entre les nœuds MRNet ; il ne s’agit pas forcément d’un arbre binomial ou de Fibonacci. Un exemple de topologie et sa description est donné figure 2.7. Cette fonctionalité permet à MRNet de s’adapter à des topologies non uniformes, comme les clusters de clusters. Ses performances et sa scalabilité en font un bon candidat pour lancer des outils comme des démons de monitoring et aggréger les résultats, notamment grâce à des fonctionnalités de transferts de fichiers en mode zéro-copie. MRNet est une bibliothèque de communication permettant d’écrire des environnements d’exécutions pour applications parallèles ou distribuées, et non un environnement d’exécution. Pour en obtenir un, il faut écrire une frontale et des nœuds en utilisant les fonctions de cette bibliothèque. Ce n’est pas une bibliothèque de communications complète dans le sens o ses communications ne sont pas aussi flexibles que celles d’une bibliothèque de communications point-à-point comme MPI. Par exemple, elles ont lieu exclusivement entre la frontale et un processus feuille. L’API MRNet ne permet pas d’établir de flux entre deux processus feuille. De même, les opérations collectives (diffusion et réduction) peuvent avoir pour racine exclusivement la frontale MRNet. Enfin, MRNet ne fournit pas de méthode de lancement : l’arbre MRNet doit être déployé par un système externe, ce qui est possible avec SSH ou RSH dans les environnement simples, mais peut devenir non-trivial dans un environnement nécessitant l’utilisation d’un ordonnanceur de tâches. MRNet ne fournit pas de moyen de s’interfacer avec les systèmes de lancement. 2.3 Environnements hybrides L’augmentation massive du nombre de cœurs engendre de nouvelles problématiques. Lorsqu’une application écrite selon un paradigme de programmation distribué est exécutée sur un ensemble de machine, l’utilisateur produit généralement un schéma de placement classique de manière à associer une instance 08-ANR-SEGI-025 Page 11 D2.1 État de l’art sur les supports d’excution pour environnements petascales à une ressource de calcul. Ainsi, une exécution dimensionnée pour une plate-forme massive peut alors se voir repliée sur un sous ensemble, voire même sur un même nœud. La cohabitation de tant d’instances sur une même machine entrane de nombreux effets de bords sur l’accès aux différentes ressources mais également en terme de consommation mémoire. Afin de limiter ce genre de phénomènes, des approches de programmation hybride sont développées qui mèlent programmation distribuée et programmation parallèle. Une instance de l’application qui à présent parallélisée au travers de d’outils tels qu’OpenMP, TBB, etc. Cela permet non seulement de préserver les ressources mais aussi de produire un grain de parallélisme plus adapté à l’application considérée. 2.3.1 UPC/GASNet L’implémentation de UPC développée à Berkeley [28] utilise l’infrastructure de communications GASNet [7] comme environnement d’exécution et de communication. GASNet est également utilisé par les langages de programmation à espace d’adressage partitionné Titanium [25] (Java) et l’implémentation du Laboratoire National de Los Alamos de Co-Array Fortran [15]. Une tentative d’utilisation de MPI comme environnement de communication a été effectuée [9], utilisant alors les routines MPI pour les accès à la mémoire distante et l’environnement d’exécution de l’implémentation MPI comme environnement d’exécution, par héritage de la couche MPI. Cet essai n’a pas été concluant, montrant le fait que le paradigme MPI n’est pas adapté pour des opération RDMA comme les accès à des zones mémoire distantes de type push et pull nécessaires aux langages de programmation à espace d’adressage partitionné comme UPC. Une étude comparative utilisant plusieurs applications et comparant leur implémentation en MPI et UPC a montré une meilleure scalabilité des applications UPC [17], la plupart du temps du fait de la meilleure connaissance de la localité des donnés fournies par UPC. Cependant, les opérations collectives n’étant pas le propos de UPC, elles sont pour le moment implémentées de façon naı̈ve et non sclalable. GASNet est extensible dans le sens où il peut être porté sur d’autres types de réseaux. Son architecture sépare distinctement la couche transport, qui implémente les communications sur un type de réseau donné, des fonctionnalités de l’interface GASNet. Pour le porter sur un nouveau type de réseaux, il suffit de réimplémenter cette couche de communications. Les couches supérieures ne sont pas modulaires. Il n’inclut pas de fonctionalités relatives à la tolérance aux défaillances. 2.3.2 PM2 La suite logicielle PM2 [37] est constituée de plusieurs briques, comme l’illustre la Figure 2.8. Comme cité dans la Section 2.1.1, la partie parallèle de cet environnement d’exécution est assurée car ForestGOMP, tandis que la partie distribuée est obtenue par NewMadeleine au travers de MPICH2. ForestGOMP s’appuie sur l’ordonnanceur de threads Marcel [16] afin de tirer parti des ressources de calcul disponibles. En effet, pour accélérer l’éxécution d’une application sur une machine hiérarchique, Marcel dispose dún ensemble fonctionnalités supplémentaires, dénommé BubbleSched [49] permettant de modéliser la machine, et de structurer l’ensemble des threads de l’application suivant certains paramètres (suivant des affinités mémoire, par exemple). Ainsi, le compilateur OpenMP de GNU a été modifié de manière à ce qu’il génère une hiérarchie de bulles Marcel suivant l’arbre décrit par les annotations, et non plus une hiérarchie de thread POSIX. De cette façon, une hiérarchie d’entités ordonnancables par Marcel de manière adaptée est obtenue. A la manière de l’ordonnaceur de threads GNU/Linux, Marcel a été conçu avec des perspectives de scalabilité. Les files de threads prêts sont localisées par processeur, la création de thread est réalisée localement et l’ordonnanceur ne cherche à ordonnancer que les threads qui lui sont rattachés tant que la charge est suffisante afin de ne pas provoquer de contention. Les aspects de tolérance aux pannes ne sont pas traités. La partie communication de PM2 est assurée par NewMadeleine [11] qui est une bibliothèque de communication qui a pour vocation d’appliquer des stratégies d’ordonnancement sur l’ensemble des communication en concurrence sur une machine, et ce de manière dynamique. La portée de ce travail sur des plate-formes de grande envergure est réalisée au travers du portage qui a été réalisé de MPICH2 08-ANR-SEGI-025 Page 12 D2.1 État de l’art sur les supports d’excution pour environnements petascales Figure 2.8: Architecture de la suite PM2 sur NewMadeleine [36]. Ainsi, les critères de scalabilité et de tolérances aux pannes sont héritées de MPICH2 (voir Section 2.2.1). 2.3.3 La suite CHARM++ La suite CHARM++ (voir Figure 2.9) est développée au sein du projet PPL (Parallel Programming Laboratory) du département d’informatique de l’Université d’Urbana-Champaign. C’est un projet de long terme : l’article fondateur de CHARM++ [32] date de 1993 et est toujours actif. Charm++ est utilisé comme runtime pour plusieurs applications significatives telles que NMAD [40], ou encore OpenAtom [51] sur des plate-formes d’envergure [5, 8]. Charm++ [31] a un modèle de programmation qui privilégie le parallélisme de tâches. En effet, une même application va être divisée en plusieurs opérations, liées les unes aux autres au travers d’un graphe de dépendances. Ceci est une approche qui diffère de celle traditionnellement employée dans les applications MPI où l’application est scindée en sous domaines qui sont traités au sein de processus indépendants en parallèle. Chaque tâche est encapsulée dans un objet Charm++ (aussi appelé chare) écrits en C++ et qui a l’avantage de pouvoir migrer sur l’ensemble des ressources de la machine en vue de faire de l’équilibrage de charge. Plusieurs politiques d’équilibrage de charge ont été conçues afin d’exploiter au mieux les ressources disponibles. Certaines [45] sont basées sur des approches centralisées très efficaces pour un nombre de processeurs limité car elles deviennent rapidement des goulots d’étranglement. Les politiques distribuées enlèvent le problème de goulot d’étranglement mais ont de piètre performance. Avec des solutions hybrides, basées sur une approche hiérarchique, Charm++ arrive à passer à l’échelle sur un nombre très important de processeurs [52]. De plus, les affinités de chares avec les ressources de communication peuvent être prises en compte dans l’ordonnnancement afin de limiter les contentions et donc améliorer encore les performances [1, 33]. AMPI(Adaptive MPI ) [27], sur-couche de Charm++, permet d’exécuter des applications qui suivent le paradigme de programmation de MPI au sein de Charm++. Après quelques modifications néanmoins (pas de variables globales, par exemple), chaque processus d’une application MPI qui aurait été lancé dans une configuration classique est encapsulé dans un objet Charm++ sous le forme d’un thread de niveau utilisateur. Ces threads sont également migrables, toujours dans l’optique d’équilibrer la charge 08-ANR-SEGI-025 Page 13 D2.1 État de l’art sur les supports d’excution pour environnements petascales Figure 2.9: Architecture de la suite CHARM++ sur l’ensemble des ressources de calcul. CONVERSE [30] est la brique de base de la suite. Il fait l’interface avec les ressources de calcul et les ressources réseaux. Une instance de Converse est initialisée par cœur de processeur grâce à un lanceur qui diffère selon les environnements. Si la couche de communication bas-niveau est une implémentation de MPI, le lanceur associé (appel à mpiexec) va être utilisé afin d’initialiser –en même temps que l’environnement de communication – l’instance de Converse, qui elle-même initialise la pile Charm++. De même, avec le lanceur de PVM, etc. Dans ce cas, nous nous retrouvons avec les contraintes liées aux implémentations et citées aux sections précédentes (cf. Sections 2.2.1 et 2.2.2). Dans le cas contraire, les instances peuvent être lancées via l’utilitaire qui se connecte à chaque nœud via rsh, récolte toutes les informations avant de les redistribuer et démarrer les instances de Converse (le protocole est illustré à la Figure 2.10). Par ailleurs, la suite Charm++ propose plusieurs mécanismes de tolérance aux pannes : • la méthode classique du checkpoint/restart. Elle permet de sauvegarder l’état de l’exécution de l’application sur chaque machine au travers de fichiers stockés sur un serveur central. En cas de défaillance, l’application est ainsi redémarrée à partir du dernier point de sauvegarde effectué. • FTC-Charm++ est un procédé amélioré o les checkpoints sont stockés en local dans l’espace mémoire temporaire scratch des machines. Cela a l’avantage de permettre une reprise plus rapide et de ne pas imposer l’utilisation d’un serveur central qui doit se comporter de manière infaillible pour que le système fonctionne. FTC-Charm++ a également l’avantage de reprendre l’exécution sur une nombre déséquilibré de ressources dans le cas o il n’était pas possible de les remplacer [53]. • FTL-Charm++ est un protocole de tolérance aux fautes à enregistrement de messages pessimiste. Chaque objet va logguer les messages qu’il envoie dans la mémoire locale. 08-ANR-SEGI-025 Page 14 D2.1 État de l’art sur les supports d’excution pour environnements petascales Figure 2.10: Prototype du lanceur de Charm++ • Proactive Fault Tolerance [44, 14] permet de faire de la prédiction de pannes. Basé sur l’observation de la machine, le système réagit en migrant les objets sur une ressource en voie de devenir défaillant sur des ressources saines. L’ensemble des ressources sont inventoriées au travers d’un arbre qui est remodelé à partir de ces prédictions et permet de maintenir l’exécution de l’application sur l’ensemble des ressources restantes. 08-ANR-SEGI-025 Page 15 D2.1 État de l’art sur les supports d’excution pour environnements petascales Chapter 3 Conclusion Modèle de programmation Extensibilité Tolérance aux pannes OpenMP parallèle oui non TBB parallèle oui non MPICH2 distribué non non OpenMPI distribué oui oui KAAPI/TakTuk distribué non non MRNet distribué non oui UPC/GASNet hybride non non PM2 hybride non non Charm++ hybride oui oui Aucune des solutions étudiées dans ce document ne répond totalement au cahier des charges entrepris. Plusieurs approches apportent des éléments de réponse avec des implémentations plus ou moins matures. Il est également à noter que nous avons ici étudier des environnements d’exécution de différents niveaux dont les architectures cibles, les paradigmes employés, les niveaux d’optimisation d’exploitation sont eux-mêmes différents. Ainsi, même si tous ces concepts ne peuvent raisonnablement pas se regrouper au sein d’un seul et unique environnement d’exécution idéal, il est néanmoins primordial de les étudier afin d’en tirer des concepts qui pourraient se révéler fondamentaux par la suite. Ainsi, nous allons à présent nous focaliser sur trois environnements afin d’étudier en détail leur profil réél : ORTE, HARNESS et CHARM++. ANR SPADES. 08-ANR-SEGI-025 Page 16 D2.1 État de l’art sur les supports d’excution pour environnements petascales Bibliography [1] Tarun Agarwal, Amit Sharma, and Laxmikant V. Kalé. Topology-aware task mapping for reducing communication contention on large parallel machines. In Proceedings of IEEE International Parallel and Distributed Processing Symposium 2006, April 2006. [2] Thara Angskun, George Bosilca, and Jack Dongarra. Binomial graph: A scalable and fault-tolerant logical network topology. In Ivan Stojmenovic, Ruppa K. Thulasiram, Laurence Tianruo Yang, Weijia Jia, Minyi Guo, and Rodrigo Fernandes de Mello, editors, Parallel and Distributed Processing and Applications, 5th International Symposium, ISPA 2007, Niagara Falls, Canada, August 29-31, 2007, Proceedings, volume 4742 of Lecture Notes in Computer Science, pages 471–482. Springer, 2007. [3] Dorian C. Arnold and Barton P. Miller. A scalable failure recovery model for tree-based overlay networks. (TR1626). [4] Dorian C. Arnold, G. D. Pack, and Barton P. Miller. Tree-based overlay networks for scalable applications. In IPDPS. IEEE, 2006. [5] Abhinav Bhatele, Sameer Kumar, Chao Mei, James C. Phillips, Gengbin Zheng, and Laxmikant V. Kale. NAMD: A Portable and Highly Scalable Program for Biomolecular Simulations. Technical Report UIUCDCS-R-2009-3034, Department of Computer Science, University of Illinois at UrbanaChampaign, February 2009. [6] Robert D. Blumofe, Christopher F. Joerg, Bradley C. Kuszmaul, Charles E. Leiserson, Keith H. Randall, and Yuli Zhou. Cilk: An efficient multithreaded runtime system. In Journal of Parallel and Distributed Computing, pages 207–216, 1995. [7] Dan Boachea. D. bonachea gasnet specification, v1.1. Technical Report UCB/CSD-02-1207, U.C. Berkeley, 2002. [8] Eric Bohm, Abhinav Bhatele, Laxmikant V. Kale, Mark E. Tuckerman, Sameer Kumar, John A. Gunnels, and Glenn J. Martyna. Fine Grained Parallelization of the Car-Parrinello ab initio MD Method on Blue Gene/L. IBM Journal of Research and Development: Applications of Massively Parallel Systems, 52(1/2):159–174, 2008. [9] Dan Bonachea and Jason Duell. Problems with using MPI 1.1 and 2.0 as compilation targets for parallel language implementations. IJHPCN, 1(1/2/3):91–99, 2004. [10] François Broquedis. De l’exécution structurée de programmes openmp sur architectures hiérarchiques. Mémoire de dea, Université Bordeaux 1, June 2007. [11] Elisabeth Brunet. Une approche dynamique pour l’optimisation des communications concurrentes sur réseaux haute performance. PhD thesis, Université Bordeaux 1, 351 cours de la Libération — 33405 TALENCE cedex, December 2008. [12] R. Butler, W. Gropp, and E. Lusk. A scalable process-management environment for parallel programs. In Jack Dongarra, Péter Kacsuk, and Norbert Podhorszki, editors, Recent Advances in Parallel Virtual Machine and Message Passing Interface, 7th European PVM/MPI Users’ Group Meeting, Balatonfüred, Hungary, September 2000, Proceedings, volume 1908, pages 168–175. Springer, 2000. ANR SPADES. 08-ANR-SEGI-025 Page 17 D2.1 État de l’art sur les supports d’excution pour environnements petascales [13] Ralph H. Castain, Timothy S. Woodall, David J. Daniel, Jeffrey M. Squyres, Brian Barrett, and Graham E. Fagg. The open run-time environment (openRTE): A transparent multi-cluster environment for high-performance computing. In Beniamino Di Martino, Dieter Kranzlmüller, and Jack Dongarra, editors, Recent Advances in Parallel Virtual Machine and Message Passing Interface, 12th European PVM/MPI Users’ Group Meeting, Sorrento, Italy, September 18-21, 2005, Proceedings, volume 3666 of Lecture Notes in Computer Science, pages 225–232. Springer, 2005. [14] Sayantan Chakravorty, Celso L. Mendes, and Laxmikant V. Kalé. Proactive fault tolerance in mpi applications via task migration. In HiPC, volume 4297 of Lecture Notes in Computer Science, pages 485–496. Springer, 2006. [15] C. Cristian Coarfa, Yuri Dotsenko, John Mellor-Crummey, Daniel Chavarria-Miranda, Francois Cantonnet, Tarek El-Ghazawi, Ashrujit Mohanti, and Yiyi Yao. An evaluation of global address space languages: Co-array fortran and unified parallel. Technical report, Chicago, Illinois, June 2005. [16] Vincent Danjean. Contribution à l’élaboration d’ordonnanceurs de processus légers performants et portables pour architectures multiprocesseurs. PhD thesis, École normale supérieure de Lyon, 46, allée d’Italie, 69364 Lyon cedex 07, France, December 2004. 156 pages. [17] Tarek A. El-Ghazawi, François Cantonnet, Yiyi Yao, Smita Annareddy, and Ahmed S. Mohamed. Benchmarking parallel compilers: A upc case study. Future Generation Comp. Syst., 22(7):764–775, 2006. [18] Graham E. Fagg and Jack Dongarra. FT-MPI: Fault tolerant MPI, supporting dynamic applications in a dynamic world. In Jack Dongarra, Péter Kacsuk, and Norbert Podhorszki, editors, Recent Advances in Parallel Virtual Machine and Message Passing Interface, 7th European PVM/MPI Users’ Group Meeting, Balatonfüred, Hungary, September 2000, Proceedings, volume 1908 of Lecture Notes in Computer Science, pages 346–353. Springer, 2000. [19] Graham E. Fagg and Jack J. Dongarra. HARNESS fault tolerant MPI design, usage and performance issues. Future Generation Computer Systems, 18(8):1127–1142, October 2002. [20] Geoffrey Fox, Sanjay Ranka, Michael L. Scott, Allen D. Malony, James C. Browne, Marina C. Chen, Alok N. Choudhary, Thomas Cheatham, Janice E. Cuny, Rudolf Eigenmann, Amr F. Fahmy, Ian T. Foster, Dennis Gannon, Tomasz Haupt, Carl Kesselman, Charles Koelbel, Wei Li, Monica S. Lam, Thomas J. LeBlanc, Jim Openshaw, David A. Padua, Constantine D. Polychronopoulos, Joel H. Saltz, Alan Sussman, Gil Weigand, and Katherine A. Yelick. Common runtime support for high performance parallel languages. In Proceedings of the Supercomputing ’93 Conference, pages 752– 757, 1993. [21] Edgar Gabriel, Graham E. Fagg, George Bosilca, Thara Angskun, Jack J. Dongarra, Jeffrey M. Squyres, Vishal Sahay, Prabhanjan Kambadur, Brian Barrett, Andrew Lumsdaine, Ralph H. Castain, David J. Daniel, Richard L. Graham, and Timothy S. Woodall. Open MPI: Goals, concept, and design of a next generation MPI implementation. In Proceedings, 11th European PVM/MPI Users’ Group Meeting, pages 97–104, Budapest, Hungary, September 2004. [22] Thierry Gautier, Xavier Besseron, and Laurent Pigeon. KAAPI: A thread scheduling runtime system for data flow computations on cluster of multi-processors. In Marc Moreno Maza and Stephen M. Watt, editors, Parallel Symbolic Computation, PASCO 2007, International Workshop, 27-28 July 2007, University of Western Ontario, London, Ontario, Canada, pages 15–23. ACM, 2007. [23] GOMP. An OpenMP implementation for GCC. http://gcc.gnu.org/projects/gomp. [24] W. Gropp and E. Lusk. The MPI communication library: its design and a portable implementation. In Proceedings of the Scalable Parallel Libraries Conference, October 6–8, 1993, Mississippi State, Mississippi, pages 160–165, 1109 Spring Street, Suite 300, Silver Spring, MD 20910, USA, October 1994. IEEE Computer Society Press. 08-ANR-SEGI-025 Page 18 D2.1 État de l’art sur les supports d’excution pour environnements petascales [25] P. Hilfinger, D. Bonachea, K. Datta, D. Gay, S. Graham, B. Liblit, G. Pike, J. Su, and K. Yelick. Titanium language reference manual. (UCB/CSD-2005-15), 2005. [26] Jay Hoeflinger, Prasad Alavilli, and Thomas Jackson. Producing scalable performance with openmp: Experiments with two cfd applications. Parallel Computing, 27:582–593, 2000. [27] Chao Huang, Orion Lawlor, and L. V. Kalé. Adaptive MPI. In Proceedings of the 16th International Workshop on Languages and Compilers for Parallel Computing (LCPC 2003), LNCS 2958, pages 306–322, College Station, Texas, October 2003. [28] Parry Husbands, Costin Iancu, and Katherine A. Yelick. A performance analysis of the berkeley upc compiler. In ICS, pages 63–73, 2003. [29] Intel. Tbb home page. http://www.threadingbuildingblocks.org/. [30] L. V. Kale, Milind Bhandarkar, Narain Jagathesan, Sanjeev Krishnan, and Joshua Yelon. Converse: An Interoperable Framework for Parallel Programming. In Proceedings of the 10th International Parallel Processing Symposium, pages 212–217, April 1996. [31] Laxmikant V. Kale, Eric Bohm, Celso L. Mendes, Terry Wilmarth, and Gengbin Zheng. Programming Petascale Applications with Charm++ and AMPI. In D. Bader, editor, Petascale Computing: Algorithms and Applications, pages 421–441. Chapman & Hall / CRC Press, 2008. [32] L.V. Kalé and S. Krishnan. CHARM++: A Portable Concurrent Object Oriented System Based on C++. In A. Paepcke, editor, Proceedings of OOPSLA’93, pages 91–108. ACM Press, September 1993. [33] Gregory A. Koenig and Laxmikant V. Kale. Optimizing distributed application performance using dynamic grid topology-aware load balancing. In 21st IEEE International Parallel and Distributed Processing Symposium, March 2007. [34] Nhien-An Le-Khac and Euloge. Performance evaluation of INUKTITUT: An efficient interface for asynchronous parallel programming environment athapascan. In S. Q. Zheng, editor, International Conference on Parallel and Distributed Computing Systems (PDCS’05), pages 157–162, Phoenix, AZ, USA, November 2005. IASTED/ACTA Press 2005. [35] Cyrille Martin. Déploiement et contrôle d’applications parallèles sur grappes de grandes tailles, December 15 2003. [36] Guillaume Mercier, François Trahay, Darius Buntinas, and Elisabeth Brunet. NewMadeleine: An Efficient Support for High-Performance Networks in MPICH2. In Proceedings of 23rd IEEE International Parallel and Distributed Processing Symposium (IPDPS’09), Rome, Italy, May 2009. IEEE Computer Society Press. [37] R. Namyst and J.-F. Méhaut. PM2: Parallel Multithreaded Machine; A computing environment for distributed architectures. 1995. [38] OpenMP. OpenMP Official Home Page. http://www.openmp.org/. [39] Marc Pérache. Contribution à l’élaboration d’environnements de programmation dédiés au calcul scientifique hautes performances. Thèse de doctorat, spécialité informatique, CEA/DAM Île de France, Université de Bordeaux 1, Domaine Universitaire, 351 Cours de la libération, 33405 Talence Cedex, October 2006. 141 pages. [40] James C. Phillips, Rosemary Braun, Wei Wang, James Gumbart, Emad Tajkhorshid, Elizabeth Villa, Christophe Chipot, Robert D. Skeel, Laxmikant Kalé, and Klaus Schulten. Scalable molecular dynamics with NAMD. Journal of Computational Chemistry, 26(16):1781–1802, 2005. [41] Portland Group. PGI Compilers and tools. http://www.pgroup.com/resources/openmp.htm. [42] James Reinders. In Intel Threading Building Blocks. O’Reilly, 2007. 08-ANR-SEGI-025 Page 19 D2.1 État de l’art sur les supports d’excution pour environnements petascales [43] Philip C. Roth, Dorian C. Arnold, and Barton P. Miller. MRNet: A software-based multicast/reduction network for scalable tools. In SC’2003 Conference CD, Phoenix, AZ, November 2003. IEEE/ACM SIGARCH. UWisc. [44] Sayantan Chakravorty, Celso Mendes and L. V. Kale. Proactive fault tolerance in large systems. In HPCRI Workshop in conjunction with HPCA 2005, 2005. [45] A. Sinha and L.V. Kalé. A load balancing strategy for prioritized execution of tasks. In Seventh International Parallel Processing Symposium, pages 230–237, Newport Beach, CA., April 1993. [46] Jeffrey M. Squyres and Andrew Lumsdaine. A component architecture for LAM/MPI. In Jack Dongarra, Domenico Laforenza, and Salvatore Orlando, editors, Recent Advances in Parallel Virtual Machine and Message Passing Interface,10th European PVM/MPI Users’ Group Meeting, Venice, Italy, September 29 - October 2, 2003, Proceedings, volume 2840 of Lecture Notes in Computer Science, pages 379–387. Springer, 2003. [47] Sun Microsystems. OpenMP API User’s Guide). http://dlc.sun.com/pdf/819-3694/819-3694.pdf. [48] V. Sunderam. PVM: A framework for parallel distributed computing. Concurrency: Practice and Experience, 2(4):315–339, December 1990. [49] Samuel Thibault. Ordonnancement de processus légers sur architectures multiprocesseurs hiérarchiques : BubbleSched, une approche exploitant la structure du parallélisme des applications. PhD thesis, Université Bordeaux 1, 351 cours de la Libération — 33405 TALENCE cedex, December 2007. 128 pages. [50] Samuel Thibault, François Broquedis, Brice Goglin, Raymond Namyst, and Pierre-André Wacrenier. An Efficient OpenMP Runtime System for Hierarchical Architectures. In Barbara M. Chapman, Weimin Zheng, Guang R. Gao, Mitsuhisa Sato, Eduard Ayguadé, and Dongsheng Wang, editors, A Practical Programming Model for the Multi-Core Era, 3rd International Workshop on OpenMP, IWOMP 2007, Beijing, China, June 3-7, 2007, Proceedings, volume 4935 of Lecture Notes in Computer Science, pages 161–172. Springer, 2008. [51] Ramkumar V. Vadali, Yan Shi, Sameer Kumar, L. V. Kale, Mark E. Tuckerman, and Glenn J. Martyna. Scalable fine-grained parallelization of plane-wave-based ab initio molecular dynamics for large supercomputers. Journal of Comptational Chemistry, 25(16):2006–2022, Oct. 2004. [52] Gengbin Zheng. Achieving High Performance on Extremely Large Parallel Machines: Performance Prediction and Load Balancing. PhD thesis, Department of Computer Science, University of Illinois at Urbana-Champaign, 2005. [53] Gengbin Zheng, Lixia Shi, and Laxmikant V. Kalé. Ftc-charm++: An in-memory checkpoint-based fault tolerant runtime for charm++ and mpi. In 2004 IEEE International Conference on Cluster Computing, pages 93–103, San Dieago, CA, September 2004. 08-ANR-SEGI-025 Page 20