previous up next contents
Précédent : Environnement pour le Remonter : Compilation pour architectures Suivant : Abstraction des algorithmes

Codes irréguliers et migration de tâches

La puissance potentielle des architectures massivement parallèles est difficile à exploiter par les codes irréguliers (calculs sur des maillages, matrices creuses, etc...). Cette difficulté n'est pas due au manque de parallélisme de ces codes, qui est en général massif. Elle est surtout liée à l'absence de localité dans les accès aux structures de données.

Dans la technique d'exécution par migration de tâches, le parallélisme de l'application est mis à profit pour créer un grand nombre de tâches indépendantes. Chaque tâche représente une partie du calcul à réaliser. Une tâche ne peut accéder qu'à la mémoire locale du processeur qui l'exécute. En cas d'accès non local, l'exécution de la tâche est suspendue et son contexte d'exécution recopié sur le processeur qui possède l'adresse produite.

Les architectures cibles de ce modèle d'exécution sont les architectures fortement parallèles à mémoire distribuée. Lorsqu'aucun accès mémoire distant n'est possible (architectures Norma), la recopie des contextes de tâches se traduit par des émissions de messages. Par contre, sur les architectures de type Numa, les migrations de tâches se traduisent par des écritures distantes.

Les tâches migrantes ont été expérimentées sur la Paragon XP/S de l'Irisa par échange de messages sur plusieurs codes irréguliers. Les résultats montrent qu'il est possible d'atteindre un bon niveau de performance même lorsque plus de cinquante pour cent des tâches entraînent une migration.

Le modèle des tâches migrantes a été appliqué aux applications programmées avec HPF-Fortran. La transformation d'un code Fortran en programme "migrant" se fait en deux étapes. La première étape analyse tous les accès aux variables distribuées et produit un graphe de dépendances étendu. La deuxième étape parcourt ce graphe et produit un code Fortran 77. La faisabilité de la première étape a été démontrée sur des codes simples. Un générateur de code est actuellement fonctionnel et prend en entrée des graphes correspondant à des constructions complexes (conditionnelles, boucles internes, appels à des sous-routines ou instructions de branchement).


previous up next contents
Précédent : Environnement pour le Remonter : Compilation pour architectures Suivant : Abstraction des algorithmes