Projet Caps

previous up next contents
Précédent : Logiciels Remonter : Projet CAPS, Compilation, Architectures Parallèles Suivant : Actions industrielles



Résultats nouveaux

  
Architectures de processeurs (cf. [*])



Participants : Thierry Lafage , André Seznec , Francois Bodin , Dan Truong , Pierre Michaud , Sébastien Hily


Mots-clés : microprocesseur, Risc, antémémoire, localité, hiérarchie mémoire, prédiction de branchement, multiflots


Résumé : Les actions de recherches du projet CAPS en architecture de processeurs portent sur la structure et les optimisations matérielles et logicielles des hiérarchies mémoire, en particulier antémémoires, sur les mécanismes de lancement des instructions, en particulier prédiction de branchement ainsi que sur les structures de processeur multiflot simultané. Ces actions de recherche s'appuient sur une veille technologique sur les microprocesseurs menée depuis 1991.


Veille technologique



Participants : Thierry Lafage , André Seznec


Mots-clés : microprocesseur, Risc


Depuis début 1991, une activité de veille technologique et de diffusion d'informations sur les microprocesseurs a été lancée. Cette année, un rapport détaillé comparant les différents processeurs des architectures Intel xxx86, Sun Sparc, MIPS Rxxx, Power PC, DEC Alpha et HP-PA a été diffusé.

Les antémémoires



Participants : François Bodin , André Seznec , Dan Truong


Mots-clés : antémémoire, localité, hiérarchie mémoire


Antémémoires associatives brouillées

L'antémémoire associative brouillée ou skewed-associative cache est une organisation d'antémémoire partiellement associative. Une antémémoire partiellement associative par ensemble à $X$ voies est physiquement organisée en $X$ bancs de mémoire. Dans une antémémoire associative par ensemble, un mot d'adresse $A$ peut occuper n'importe laquelle des $X$ lignes d'adresse $f(A)$ dans ces $X$ bancs. Une seule fonction $f$ détermine un ensemble de cases où peut être rangée une donnée : si sur $X+1$ adresses ($A_j$) la fonction $f$ est constante, alors les $X+1$données correspondantes ne peuvent pas toutes cohabiter au même instant dans l'antémémoire. Dans une antémémoire associative brouillée à $X$ voies, un mot d'adresse $A$ peut occuper dans chacun des bancs une et une seule place : la case d'adresse $f_i(A)$ dans le banc $i$ de l'antémémoire. Les fonctions $f_i$ utilisées pour indexer les différents bancs peuvent être différentes.

Nous avons montré que, contrairement aux antémémoires associatives par ensembles, le comportement des antémémoires associatives brouillées est très peu sensible au placement relatif des données en mémoire [10]; la performance d'une application avec un placement déterminé des données en mémoire est donc représentative de la performance que l'on obtiendra quel que soit le placement relatif des données en mémoire : par exemple lors d'un changement de taille du problème. D'autre part, nous avons montré que l'emploi de structures associatives brouillées pour les BTBs (tampons de cibles de branchements) et les antémémoires secondaires est particulièrement adapté [29].

Réduction du volume des étiquettes

Les antémémoires contiennent deux types d'information : les données et les étiquettes. Depuis plus de vingt ans, les antémémoires à secteurs sont utilisées pour réduire le volume des étiquettes. Un secteur comprend plusieurs lignes, mais une seule étiquette est associée à tout un secteur. Ce type d'antémémoire offre un compromis de conception entre le volume réduit d'étiquettes permis par l'utilisation de lignes longues et le trafic mémoire réduit permis par l'utilisation de lignes courtes au prix d'une dégradation du comportement global. L'antémémoire à secteurs découplés est une nouvelle solution pour réduire le volume des étiquettes. Ce type d'antémémoire réconcilie volume réduit d'étiquettes et faible taux d'échec [13].

Optimisation de la localité des programmes

L'analyse de la localité des programmes est essentielle pour obtenir de bonnes performances sur les machines dotées d'une hiérarchie mémoire. Il s'agit de détecter et de caractériser les parties de structures de données sujettes à des réutilisations. Ces informations sont ensuite utilisées pour transformer les programmes afin d'améliorer l'exploitation de la hiérarchie mémoire. Ce type de transformations est essentiel pour l'obtention de performances sur les processeurs actuels dont le goulet d'étranglement principal est constitué par les accès à la mémoire [21].

