Avant-projet A3

previous up next contents
Précédent : Logiciels Remonter : Avant-projet A3, Analyse Avancée Appliquée Suivant : Actions industrielles



Résultats nouveaux

 

Méthodes d'analyse

 

Programmes à contrôle dynamique

 

Participants : Denis Barthou , Jean-Francois Collard , Paul Feautrier


Mots-clés : analyse du flot des données


analyse du flot des données: étude des programmes, faites par un compilateur, consistant à déterminer les initialisations et les utilisations des données

Les techniques de parallélisation automatique des programmes impératifs se sont lontemps limitées aux imbrications (<< nids >>) de boucles for. Des analyses sophistiquées du flot des données portées par les tableaux avaient été mises au point pour cette classe de programmes dits << à contrôle statique >>. Cependant, cette classe présente l'avantage que l'ensemble exact des calculs est connu statiquement, c'est-à-dire lors de la compilation.

Par contre, dans le cas des programmes impératifs à contrôle dynamique, une analyse de flot de données ne peut qu'être approximative, conservatrice, ou << floue >>. Une telle analyse floue été mise au point [8].

Structures récursives



Participants : Albert Cohen , Jean-Francois Collard , Paul Feautrier


Mots-clés : récursion


Si les analyses de flot conviennent bien à FORTRAN, qui n'est pas récursif, elles échouent complètement dès que les programmes à traiter sortent du cadre strict du modèle. Par ailleurs, les structures de données récursives ne sont pas prises en compte de façon satisfaisante par les techniques existantes.

Nous avons donc étudié l'analyse d'une part des dépendances et, d'autre part, du flot de données de ces programmes. Pour ce dernier point, le résultat le plus fort est que le flot des données d'un programme récursif sur tableau monodimensionnel peut être décrit par un automate à pile, et donc par une grammaire hors-contexte. Ce résultat laisse présager des travaux prometteurs liant analyses statiques et langages formels [22].

Analyse robuste de flot de données



Participant : Jean-Francois Collard


Mots-clés : Analyse de flot de données


Le but de ce travail est l'implémentation dans l'environnement de programmation FORESYS d'une analyse robuste de flot de données, où l'on cherche un compromis entre précision et complexité de la mise en oeuvre. Ce travail est un partenariat avec Simulog et l'INRIA Sophia.

Analyse des codes assembleur

 

Participants : Peter Braun , François Thomasset


Dans les compilateurs, l'analyse de flot de données est traditionnellement réalisée sur le programme source et exploitée dans les différentes étapes menant à la génération du code. L'analyse de code assembleur, qui a des applications évidentes en reverse engineering, nous intéresse pour deux raisons. La première est l'analyse a priori des performances d'un code assembleur, la seconde est le réordonnancement des instructions et la réallocation de registres dans le code assembleur. Ces deux aspects requièrent une étude fine des conflits possibles entre différents accès mémoire. Cette étude est réalisée en collaboration avec l'Université de Iena (Allemagne) et a débuté en 1997 par un travail de bibliographie. L'implémentation est en cours dans l'environnement SALTO (System for Assembly Language Tools and Optimisation) développé dans le projet CAPS de l'IRISA.

Analyse dynamique des propriétés de localité



Participant : Olivier Temam


Le principe est d'analyser en détail le fonctionnement des codes sur les hiérarchies mémoires et d'en déduire les transformations à apporter aux programmes. Plusieurs approches ont déjà été entreprises. Tout d'abord, des études extensives, toujours en cours, sur le comportement des programmes numériques sur les caches [5], ont été conduites. Ces études ont déjà permis de montrer que plusieurs propriétés supposées des programmes numériques étaient fausses et donc que les optimisations associées étaient en partie inutiles, et plusieurs directions de recherche nécessaires à l'optimisation des codes ont ainsi été dégagées. Ensuite, une série d'outils complémentaires ont été développés pour permettre une analyse détaillée du comportement d'un programme sur le cache : un outil de profil de cache, un outil de debugging pour le cache [14], et un outil permettant de faire la jonction entre programme source et code objet. Ce dernier outil permet de passer directement à l'architecture des informations recueillies dans le programme source où un compilateur est à même d'extraire un grand nombre d'informations. Enfin, on a montré qu'en modélisant les phénomènes complexes du cache (conflits de cache) on pouvait augmenter de manière significative l'efficacité des méthodes d'optimisation telles que le blocking [13]. Le projet ESPRIT MHAOTEU (décrit dans la partie [*]) est un prolongement direct de ces études.

