Programmation des grappes de calculateurs homogènes
Mots clés : mémoire partagée répartie,
système de gestion de fichiers parallèles, HPF, Java, OpenMP
.
Résumé :
La gestion efficace des ressources au sein d'une grappe
de calculateurs est essentielle pour l'obtention de la
haute performance. Nous étudions les concepts qui
permettent de gérer la mémoire (mémoire partagée répartie),
les disques (système de gestion de fichiers parallèles) et
les processeurs (migration de processus). Des études sont
en cours sur différentes architectures : système
parallèle (Nec Cenju-4) et grappes de PC.
Nous nous intéressons notamment à l'intégration de ces
différents concepts au sein d'un système distribué pour
grappes de PC. Nous utilisons ces mécanismes
de gestion de ressources pour concevoir des exécutifs pour
des langages parallèles.
Il s'agit d'étudier, de concevoir et de réaliser des
mécanismes système pour une meilleure gestion des
ressources dans une grappe de calculateurs homogènes
interconnectés par un réseau de type SAN. Ce type
d'architecture permet d'offrir, pour certaines applications,
des performances équivalentes à des multiprocesseurs beaucoup
plus coûteux. En effet, le coût d'une grappe de calculateurs
évolue linéairement par rapport au nombre de processeurs, ce
qui n'est pas le cas des architectures multiprocesseurs
offrant un système à image unique. Pour maintenir une bonne
performance, il est nécessaire de concevoir des mécanismes
d'interconnexion, sur bus mémoire, très performants et donc
coûteux.
Notre objectif est de permettre à des composants logiciels
parallèles d'exploiter les ressources d'une grappe de
calculateurs. Dans ce domaine, nous souhaitons adopter une
approche globale dans la gestion des ressources
(mémoire, disque, processeur). Nous pensons, en effet, que le
succès des grappes de calculateurs dépend fortement des
capacités à en gérer globalement les ressources.
L'utilisateur ne doit voir qu'une seule machine plutÔt qu'un
ensemble de machines ayant chacune ses propres ressources. Il
ne s'agit donc pas de gérer un réseau de calculateurs en
machine parallèle à mémoire distribuée comme le font la
plupart des projets actuels. Bien que la gestion mémoire
(pagination à distance, mémoire virtuellement partagée), la
gestion des disques (RAID, systèmes de gestion de fichiers
distribués ou parallèles), la gestion des processeurs
(placement et migration de processus) sont des mécanismes qui
ont fait l'objet de nombreuses études, par notamment les
membres de ce projet, très peu d'efforts ont été à ce jour
consentis pour concevoir une gestion de ressources globale
et intégrée dans laquelle l'ensemble de ces mécanismes
doivent coopérer pour offrir la meilleure performance. Ceci
constitue une des originalités des recherches qui sont menées
par le projet PARIS. D'autre part, nous
prenons en considération une caractéristique importante
associée à l'utilisation de grappes de calculateurs : la
défaillance d'un constituant de la grappe. Il s'agit
notamment de satisfaire à la fois les contraintes de
performance et de disponibilité.
En parallèle à cette activité système, nous étudions la
conception d'exécutifs pour le support de langages
parallèles sur des grappes de calculateurs homogènes. Un
exécutif est un mécanisme logiciel offrant des services
spécifiques pour l'exécution de programmes écrits dans un
langage particulier. Son objectif est de spécialiser des
mécanismes systèmes généraux (gestion mémoire, communication,
ordonnancement des tâches,...) afin d'atteindre la meilleure
performance de l'architecture cible et de son système
d'exploitation. L'originalité de notre approche est
d'utiliser le concept de mémoire virtuelle partagée comme
mécanisme de base pour la communication au sein de ces
exécutifs. Nous nous intéressons en particulier à deux
langages : Fortran (avec ses extensions parallèles HPF
et OpenMP) et Java. Le langage Fortran est traditionnellement
très utilisé dans les applications de simulation que nous
visons. Le langage Java quant à lui commence à être utilisé
dans ce domaine en particulier pour des applications
irrégulières où les structures de données ne sont pas des
tableaux. Il s'agit un peu d'un ``pari sur l'avenir'' mais
qui nous paraît réaliste. En effet, de nombreux travaux sur
Java permettent de lever les principales limitations de
performance [MMBC97].
HPF, OpenMP et Java sont des langages qui permettent
d'exprimer du parallélisme par les données (HPF), par le
contrÔle (OpenMP) ou par les tâches (Java). Malgré l'abandon
des machines massivement parallèles, nous pensons que
l'approche du langage HPF garde tout son intérêt compte tenu
des évolutions probables des technologies associées aux
grappes. Des technologies matérielles, qui offrent un
adressage global de type CC-NUMA, émergent [WGH+97,Gen98,Seq99] et l'approche HPF, qui permet de
spécifier la distribution de données, peut permettre de mieux
gérer la mémoire partagée au sein d'une telle grappe. En ce
qui concerne OpenMP, il s'agit d'une tentative de
standardisation très récente qui permet de programmer, de
faÇon portable, des calculateurs à mémoire partagée (SMP pour
Symmetric Multi-Processing) à faible nombre de processeurs.
Si OpenMP est un succès, il se posera rapidement le problème
d'utiliser une grappe de calculateurs SMP pour accélérer
l'exécution de programmes OpenMP. Ceci ne pourra se faire
sans étendre les techniques de compilation associées aux
architectures de type CC-NUMA (accès non uniforme aux
mémoires), voire à mémoires distribuées. Enfin, pour le
langage Java, il semble intéressant de pouvoir utiliser une
grappe de calculateurs pour exécuter des tâches légères en
exploitant au mieux les ressources processeur d'une
grappe.
Pour les trois langages cités, nous nous appuyons sur les
mécanismes systèmes étudiés dans le cadre du projet, et
principalement sur les mécanismes de gestion mémoire (mémoire
virtuelle partagée). Dans le cas du langage HPF, la plupart
des travaux de recherche qui se sont intéressés à ce langage
ont utilisé l'échange de messages comme mécanisme de base. De
nombreux problèmes sont encore sans solution comme par
exemple la réduction des coûts d'accès aux tableaux
physiquement distribués ou la gestion des accès irréguliers
(par indirection). L'utilisation d'un adressage global est un
moyen de résoudre ces problèmes. Les résultats de ces travaux
pourront être utilisés si des mécanismes d'adressage global
apparaissent sur les grappes comme nous le pensons. En ce qui
concerne les langages OpenMP et Java, l'exécution de
programmes sur une grappe de calculateurs pose de nombreux
problèmes dus à la faÇon d'exprimer le parallélisme. Dans les
deux cas, elle nécessite l'utilisation d'un mécanisme
d'adressage global qui n'est normalement pas présent sur une
grappe de calculateurs. Là encore, nous nous appuyons sur les
mécanismes systèmes, mémoire virtuelle partagée et migration
de processus, afin de concevoir des exécutifs spécialisés
pour les langages OpenMP et Java.