Parallèlement à l'étude de l'amélioration de la localité des accès aux structures de données allouées dynamiquement, une partie des travaux actuels porte sur l'analyse des accès aux instructions. On s'intéresse en particulier à améliorer le rangement en mémoire des blocs de base, de manière à diminuer les interférences et permettre un préchargement efficace du code.

Étude des mécanismes de séquencement



Participants : Pierre Michaud , André Seznec


Mots-clés : prédiction de branchement


Prédiction de branchement plusieurs blocs en avance

Pour permettre de réduire le goulot d'étranglement noté sur les processeurs à nombreuses unités fonctionnelles, nous avons proposé en 1996 un mécanisme appelé <<multiple-block ahead branch predictor>>, [6]. Ce mécanisme prédit efficacement les adresses de plusieurs blocs d'instructions en avance. Un mécanisme différent appelé "trace cache" a aussi été proposé en 1996 par l'équipe de Jim Smith (université du Wisconsin) [RBS96].

Une étude visant à comparer les deux mécanismes est en cours. Cette étude est menée en collaboration avec l'équipe Apara de l'Irit.

Prédicteur de branchements biaisé

Les performances des microprocesseurs actuels reposent de plus en plus sur les mécanismes de prédiction de branchements dynamiquement. Les tables de prédiction des branchements conditionnels sont en général mises en oeuvre sans utiliser d'étiquettes, ce qui entraîne un phénomène d'interférence appelé <<aliasing>>. Comme l'introduction d'associativité dans ces tables nécessiterait la présence d'étiquettes coûteuses, une nouvelle approche pour résoudre le problème de l'<<aliasing>> de conflit sans utiliser d'étiquettes est proposée. Le Skewed Branch Predictor est une structure à trois tables : chaque table est indexée avec une fonction différente et la prédiction est fournie par un vote à la majorité. Lorsqu'une prédiction est mauvaise, les trois bancs sont mis à jour. Cette redondance augmente l'aliasing de capacité, mais le compromis entre la réduction de l'aliasing de conflit et l'augmentation de l'aliasing de capacité s'avère bénéfique [18].

Multiflot simultané



Participants : Sébastien Hily , André Seznec


Mots-clés : multiflots, microprocesseur, superscalaire, hiérarchie mémoire


Parmi les solutions pour exploiter les possibilités d'intégration, le multiflot simultané [TEL95] est l'une des solutions les plus prometteuses. Disposer de plusieurs flots exécutables simultanément sur une architecture superscalaire doit permettre de maximiser le taux d'utilisation du processeur et donc les performances. De nombreux paramètres entrent en jeu dans la conception d'une architecture multiflot : nombre de supports physiques de flots, types et partage des ressources, hiérarchie mémoire, etc.

Un simulateur a été développé afin d'explorer les choix possibles pour les architectures multiflots. Les travaux menés ont permis d'établir que l'utilisation d'une hiérarchie mémoire standard ne permettra pas d'utiliser plus de 4 ou 6 flots simultanément[25],[8]. Ceci est dû à la saturation de la bande passante entre les premiers et seconds niveaux de caches. D'autre part, nous avons aussi montré que l'exécution dans l'ordre sur un processeur multiflot permettrait d'obtenir pratiquement le même niveau de performance qu'une exécution dans le désordre [8].

  
Environnement pour architectures hautes performances(cf. [*])



Participants : François Bodin , Zbigniew Chamski , Stéphane Chauveau , Thierry Lafage , Marc Pic , Yann Mével , Erven Rohou , André Seznec .


Résumé : L'obtention de performances sur les architectures hautes performances nécessitent des outils logiciels adaptés qui cachent à l'utilisateur la complexité des matériels et des systèmes.

Les actions de recherches que nous menons visent à fournir aux utilisateurs de calculateurs hautes performances des outils tels que compilateur, aide au portage, optimiseur pour permettre des développements et/ou portages d'applications hautes performances.