Gestion de la mémoire

Gestion de la mémoire dans les programmes parallèles



Participants : Denis Barthou , Albert Cohen , Jean-François Collard , Paul Feautrier , Vincent Lefebvre


Expanser les structures de données est une technique classique pour extraire plus de parallélisme d'un programme. En effet, expanser une cellule memoire touchée par deux écritures en deux cellules mémoires permet à ces deux écritures de travailler simultanément. Dans le programme généré, chaque référence en lecture est bien-sûr modifiée en conséquence.

Cependant, cette technique d'expansion est trop brutale :

Allocation en registres - le meeting graph

 

Participants : Christine Eisenbeis , Sylvain Lelait


Cette action concerne le problème de l'allocation des variables en registres dans les boucles.

Nous savons qu'un dépliage de la boucle peut nous permettre de ne pas utiliser plus de registres que le nombre maximal de variables simultanément en vie à chaque pas de temps. De plus, le pipeline logiciel déplace des tâches entre les itérations et engendre finalement des variables dont la durée de vie est supérieure à la durée d'une itération et qui ne peuvent donc être allouées au même registre à chaque itération. Ceci nécessite, ou bien de déplier la boucle et allouer dans chaque itération du code déplié un registre différent, ou bien de tourner sur plusieurs registres, en effectuant un décalage à chaque itération - par l'introduction d'instructions de copie. Dans les deux cas, on augmente la taille du code, ce qui peut coûter cher en taille de code engendré et en nombre de défauts de cache ou de tampon d'instructions.

Il faut donc réaliser un compromis entre nombre de registres utilisés, dépliage, introduction d'instructions de copie.

Dans sa thèse, Sylvain Lelait avait défini un nouveau type de graphe, dit ``meeting graph'', qui permet de modéliser le coloriage et le dépliage dans un même cadre [11]. Cette année a été consacrée à une étude structurelle des propriétés du meeting graph. D. de Werra [24], de l'EPFL à Lausanne a redémontré les propriétés du meeting graph en se basant sur une modélisation par graphe orienté des intervalles. Ce dernier modèle a des propriétés classiques en théorie des graphes, et le meeting graph n'est autre que son em adjoint.

Dans une seconde étude [26], nous avons développé un algorithme qui combine le dépliage avec l'introduction de copies. L'idée est d'utiliser systématiquement les copies pour les morceaux de durée de vie de taille exactement égale à la durée de l'itération. Le dépliage est utilisé pour les morceaux restants. L'algorithme de dépliage utilisé est heuristique. Il est basé sur la notion de bâton, sorte de témoin que se passent 2 intervalles dont l'un finit et l'autre commence en un même point. Cette méthode est implémentée dans la plate-forme MOST développée à McGill University.

Nous avons ensuite démontré formellement [19] une propriété asymptotique en $n$ du nombre chromatique du graphe $G^n$ des interférences de la boucle dépliée $n$ fois: à partir d'un certain niveau de dépliage, le nombre chromatique de $G^n$ est $r$ ou $r+1$, où $r$ est l'épaisseur de la famille d'intervalles.

Enfin, les différentes heuristiques développées autour de ce problème ont été intégrées dans un noyau appelé LORA (Loop Register Allocation), voir la section [*]. LORA est utilisé dans la plate-forme MOST (voir ci-dessus), ce qui nous a permis de faire des évaluations systématiques sur des benchmarks classiques et de mettre en évidence les propriétés des différents algorithmes [25]. De plus, LORA a été connecté à SALTO dans le cadre du projet OCEANS par l'intermédiaire de PILO.

Parallélisme d'instructions

Pipeline Logiciel

 

Participants : Christine Eisenbeis , Antoine Sawaya