Ainsi, nous développons Menhir, un compilateur Matlab pour machines parallèles, TSF, un outil d'aide au portage de codes Fortran sur architectures hautes performances, CT++ un environnement de programmation pour l'analyse d'images basé sur C++ et Salto, un environnement de manipulation de langage d'assemblage.


Menhir: un compilateur Matlab



Participants : François Bodin , Stéphane Chauveau


Mots-clés : Matlab,programmation parallèle


Nous explorons une nouvelle direction de recherche qui consiste à étudier les techniques de production de codes parallèles à partir de langages plus proches d'un domaine d'application. Pour cela nous utilisons Matlab, un système spécialisé pour le calcul numérique et largement diffusé, pour la production automatique d'applications scientifiques séquentielles et parallèles en langage Fortran et C++. Notre approche permet de dériver directement l'application finale à partir du prototype écrit en Matlab. De plus la description des algorithmes en Matlab est de plus haut niveau qu'en Fortran (la gestion des structures de données n'est pas spécifiée dans le code) et laisse donc plus de liberté pour la génération et les transformations de code. Le prototype de compilateur paramétrable Menhir est disponible depuis cette année et est présenté dans la thèse de S. Chauveau (co-encadrée avec Bernard Philippe du projet Aladin).

TSF : aide au portage sur les architectures hautes performances



Participants : François Bodin , Yann Mével


Mots-clés : parallélisation automatique,raisonnement à partir de cas


Le portage (parallélisation et amélioration de performance) d'applications sur machines hautes performances est une activité techniquement difficile faisant appel à beaucoup de savoir-faire.

Le système TSF vise à accélérer cette activité grâce à l'utilisation conjointe de techniques issues de deux domaines : la parallélisation automatique et le raisonnement à partir de cas (<<Case-Based Reasoning>>).

La parallélisation automatique fournit une bibliothèque de transformations de programmes à appliquer, sous contrôle de l'utilisateur dans le cas de TSF. Le raisonnement à partir de cas permet de recueillir les fruits des expériences de portage précédentes et fournit un accès au savoir-faire de l'expert. De plus pour aider l'utilisateur, le système permet d'instrumenter les codes afin d'analyser leurs performances. L'intégration des deux méthodes a pour objectif d'aider au choix des transformations adaptées en s'appuyant sur des expériences de portage similaires répertoriées. Avec la technique de raisonnement à partir de cas, ces choix sont guidés par des calculs de similarité de contexte.

Cette étude est réalisée en collaboration avec la société Simulog qui fournit toute l'infrastructure de base à l'analyse de programmes Fortran dans son outil Foresys et le projet Irisa Repco (R. Quiniou).

Stratégie de compilation et interactions globales entre optimisations logicielles



Participants : François Bodin , Zbigniew Chamski , Erven Rohou , André Seznec .


Mots-clés : optimisation


Au cours d'une chaîne de compilation classique, le type d'informations disponibles subit une profonde modification. Les premières phases ont une bonne connaissance de l'algorithme et des structures de données complexes utilisées par le langage de haut niveau. Les dernières phases ont une vision très précise de l'exploitation des ressources matérielles du processeur. Idéalement elles devraient connaître l'information que possédaient les premières transformations et disposer du maximum de connaissances pour appliquer efficacement des optimisations. Toutefois les compilateurs actuels ne propagent pas l'information et chaque étape doit régénérer une bonne partie des informations qu'elle utilise.

Il est important de conserver à chaque étape l'information facile à obtenir dans la mesure où celle-ci peut se révéler importante plus tard. Par exemple le générateur de code est souvent capable de déterminer si des accès à la mémoire sont dépendants par la connaissance qu'il a des variables locales et globales et des indices de tableaux. L'optimiseur bas-niveau a un besoin crucial de ce type d'information mais il ne peut que rarement l'obtenir sans faire appel à des mécanismes complexes comme la résolution d'équations diophantiennes.

Nous pensons aussi qu'il est important de briser la chaîne de compilation classique qui applique consciencieusement une liste de transformations dans un ordre immuable. L'information doit pouvoir remonter vers les optimisations de haut-niveau et celles-ci doivent être capables de défaire une partie de leur travail. Par exemple, il est parfois nécessaire de maîtriser les expansions de code résultant de nombreuses techniques de mise en oeuvre du parallélisme à grain fin pour ne pas dégrader les performances du cache d'instructions [23].

Notre activité dans ce domaine se concentre sur l'interaction entre les optimisations au niveau du code source et celles effectuées au niveau du code machine.

Les réflexions sur la nécessité de faire communiquer les différentes phases d'un processus de compilation ainsi que de comparer les performances obtenues par différentes stratégies ont abouti au développement d'un premier prototype de compilateur. Les transformations de haut niveau et de bas niveau sont fortement couplées et s'échangent de l'information via un langage de communication simple appelé IL [31]. Le principal objectif de ce langage est d'établir une carte qui mette en correspondance des portions de code haut-niveau et leur équivalent en assembleur. Ce nommage permet par exemple au générateur de code de décrire des propriétés visibles à haut-niveau qui pourront être exploitées à bas niveau.

Le compilateur dispose d'un certain nombre de transformations. Chacune est capable de modifier un fragment de programme, de quantifier son action, éventuellement de l'annuler et de transmettre de l'information à l'extérieur. Il est alors possible d'établir une véritable stratégie de compilation à partir d'un ensemble de transformations, la stratégie s'exprimant comme un algorithme.

De nombreux autres critères, tels que l'allocation des registres, sont pris en compte.

Une partie importante de ces travaux est effectuée dans le cadre du projet Esprit LTR Oceans.

Collecte de traces d'exécution



Participants : François Bodin , Zbigniew Chamski , Thierry Lafage , Erven Rohou , André Seznec


Les outils logiciels d'intrumentation actuellement disponible (Pixie, Atom,...) ont le défaut de ralentir de manière très significative l'exécution des applications (facteur 10-50). Ce ralentissement est trop important et ne permet pas de collecter des traces sur des applications entières.