Cette année a vu l'achèvement de la thèse d'Antoine Sawaya [7]. Nous avons amélioré notre algorithme DESP [6] de pipeline logiciel découplé en intégrant plusieurs phases de remise en cause de l'intervalle d'initialisation au cours de l'algorithme, en particulier en calculant un chemin critique avec une valuation non standard.

Ensuite, dans le cadre de la modélisation du problème de pipeline logiciel avec contraintes de registres par programme linéaire en nombres entiers, nous avons développé des calculs de majorants et minorants pour les 3 paramètres de la modélisation (intervalle d'initialisation, nombre de registres et durée d'une itération). Ces bornes sont destinées à réduire les intervalles de recherche lorsqu'on cherche à optimiser un des 3 critères. Un driver, qui enchaîne la résolution des PLNE successifs, a été développé.

Enfin, dans le cadre du projet OCEANS (section [*]), nous avons développé le logiciel PILO (Pipeline Logiciel), basé sur l'algorithme DESP (voir la section [*]). PILO prend en entrée une boucle et ses dépendances de données, représentée sous la forme d'un graphe orienté, ainsi qu'une architecture de machine (tables de réservation des instructions et nombre de registres). PILO sort un ordonnancement par pipeline logiciel, ainsi qu'un degré de dépliage et une allocation de registres, calculée par LORA (section [*]).

PILO est utilisé dans l'environnement SALTO. Il est aussi interfacé avec SAGE pour le pipeline logiciel source à source (section [*]).

Branchements dans les boucles



Participants : Christine Eisenbeis , Ping Hu


Cette étude a été initialisée début 1997 avec le projet ESPRIT OCEANS. Il s'agit d'intégrer la prise en compte des branchements dans nos techniques de pipeline logiciel. Une des spécificités de l'étude est la présence sur le TriMedia d'instructions gardées, c'est-à-dire exécutées seulement si un registre, spécifié dans l'instruction, est non nul. De multiples méthodes ont été développées pour résoudre ce problème. Le but de la thèse de Ping Hu est d'unifier ces différentes approches dans un même cadre. Une étude critique de bibliographie a été réalisée et un rapport est en cours d'écriture.

Pipeline logiciel dans le programme source



Participants : Min Dai , Christine Eisenbeis


 A l'origine, la technique de pipeline logiciel est utilisée dans l'optimisation de code assembleur, à bas niveau. Or, toutes les informations nécessaires à sa mise en oeuvre sont présentes dans le code à haut niveau - indice de boucle, bornes des boucles, calcul des adresses des tableaux ...- et disparaissent dans le processus de génération de code. De plus, le développeur de code n'a aucun moyen de contrôler l'ordonnancement de son code, alors qu'il peut être détenteur d'informations primordiales, par exemple qu'une donnée n'a sûrement pas été utilisée avant et causera un cache miss lors de son chargement. C'est pourquoi nous avons intégré un restructureur de code par pipeline logiciel dans l'environnement de parallélisation Sage++ (développé à l'Université d'Indiana). La boucle FORTRAN est tout d'abord découpée en code à 3 adresses. Les variables temporaires sont stockées dans des tableaux (un tableau par variable du corps de la boucle, chaque élément de tableau correspond à une itération). Le graphe de dépendances est ensuite déterminé, puis envoyé à un logiciel de pipeline logiciel, qui renvoie les dates de lancement des différentes opérations. Les informations liées à l'architecture peuvent aussi être spécifiées par l'utilisateur. Pour provoquer le pré-chargement des données, il peut par exemple indiquer une grande latence d'accès à la mémoire. L'allocateur de registres alloue ensuite les tableaux temporaires dans des variables scalaires, qui seront a priori sauvegardées en registres par tous les compilateurs. Ainsi, l'utilisateur a le contrôle sur l'ordonnancement de son code à bas niveau et peut mettre au point les performances de son code de manière fine.

Des expériences ont été réalisées sur le processeur DEC-Alpha pour certaines boucles critiques du Perfect Club Benchmark [18]. Elles s'avèrent assez encourageantes, puisque le code transformé est souvent meilleur que celui généré par le compilateur sans transformation préalable.



previous up next contents Précédent : Logiciels Remonter : Avant-projet A3, Analyse Avancée Appliquée Suivant : Actions industrielles