Afin de pouvoir collecter des échantillons d'exécution sur l'ensemble d'une application de plusieurs milliers de milliards d'intructions, nous avons défini une nouvelle méthode de collecte de traces appelée <<code cloning tracing>>. Le code est dupliqué. Une copie $P_{exec}$ est instrumentée de manière légère (simple comptage d'événements moyennement fréquents), la seconde copie $P_{inst}$ est instrumentée de manière lourde afin de collecter les traces (adresses des données par exemple). En mode <<no-trace>> collection, $P_{exec}$ est exécutée, en mode <<trace collection>>, $P_{inst}$ est exécutée. Un premier prototype a été implémenté à l'aide de Salto. En mode, <<no-trace>> collection, les applications subissent un ralentissement de seulement 20 à 50 %. Ceci rend réaliste la collecte de traces sur les grandes applications.

CT++ : un environnement de programmation pour l'analyse d'image



Participants : François Bodin , Marc Pic .


Mots-clés : programmation parallèle


En collaboration avec le Leti du CEA un environnement C++ pour l'architecture SIMD Symphonie a été défini et développé [15]. Cet environnement est fondé sur la notion de tableaux distribués appelés tenseurs. Aucune extension à C++ n'est utilisée et l'environnement proposé est portable sur machines séquentielles mais aussi, pour les versions futures, sur architectures SIMD à mémoire distribuée. La génération de code optimisé est fondée sur un pré-processeur du code source. La mise en oeuvre du prototype utilise le système Sage++ [1].

Ces travaux continuent avec l'extension du compilateur CT++ vers les processeurs comportant des instructions spécialisées pour les applications multimédia.

  
Support exécutif pour la programmation des calculateurs parallèles (cf. [*])



Participants : Pierrick Beaugendre , Yvon Jégou , Thiery Priol , David Mentré , Christophe René , Luc Renambot


Mots-clés : CORBA, SCI, réseau de stations de travail (NOW), MVP, synthèse d'images, algorithmes parallèles


Résumé : La maîtrise des communications dans un calculateur parallèle est essentielle pour l'obtention de bonnes performances. Nous étudions deux paradigmes de communication : les tâches migrantes et la mémoire virtuelle partagée. Pour les tâches migrantes, il s'agit de faire migrer les calculs vers les processeurs disposant des données alors que pour la mémoire virtuelle partagée, les données migrent vers les processeurs effectuant des calculs nécessitant celles-ci. Plusieurs implémentations sont en cours d'évaluation à la fois pour des calculateurs massivement parallèles (NEC Cenju-3) et des réseaux de PC à capacité d'adressage (SCI) (plateforme Pacha).

D'autre part, une activité sur les environnements de programmation sur plateforme hétérogène (<<metacomputing>>) a été lancée cette année. Enfin nous continuons une activité sur la parallélisation et l'optimisation des hiérarchies mémoires sur les algorithmes de synthèse d'images.


Exécutif pour la programmation par composants logiciels



Participants : Pierrick Beaugendre , Thierry Priol


Mots-clés : CORBA, SCI, réseau de stations de travail (NOW)


Ce travail est réalisé dans le cadre du projet Esprit R & D Pacha qui vise à concevoir un multiprocesseur à partir d'un réseau de stations de travail interconnectées par un réseau rapide SCI (Scalable Coherent Interface). Un gestionnaire de ressources, appelé Cobra, a été réalisé en utilisant Orbix, une implémentation de CORBA [26]. Il s'agit d'une réalisation conséquente (17000 lignes de code C++ et Java). Le gestionnaire de ressources est vu comme plusieurs services CORBA ayant chacun une tâche particulière : administration du réseau de stations de travail, gestion des ressources (processeurs, mémoires), chargement et exécution des services CORBA parallèles. Un service CORBA parallèle est une collection d'objets CORBA identiques. L'expression du parallélisme s'effectue via le langage IDL dont une extension est en cours de définition afin d'exprimer le caractère parallèle d'un objet CORBA comme la distribution des données.

Migration de tâches



Participants : Yvon Jégou


Mots-clés : programmation parallèle, modèle de programmation


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 étant chargée d'une partie des calculs à réaliser. Une tâche ne peut accéder librement qu'à la mémoire locale du processeur qui l'exécute. Afin d'accéder à une donnée gérée par un autre processeur, l'exécution de la tâche est transférée sur le processeur en charge de cette donnée.

L'efficacité de ce modèle dépend fortement des performances de la couche de communication, qui doit :

Cependant, l'utilisation stricte du modèle d'exécution par migration de tâches ne permet pas de tirer parti des phénomènes de localité présents dans les accès aux mémoires. Les développements en cours sur le calculateur Cenju3 de NEC consistent à mettre en oeuvre un exécutif permettant d'exploiter le modèle de migration de tâches au-dessus d'une mémoire virtuelle partagée : les tâches migrent pour accéder aux objets modifiés durant l'exécution alors que la mémoire virtuelle gère les accès aux objets non modifiés.

Gestion mémoire dans les architectures de type NOW



Participants : David Mentré , Thierry Priol


Mots-clés : SCI, DSM


Depuis plusieurs années, nous avons étudié le concept de mémoire virtuelle partagée (MVP)[11]. Les résultats de ces travaux ont montré des performances qui dépendent fortement des supports matériels (communication) et logiciel (système). Nous avons entrepris d'étudier la conception de mécanismes de mémoire virtuelle partagée exploitant les capacités d'adressage disponibles dans les nouvelles technologies d'interconnexion (SCI). Ces technologies permettent un accès distant (lecture et/ou écriture) à la mémoire de n'importe quelle machine connectée au réseau. Cette fonctionnalité permet une mise en oeuvre efficace du concept de mémoire virtuelle partagée. Nous étudions la conception d'une MVP pour un réseau de PC, interconnecté par SCI, utilisant le système Linux. L'originalité de ce travail réside dans l'utilisation des mécanismes offerts par SCI et l'aspect générique de la MVP. Cette MVP permettra d'ajouter de nouveaux protocoles de cohérence sans modification du système ainsi que d'offrir un contrôle fin de la gestion mémoire pouvant être utilisé par un compilateur ou par un utilisateur averti. Ce travail sera poursuivi par la conception d'un exécutif pour le langage Gamma structuré en collaboration avec D. Le Métayer du projet Lande.

Environnement pour le Metacomputing



Participants : Thierry Priol , Christophe René


Mots-clés : SCI, DSM


Ce travail se situe dans la continuation au sein du projet Esprit R & D Pacha. Il s'agit de prendre en compte toutes les ressources d'un réseau pouvant participer à l'exécution d'une application de simulation. Un exécutif doit être conçu pour permettre l'exécution d'une application composée d'un grand nombre de processus sur une architecture hétérogène. Cet exécutif offrira un concept de machine parallèle virtuelle permettant de faire abstraction des détails architecturaux des machines utilisées. Ce travail est basé sur une approche par composants logiciels (Corba). Ces composants seront soit séquentiels ou soit parallèles. La programmation des composants parallèles sera réalisée de façon indépendante par rapport à la machine qui sera chargée de les exécuter en utilisant le concept de machine parallèle virtuelle fourni par l'exécutif.

Parallélisation d'algorithmes de synthèse d'images



Participants : Luc Renambot , Thierry Priol .


Mots-clés : synthèse d'images, algorithmes parallèles


Notre méthode est fondée sur l'utilisation de deux concepts[9] : les interfaces virtuelles et les masques de visibilité permettant de résoudre l'équation de radiosité sur des environnements très complexes (de l'ordre du million de polygones). Nous avons étudié l'impact de ces deux concepts pour améliorer le comportement de l'algorithme de radiosité vis à vis de la hiérarchie mémoire. Pour cela, nous avons utilisé la nouvelle machine Silicon Graphics Origin 2000 du Centre Charles Hermite à Nancy. Cette machine, dotée de 64 processeurs, offre un espace d'adressage global sous forme d'une mémoire virtuelle partagée.

Lors de calcul sur des bases de données très importantes (un million de polygones) impossibles à traiter sur une station de travail classique, notre méthode par décomposition de domaines et échange d'informations de visibilité obtient en séquentiel des performances cinq fois supérieures à une méthode de radiosité classique. L'étude a montré que le coût de la gestion de la décomposition était largement absorbé par la meilleure utilisation de la hiérarchie mémoire. Une décomposition optimale peut être déterminée pour chaque scène en fonction de l'architecture (tailles des caches de données).

Pour la parallélisation de notre méthode sur cette nouvelle architecture, avec un modèle de programmation par variables partagées et non plus par passage de messages, les concepts principaux sont restés les mêmes : décomposition du domaine, chaque processeur accédant à un sous-ensemble de sous-environnements, échange de sources lumineuses et d'informations de visibilité cette fois-ci par la mémoire partagée. Diverses techniques d'allocation mémoire (par le système ou en décrivant précisément les zones accédées par chaque processeur) ont été utilisées et un premier mécanisme d'équilibrage de charge a posteriori utilisant les informations d'une exécution précédente a été conçu. Les performance obtenues sont très encourageantes. Une accélération de 20 sur 32 processeurs a été obtenue, à laquelle il faut ajouter les gains déjà obtenus en séquentiel [19].

Dans le cadre d'une collaboration avec X. Pueyo de l'Université de Girone (Espagne), D. Figuls est venu travailler pendant quatre mois à l'Irisa dans le projet Caps. Ce travail commun a porté sur les problèmes de contrôle distribué de convergence et de déviation par rapport à la méthode séquentielle. Nous avons proposé et implémenté divers modules permettant le contrôle de ces problèmes sur la machine parallèle Intel Paragon [24].

Prototypage de composants matériels  



Participants : Michel Allemand , François Bodin , André Seznec


Mots-clés : conception matériel


Résumé : L'étude a pour but l'exploration du modèle synchrone pour le prototypage rapide et sûr de composants matériels. Nous avons défini une méthodologie pour la conception de matériel centrée sur le langage SIGNAL qui exploite le formalisme de flots de données synchrones [22]. Ces travaux ont été initialisés dans le cadre d'un contrat avec la société Motorola (Austin) et effectués en collaboration avec les projets Inria EP-ATR, API et MEIJE.




previous up next contents Précédent : Logiciels Remonter : Projet CAPS, Compilation, Architectures Parallèles Suivant : Actions industrielles