MÉMOIRE DE MASTER RECHERCHE EN INFORMATIQUE présenté par Nicolas Wojcik le 16 Juin 2008 COHÉRENCE ET COMPLÉTUDE DES MODÈLES DE PLACEMENT DE GASPARD2 Sous la direction de : Pierre Boulet <[email protected]> Université des Sciences et Technologies de Lille LIFL - UMR 8022 - Cité Scientifique, Bât. M3 - 59655 Villeneuve d’Ascq 2 Remerciements Je tiens en premier lieu à remercier Pierre Boulet pour m’avoir encadré au cours de stage, cette expérience a été très enrichissante et m’a permis d’apprendre et de comprendre énormément de choses. Je remercie Jean-Luc Dekeyser pour son accueil au sein de l’équipe DaRT et pour ses questions toujours pertinentes. Merci aux nombreux pensionnaires du bureau 106 pour leur bonne humeur au quotidien et pour les quelques franches rigolades que nous avons partagées. Merci à Hanna pour ses nombreuses et précieuses relectures de ce mémoire ainsi que pour toutes les corrections qu’elle y a apporté. Merci à Rubot (et implicitement à son créateur : Guillaume), notre bot IRC pour ses annonces salvatrices du menu du RU chaque midi, nous redonnant du courage avec la perspective d’un repas bienvenu et mérité après une dure matinée de travail. Cette année de Master Recherche fut longue et éprouvante, aussi je tiens à remercier Alban, Anthony, Flori, Fred, Grégoire, Guillaume, Thomas, Tony pour les nombreux repas, pauses café et autres joyeusetés que nous avons partagés tout au long de l’année. Mention spéciale à notre apprenti ingénieur à trottinette Brieuc qui nous a servi de souffre douleur tout au long de ce stage. 4 Table des matières 1 Introduction 2 Contexte et problématique 2.1 Systèmes sur puces . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.2 Co-conception . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Ingénierie dirigée par les modèles . . . . . . . . . . . . . . . . . . 2.2.1 Modélisation et méta-modélisation . . . . . . . . . . . . . . 2.2.2 Transformation de modèles . . . . . . . . . . . . . . . . . . 2.2.3 Modéliser avec UML . . . . . . . . . . . . . . . . . . . . . . 2.3 L’environnement Gaspard2 . . . . . . . . . . . . . . . . . . . . . . 2.3.1 Le paquetage Component . . . . . . . . . . . . . . . . . . . . 2.3.2 Le paquetage Factorization . . . . . . . . . . . . . . . . . . . 2.3.3 Le paquetage Application . . . . . . . . . . . . . . . . . . . . 2.3.4 Le paquetage HardwareArchitecture . . . . . . . . . . . . . . 2.3.5 Le paquetage Association . . . . . . . . . . . . . . . . . . . . 2.4 Placement et parallélisme de données . . . . . . . . . . . . . . . . 2.4.1 Les langages de programmation à parallèlisme de données 2.4.2 Le placement dans Gaspard2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 9 9 10 11 12 13 14 15 17 18 23 26 27 28 30 34 Des langages à parallélismes de données vers Marte 3.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3.2 Représentation formelle de HPF . . . . . . . . . . . . 3.2.1 Représentation formelle des alignements . . . 3.2.2 Représentation formelle des distributions HPF 3.3 Méthodologie de construction . . . . . . . . . . . . . . 3.3.1 Alignements . . . . . . . . . . . . . . . . . . . . 3.3.2 Distribution . . . . . . . . . . . . . . . . . . . . 3.4 Exemples . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4.1 Distribution (*,block) . . . . . . . . . . . . . . . 3.4.2 Distribution (block, block) . . . . . . . . . . . . 3.4.3 Distribution (cyclic, cyclic) . . . . . . . . . . . 3.4.4 Distribution (block, *, block) . . . . . . . . . . . 3.5 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 35 36 36 37 39 39 43 44 45 46 48 49 51 Validation d’un placement Gaspard2 4.1 Allocations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.1 Allocations répétitives . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.2 Allocations hiérarchiques . . . . . . . . . . . . . . . . . . . . . . . . 53 53 54 56 3 4 7 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 TABLE DES MATIÈRES 4.2 4.3 5 4.1.3 Ordonnancement . . . . . . . . . . . . . . Critères de validation d’un modèle d’association 4.2.1 Critère de complétude . . . . . . . . . . . 4.2.2 Critère de cohérence . . . . . . . . . . . . Outil de vérification d’un placement . . . . . . . 4.3.1 Approches envisagées . . . . . . . . . . . 4.3.2 Plugin de validation Gaspard2 . . . . . . Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 60 61 61 62 62 65 69 Chapitre 1 Introduction ES systèmes électroniques sont soumis à une évolution constante. Les progrès liés à la l’augmentation de la finesse de gravure en sont à la base. Selon Moore, il est possible de placer, tous les dix huit mois, deux fois plus de transistors sur une puce. Actuellement les puces sont gravées avec une finesse de 45nm. Cette augmentation de la finesse de gravure permet donc de placer de plus en plus de composants sur une même puce. Un domaine particulièrement friand de cette capacité est le domaine des « systèmes sur puce » (System on Chip ou SoC), ces systèmes ne sont pas dédié à un certain type de composant mais contiennent tous les composants nécessaires pour former un système informatique complet comprenant processeur, mémoire, réseaux d’interconnexion etc. Les avantages qu’ils procurent en terme d’espace occupé, de consommation d’énergie et de coût rendent ces systèmes particulièrement bien adaptés au domaine de l’informatique embarquée. Cependant, l’utilisation de ce nombre de transistors toujours grandissant impose de disposer de plusieurs processeurs. Cette contrainte s’explique par la difficulté à augmenter la fréquence de fonctionnement de la puce sans entrer en conflit avec les contraintes physiques du système. L Parallèlement à cette évolution matérielle, les applications de ces systèmes embarqués ont elles aussi vu leur besoins se spécialiser au fil des ans, nécessitant toujours plus de puissance. On retrouve généralement ces systèmes dans le domaine des transports (avions, voitures etc.), dans le domaine des systèmes de détection (radars, sonars etc.) et dans le domaine des systèmes multimédia (baladeurs, téléphones, télévision haute définition etc.). Toutes ces application se retrouvent autour d’un point commun : celui du traitement de signal, désignant des applications effectuant des suites de calcul sur des flux de données et qui se prêtent volontiers au calcul parallèle et répétitif. Néanmoins, si les applications et le matériel évoluent, cela introduit un développement de plus en plus complexe, induisant des délais et des coût de plus en plus important. Il faut donc utiliser de nouvelles approches afin de limiter ces conséquences comme la conception conjointe (co-conception) du matériel et de l’application. Dans cette approche, l’un des points critique se situe au niveau de l’association, étape permettant de réunir application et architecture matérielle. Parmi les nombreuses combinaisons possibles, seul un petit nombre sera correct, permettant ainsi d’obtenir un code de simulation fonctionnel. C’est à ce niveau, correspondant au placement, que se situent les travaux de ce master recherche. La méthodologie repose donc sur la co-conception associée avec une approche 7 8 CHAPITRE 1. INTRODUCTION d’ingénierie dirigée par les modèles par l’intermédiaire de l’environnement Gaspard2. Nous proposerons d’abord une méthodologie de construction permettant, à partir d’un placement défini dans un langage à parallélisme de données (HPF et Chapel en l’occurence), d’obtenir le placement équivalent exprimé avec les concepts apportés par le méta-modèle MARTE. Nous proposerons ensuite l’introduction de critères de vérification pour vérifier qu’un placement exprimé dans Gaspard2 est valide, nous accompagnerons cette partie de quelques propositions afin d’enrichir et de rendre moins ambigu le méta-modèle. Cette vérification sera mise en œuvre par l’intermédiaire d’un outil que nous intégrerons à l’environnement Gaspard2. Chapitre 2 Contexte et problématique Sommaire 2.1 2.2 2.3 2.4 Systèmes sur puces . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.2 Co-conception . . . . . . . . . . . . . . . . . . . . . . . . . . Ingénierie dirigée par les modèles . . . . . . . . . . . . . . . . . . 2.2.1 Modélisation et méta-modélisation . . . . . . . . . . . . . . 2.2.2 Transformation de modèles . . . . . . . . . . . . . . . . . . 2.2.3 Modéliser avec UML . . . . . . . . . . . . . . . . . . . . . . L’environnement Gaspard2 . . . . . . . . . . . . . . . . . . . . . . 2.3.1 Le paquetage Component . . . . . . . . . . . . . . . . . . . . 2.3.2 Le paquetage Factorization . . . . . . . . . . . . . . . . . . . 2.3.3 Le paquetage Application . . . . . . . . . . . . . . . . . . . . 2.3.4 Le paquetage HardwareArchitecture . . . . . . . . . . . . . . 2.3.5 Le paquetage Association . . . . . . . . . . . . . . . . . . . . Placement et parallélisme de données . . . . . . . . . . . . . . . . 2.4.1 Les langages de programmation à parallèlisme de données 2.4.2 Le placement dans Gaspard2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 9 10 11 12 13 14 15 17 18 23 26 27 28 30 34 de présenter les contributions apportées durant ce stage, nous allons dresser un état de l’art des différents travaux relatifs à ce travail. Nous présenterons d’abord le monde des systèmes dits sur puce, nous introduirons ensuite le domaine de l’ingénierie dirigée par les modèles, nous continuerons avec la présentation de l’outil Gaspard2 et nous parlerons enfin de placement et des différents langages à parallélisme de données. A VANT 2.1 2.1.1 Systèmes sur puces Présentation Un système sur puce (System-on-Chip ou SoC en anglais) désigne un système complet embarqué sur une même puce. Les technologies actuelles permettent d’embarquer sur une même puce de silicium plusieurs millions de transistors. Cette densité importante permet de placer des systèmes de plus en plus complexes sur une unique puce, ces systèmes pouvant accueillir des unités de calcul, de la mémoire, des réseaux d’interconnexion etc. On peut donc considérer qu’un système sur puce est l’équivalent d’un ordinateur complet, mais tenant sur une seule puce matérielle. Toutefois, tandis qu’un 9 10 CHAPITRE 2. CONTEXTE ET PROBLÉMATIQUE ordinateur traditionnel est conçu pour une utilisation globale, un système sur puce est dédié à une application particulière : la partie matérielle du système ne contient que les éléments nécessaires à la tâche choisie et en conséquence la partie logicielle de la puce est conçue et adaptée à la partie matérielle. Cette spécialisation de la tâche pour un système donné pose un problème majeur, celui du coût. En effet pour un nouvel usage, il devient impossible de réutiliser le système, il faut donc en développer un nouveau. Cependant, d’un autre point de vue, les gains sont multiples : l’utilisation d’une puce unique permet d’obtenir un système complet très compact, elle permet donc de réduire l’espace utilisé par cette dernière, caractéristique très prisée pour la conception de matériels comme les téléphones portables ou les baladeurs numériques. De plus ce caractère compact impose une proximité des différents composants qui forment le système, ce qui entraîne une hausse des performances des communications et la consommation est également revue à la baisse. Tous ces avantages font que l’on retrouve couramment les systèmes sur puce dans les systèmes embarqués : de l’avionique/automobile, à l’électronique grand public, en passant par l’électroménager (four, machine à laver etc.), il devient très difficile de trouver un domaine ne les utilisant pas. 2.1.2 Co-conception Cependant l’évolution matérielle et l’évolution des besoins rendent les systèmes sur puce de plus en plus complexes, ce qui pose deux problèmes : la fiabilité de tels systèmes devient plus complexe à assurer et le temps de conception s’en voit rallongé. D’un point de vue commercial, ces deux critères doivent être maîtrisés. En effet il serait très dommageable de sortir un système moins fiable et plus tard que le système d’un concurrent. Une solution pour respecter ces contraintes passe par la conception conjointe du matériel et du logiciel également appelée co-conception (co-design en anglais). Dans cette approche l’application, l’architecture et l’association entre les deux sont prises en compte, permettant de réduire l’effort de développement. Elle se base sur le modèle en «Y» de Gasjki et Kuhn[1] : l’application et l’architecture matérielle sont développées en parallèle, pendant qu’une équipe travaille sur l’application, une seconde équipe conçoit l’architecture matérielle. Les deux équipes ont des profils hétérogènes et le déroulement parallèle de leurs travaux permet un gain de temps par rapport à une approche traditionnelle dans laquelle on attendait que la partie matérielle soit terminée pour commencer à développer le logiciel. Quand le développement a atteint un certain niveau d’avancement, l’application est associée au matériel : il s’agit de spécifier sur quel processeur sera exécutée chaque tâche de l’application et sur quelles mémoires seront allouées les données. L’association possède donc un caractère topologique pour déterminer où seront placés les éléments et un caractère temporel pour déterminer l’ordonnancement des tâches. Quand l’association est terminée, on peut alors obtenir un code exécutable. La figure 2.1 illustre les étapes de conception suivant un schéma en « Y ». La co-conception préconise le respect de plusieurs principes : – utiliser un même langage pour décrire application et architecture matérielle ; – promouvoir la réutilisation ; – utiliser des standards facilitant la sauvegarde, l’échange et la réutilisabilité ; – utiliser un unique outil capable de centraliser tout le processus de co-conception. L’une des approches répondant avec succès à ce cahier des charges est présentée dans 2.2. INGÉNIERIE DIRIGÉE PAR LES MODÈLES 11 F IG . 2.1 – Schéma de conception en « Y » la section suivante. 2.2 Ingénierie dirigée par les modèles Les systèmes devenant de plus en plus complexes, la compréhension de ces derniers devient de plus en plus difficile. Une solution pour mieux comprendre un système et pouvoir mieux agir sur celui-ci consiste à disposer d’un modèle du système. Un modèle est une représentation simplifiée de la réalité mettant en évidence certaines propriétés tout en en abstrayant d’autres. Dans le cas des systèmes sur puce, les détails d’implémentation seraient par exemple abstraits. Merise[2], SSADM[3] et UML[4] sont des exemples de méthodes de modélisation. Ces méthodes permettent de manipuler le concept de modèle appliqué à l’informatique en proposant des concepts et une notation permettant de décrire le système à concevoir. Chaque étape du cycle de développement du système produit un ensemble de documents le plus souvent constitués de diagrammes permettant aux différents acteurs du projet de partager leurs points de vue sur le système. Leur lourdeur et leur déficit de souplesse en réaction à l’évolution rapide des logiciels ont parfois été l’origine de critiques qui ont conduit à la notion de modèles contemplatifs essentiellement destinés à la communication et à la compréhension. Ces modèles restent toutefois passifs face à la production, contribuant à laisser, comme c’est le cas depuis plus de cinquante ans, le code au cœur du processus de production logicielle. L’ingénierie dirigée par les modèles tente de combler ce manque au niveau des méthodes traditionnelles de modélisation en fournissant un cadre de développement logiciel au sein duquel les modèles passent de l’état contemplatif (passif) à l’état productif (actif), c’est à dire compréhensibles et interprétables par les machines, devenant ainsi les éléments majeurs dans le processus de développement des logiciels. La séparation des concepts métiers est permise dans un but de portabilité et de maintenabilité, la réutilisation des outils et des patrons de conceptions reconnus permettent également d’augmenter la productivité, tout cela permettant au final d’accélérer le développement tout en réduisant les coûts de conception. Trois concepts fondent la base de l’ingénierie dirigée par les modèles : les modèles, les méta-modèles et les transformations de modèles, c’est cette dernière notion qui donne le caractère productif à cette méthode. 12 CHAPITRE 2. CONTEXTE ET PROBLÉMATIQUE Nous allons présenter les concepts fondamentaux qui constituent la base de l’Ingénierie dirigée par les modèles, nous insisterons ensuite sur la notion qui apporte ce caractère productif à cette méthode puis nous introduirons des approches de méta-modélisation à l’aide du méta-modèle UML. 2.2.1 Modélisation et méta-modélisation Le composant de base de l’Ingénierie Dirigée par les Modèles est le modèle, entité permettant de représenter un ensemble d’informations et désignant une abstraction de la réalité par l’association des symboles du modèle avec des concepts réels et par la description de liens entre ces différents concepts. Contrairement à d’autres méthodes, l’Ingénierie Dirigée par les Modèles utilise le modèle comme élément de base tout au long du processus de développement. Si le concept de modèle n’est pas nouveau, il reflète une manière de penser de l’Homme que l’Ingénierie dirigée par les Modèles a adapté à l’informatique. Il est maintenant nécessaire de rendre ces modèles interprétables par une machine, pour cela il est indispensable de disposer d’un formalisme permettant d’exprimer ces modèles. C’est pour cela que le concept de méta-modèle a été introduit. Un méta-modèle permet de spécifier un langage d’expression de modèle, de définir les différents concepts et leurs relations et il permet également de définir la syntaxe des modèles. Ainsi un modèle qui est écrit suivant un méta-modèle sera qualifié de conforme à ce dernier, de la même manière que nous rédigeons ce texte conformément à la grammaire française. Comme son nom l’indique, un méta-modèle est également lui-même un modèle, c’est à dire qu’il est conforme à un autre méta-modèle, ce qui est en accord avec la philosophie apportée par l’Ingénierie Dirigée par les Modèles. Cependant dans cette situation, nous en arriverions, simplement pour exprimer un modèle à définir une infinité de méta-modèles, ce qui bien sûr n’est pas envisageable. La solution passe par l’utilisation d’un méta-modèle qui soit conforme à lui-même, c’est à dire exprimable à l’aide des seuls concepts qu’il définit. Les principaux méta-modèles ayant cette caractéristique couramment utilisés sont Ecore[5] et MOF (Meta-Object Facility) [6]. Différents niveaux de modélisation ont été introduits afin de classer les différents modèles : les niveaux M0, M1, M2 et M3. La figure 2.2 illustre cette hiérarchie : – M0 représente la réalité (un programme informatique). Dans notre exemple, les variables Numéro et Solde sont affectées par des valeurs ; – M1 correspond au premier niveau d’abstraction, c’est un modèle et c’est lui que manipule un développeur. Pour cet exemple, le modèle contient la déclaration des variables utilisées dans M0 et la notion de Compte. Un modèle de niveau M1 est conforme à un métamodèle de niveau M2 ; – M2 est le niveau dans lequel sont définis les concepts manipulés dans un modèle de niveau M1 (c’est-à-dire les concepts manipulés par un développeur) . Dans cet exemple, Compte est une classe tandis que les déclarations de variables sont des Attributs de cette Classe. Classe et Attributs sont tous deux des concepts du métamodèle de niveau M2, qui est conforme à un métamodèle de niveau M3 ; – M3 correspond au plus niveau d’abstraction, un méta-métamodèle de niveau M3 est conforme à lui même. Dans cet exemple, les concepts Classe et Attributs sont des Méta-Classes, tandis que la notion de contenance est une Méta-Relation. Ce métaméta- modèle se décrit lui-même, la Méta-Classe et la Méta-Relation sont des MétaClasses et les relations source et destination qui les lient sont des Méta-Relations. 2.2. INGÉNIERIE DIRIGÉE PAR LES MODÈLES 13 F IG . 2.2 – Les différents niveaux de modélisation Dans cette classification, Ecore et MOF se situent au niveau M3. 2.2.2 Transformation de modèles La seconde notion importante de l’Ingénierie dirigée par les modèles est la transformation de modèles. Elle consiste à passer d’un modèle source décrit à un certain niveau d’abstraction à un modèle destination, qui n’est pas forcément décrit au même niveau d’abstraction que le modèle source. Le modèle source (respectivement destination) est conforme au méta-modèle source (respectivement destination). Le passage du modèle source au modèle destination est décrit à l’aide de règles de transformation qui sont exécutées sur le modèle source pour obtenir le modèle destination. La figure 2.3 illustre le processus de transformation. F IG . 2.3 – Transformation de modèle : passage d’un modèle source à un modèle destination 14 CHAPITRE 2. CONTEXTE ET PROBLÉMATIQUE Tom Mens et al.[7] ont publié une taxonomie des transformations de modèles dans laquelle sont distinguées deux types de transformation : les transformations dites endogènes pour lesquelles les modèles source et destination sont conformes au même méta-modèle, si ce n’est pas le cas la transformation est qualifiée d’exogène. Sont également différenciées, les transformations dites horizontales qui génèrent un modèle de destination au même niveau d’abstraction que le modèle source et les transformations verticales qui génèrent un modèle destination avec un niveau d’abstraction différent que celui du modèle source. Les règles de transformation constituent le cœur du processus de transformation de modèle. Elles permettent de définir la manière dont un ensemble de concepts du métamodèle source est transformé en un ensemble de concepts du méta-modèle destination. Les règles peuvent être exprimées à l’aide de langages déclaratifs décrivant le résultat de la création par la règle et les langages impératifs décrivant comment une règle doit être exécutée. Ce sont les langages déclaratifs qui sont les plus utilisés avec l’IDM car ils permettent d’exprimer l’intention de la règle indépendamment de son exécution. L’exécution d’une règle peut-être décomposée en trois étapes que sont la vérification, l’exécution et la création. La vérification consiste à analyser le modèle source afin de détecter la présence d’un ensemble de concepts conformément à ce que la règle attend en entrée. Une fois validée, la règle est exécutée par un moteur de transformation qui effectue une sauvegarde, à l’aide de variables, des éléments relatifs à l’ensemble de concepts vérifié. Enfin la création permet de générer un ensemble de concepts dans le modèle destination, les différents champs étant remplis à l’aide de la sauvegarde effectuée lors de l’étape d’exécution. Cette décomposition en règle permet d’identifier des groupes de concepts permettant de ne manipuler que les concepts nécessaires, elle apporte également une plus grande clarté au niveau des règles et encourage surtout à la réutilisation de ces dernières, une même règle pouvant être utilisée plusieurs fois dans la même transformation. Parmi les moteurs de transformations utilisés, on peut citer les outils basés sur le standard QVT (Query View Transformation) comme SmartQVT ou QVTO. On peut également citer ATL (ATLAS Transformation Language). 2.2.3 Modéliser avec UML L’un des méta-modèle les plus répandu dans la communauté est le méta-modèle UML (Unified Modeling Language) [77], il a été standardisé par l’OMG et vise la modélisation de systèmes informatiques de tout type. Ce caractère très généraliste, ainsi que le fait qu’il soit très répandu et donc connu de beaucoup de gens constituent les principaux atouts d’UML. Cependant, dans sa forme livrée, il ne permet pas une utilisation directe dans un processus d’ingénierie dirigée par les modèles, en effet sa sémantique trop généraliste manque de précision et ne permet pas de produire directement un système. Plus précisément, de nombreux points laissent apparaître une sémantique ambiguë, laissant l’utilisateur comme seul décideur de la signification à leur apporter. De nos jours, l’utilisation d’UML dans un cadre d’ingénierie dirigée par les modèles se fait par l’intermédiaire de son mécanisme interne de méta-modélisation que l’on appelle profil. Un profil est un ensemble d’extensions et de restrictions permettant la spécialisation et la description d’un domaine particulier. Les extensions sont appelées Stéréotypes, elles 2.3. L’ENVIRONNEMENT GASPARD2 15 permettent de spécialiser une ou plusieurs classes UML et peuvent contenir de nouveaux attributs appelés tagged values. L’utilisation des profils permet d’obtenir un pouvoir d’expression quasiment identique au pouvoir d’expression du MOF tout en ayant accès aux concepts existants proposés par UML. L’utilisation des profils permet donc d’utiliser ce mécanisme d’extension pour introduire les concepts manquants pour représenter un certain type de système et pour lever les ambiguïtés pouvant apparaître d’un point de vue sémantique. Ainsi, un utilisateur familier avec UML peut facilement comprendre tout ou partie d’un modèle utilisant un profil. Un autre avantage est que de nombreux outils manipulant les modèles UML existent et le plus souvent cette modélisation se fait à l’aide d’une représentation graphique. L’utilisation de profils UML permet aux concepteurs de travailler avec des outils standards et de se baser sur des notions répandues. Le principal inconvénient reste que les modèles réalisés avec un profil ne sont pas conformes au métamodèle mais à son implémentation en UML : une transformation de l’un vers l’autre est donc nécessaire. Bon nombre de standards de modélisation pour l’IDM voient donc le jour sous la forme d’un profil UML. Nous allons en présenter deux : SysML et MARTE. SysML [8] (System Modeling Language) est un profil UML standardisé par l’OMG qui fournit des mécanismes génériques pour décrire des systèmes complexes sans se spécialiser aux systèmes embarqués. Au contraire le profil pour la modélisation et l’analyse des systèmes embarqués et temps réel MARTE [9] (Modeling and Analysis of Real-Time and Embedded systems) fournit des concepts précis pour la description des détails d’architectures matérielles dans les système sur puce. Dans les cas d’analogie avec des concepts SysML, MARTE réutilise les stéréotypes introduits par SysML ou définit des éléments conceptuellement proche de SysML. Au niveau temporel, MARTE raffine les concepts proposés par le profil SPT (Scheduling, Performance and Time) [10], permettant ainsi la modélisation du temps logique discret et continu. Il est également possible d’annoter les modèles conformes au profil MARTE avec des propriétés non fonctionnelles afin d’exprimer des contraintes que le système doit respecter (contraintes de temps, de consommation d’énergie, etc.). 2.3 L’environnement Gaspard2 Gaspard[11] est un environnement de développement permettant la co-conception de systèmes sur puce dans un un cadre d’ingénierie dirigée par les modèles. Il est développé au sein de l’équipe DaRT et est orienté vers les applications de traitement de signal intensif, applications que l’on retrouve le plus souvent dans les systèmes embarqués, qui sont parmi les plus gourmandes en terme de puissance de calcul et qui s’accordent généralement très bien avec la parallélisation des traitements. Gaspard permet donc d’exploiter les principes de l’ingénierie dirigée par les modèles pour co-modéliser des systèmes sur puce multiprocesseur ou massivement parallèle qui sera utilisé dans une application de traitement de signal intensif. Gaspard adopte un flot de conception en «Y», il permet donc aux concepteurs du système de modéliser de manière indépendante l’application et l’architecture matérielle du système, ensuite l’étape d’association permet de les réunir en plaçant l’application sur l’architecture. Ces trois modèles permettent, par l’intermédiaire de transformations, de générer des simulations à des niveaux de précision de plus en plus important. La vérification formelle de la modélisation de l’application est rendue possible par la génération de langages synchrones déclaratifs [12] 16 CHAPITRE 2. CONTEXTE ET PROBLÉMATIQUE comme Lustre [13] ou Signal [14], l’exécution concurrente de différents processus sur une architecture multiprocesseur est rendue possible par la génération de langages procéduraux comme Fortran/OpenMP. La finalité étant de générer un code de simulation, avec SystemC par exemple, prenant en compte à la fois les parties matérielle et logicielle du système sur puce complet. La figure 2.4 illustre le processus de développement et l’agencement illustre le flot de conception en «Y». F IG . 2.4 – Schéma du flot de conception en utilisant l’environnement Gaspard. L’architecture, l’application et l’association sont spécifiées sous forme de modèles. Le premier méta-modèle à avoir été défini est le méta-modèle permettant de spécifier les systèmes sur puces multiprocesseur. Ce méta-modèle s’inspire de standards de l’OMG comme SPT [10] pour la représentation de l’architecture matérielle, SysML pour les mécanismes d’association et UML pour l’approche de modélisation par composants. Gaspard offre également la possibilité de modéliser sous une forme factorisée des applications et des architectures régulières ayant un caractère répétitif, cette expression est basée sur le langage Array-OL (que nous présenterons dans la suite de cette section). Un mécanisme de factorisation permettant de représenter de manière compacte les systèmes répétitifs réguliers basé sur le langage Array-OL est présent. Enfin, précisons que le méta-modèle Gaspard est en partie à la base du récent standard MARTE. Nous tenons à préciser que dans le cadre de ce stage, nous avons utilisé l’ancienne version du métamodèle Gaspard plutôt que la nouvelle qui est en cours de migration vers MARTE. Dans le contexte de développement, ce n’est pas le méta-modèle Gaspard qui est directement manipulé mais le profil UML associé, ceci afin de permettre l’utilisation des outils standards de modélisation graphique basés sur UML. Une fois modélisé, le modèle conforme au profil UML Gaspard est transformé vers un modèle conforme au métamodèle Gaspard à l’aide d’une transformation de modèles. Nous allons maintenant présenter les principaux paquetages composants le métamodèle permettant de modéliser les notions de composants, de factorisation, d’application, d’architecture et d’association. Une description plus complète est disponible dans le rapport technique du profil UML Gaspard2 [15]. La figure 2.5 illustre l’organisation des différents éléments constitutifs du profil, agencés de manière à bien illustrer le «Y» formé par les paquetages Application, HardwareArchitecture et Association. 2.3. L’ENVIRONNEMENT GASPARD2 17 F IG . 2.5 – Vue d’ensemble des différents paquetages constituant le profil Gaspard. 2.3.1 Le paquetage Component Le paquetage Component constitue l’une des bases du méta-modèle Gaspard, il permet de définir l’approche orientée composants qui sera utilisée pour la modélisation. Il apporte les outils nécessaires pour construire des applications et des architectures matérielles sous une forme structurelle. Adoptant les concepts apportés par UML, il permet de mettre en œuvre différents mécanismes. Un mécanisme d’encapsulation permet de rendre la définition d’un composant indépendante de l’environnement dans lequel il est utilisé, une séparation est donc tracée entre l’intérieur du composant (son implémentation), et la façon dont il perçoit son environnement, ou la façon dont il est perçu par son environnement. Un mécanisme de composition et d’assemblage apporte une couche hiérarchique pour organiser l’intérieur du composant : un composant peut être composé de plusieurs composants, afin de par exemple simplifier les fonctionnalités, l’assemblage de ces composants permet alors d’implémenter des comportements plus complexes. Le concept de base du paquetage est le Component, c’est l’élément réutilisable manipulé au sein d’un modèle Gaspard. Un Component est défini par un ensemble d’interfaces proposées par l’intermédiaire de Ports et par sa structure composée par un assemblage d’Instances reliées par des Connectors. Si un composant A contient une instance d’un composant B, cela signifie que le composant A utilise B dans son implémentation. Si un composant ne contient aucune instance, il est qualifié d’ElementaryComponent, on peut rapprocher ce type de composant avec une « boîte noire », désignant un niveau de précision à partir duquel le modèle n’apporte plus d’informations. La figure 2.6 illustre ces différents concepts avec une exemple d’unité de calcul ProcessingUnit définie à l’aide de trois composants élémentaires : un processeur MIPS, une mémoire Memory et un crossbar Crossbar4. Les ports utilisés peuvent être qualifiés de In ou Out, précisant si l’interface est capable de recevoir ou d’émettre des données. En l’absence de qualificatif, l’interface est capable d’émettre et de recevoir. Les qualificatifs des ports sont très importants vis à vis des connexions, en effet les connecteurs de délégations, reliant un composant à une 18 CHAPITRE 2. CONTEXTE ET PROBLÉMATIQUE F IG . 2.6 – Un exemple de composant Gaspard, ProcessingUnit est composé de trois souscomposants instanciés sous les noms cb, mem et mips. Les ports et les connecteurs indiquent les relations entre les instances. instance, ne peuvent connecter que des ports ayant la même orientation tandis que les connecteurs d’assemblage, reliant deux instances, ne peuvent connecter que des ports ayant des orientations opposées. 2.3.2 Le paquetage Factorization Le paquetage Factorization est l’un des points essentiels du méta-modèle Gaspard. En effet, les concepts introduits rendent le méta-modèle particulièrement bien adapté aux systèmes massivement parallèles réguliers. Ces concepts permettent de représenter sous une forme très compacte la répétition d’un ensemble de composants identiques. Il propose au développeur de systèmes sur puce multiprocesseurs les concepts apportés par Array-OL, mais généralisés afin d’en permettre l’utilisation pour modéliser les applications mais également les architectures matérielles et les associations. 2.3.2.1 La notion de Shape Le concept de Shape permet d’indiquer qu’un élément possède une multiplicité, il peut être appliqué à une instance ou à un port. L’élément sur lequel est appliqué le Shape est alors vu comme une collection composée d’un nombre d’éléments qu’il détermine. Cette collection est structurée avec un tableau multidimensionnel et son expression se fait par l’intermédiaire d’un vecteur de nombres entiers strictement positifs, chaque composante du vecteur déterminant la taille, c’est-à-dire le nombre d’éléments, de la dimension du tableau associé. La figure 2.7 illustre ce concept avec un exemple représentant 4 instances d’un composant organisées sous la forme d’un tableau bidimensionnel de 2 x 2 instances. À noter qu’une dimension peut être déclarée comme infinie en spécifiant le symbole ∼ à la place d’un entier, cette spécificité ne s’appliquant évidemment qu’à l’application pour représenter un traitement répété de manière infinie dans le temps, définir un composant matériel aux ressources physiques illimitées n’ayant bien sûr pas de sens. 2.3. L’ENVIRONNEMENT GASPARD2 19 F IG . 2.7 – Représentation d’un composant Gaspard2 avec une multiplicité bidimensionnelle (sur la gauche) et son équivalent en UML2 (sur la droite). 2.3.2.2 La notion de Tiler La notion de Tiler a été créée afin d’apporter un moyen simple, compact et élégant d’accéder aux éléments des tableaux multidimensionnels caractérisés par une Shape. L’idée générale est d’identifier au sein de ces tableaux des ensembles d’éléments que l’on appelle motifs. Cet ensemble de points correspondant à un motif est appelé une tuile (en anglais tile). Ces motifs sont caractérisés par un espacement régulier des différents points, c’est ce que l’on appelle l’ajustage (en anglais fitting). Avec un ensemble de motifs il est donc possible de parcourir tout le tableau afin d’en récupérer tous les éléments. Tout comme les éléments des motifs, les différentes tuiles sont caractérisées par un espacement entre elles, c’est ce qu’on appelle le pavage (en anglais paving). La couverture complète d’un tableau nécessite trois informations supplémentaires : une origine, point faisant office de référence, un espace de répétition délivrant une information concernant le nombre de tuiles à utiliser afin de parcourir tout le tableau et la taille du motif (le nombre de points à considérer pour chaque dimension du tableau). Derrière ces notions se cache en fait le modèle de calcul Array-OL. Pour un motif donné, l’identification d’une tuile se fait à partir d’un élément de référence dans le tableau, nous l’appellerons ref. L’espacement des différents éléments au sein de la tuile est déterminé par l’intermédiaire de la matrice d’ajustage et en rapport avec le point de référence. Le nombre de lignes de la matrice correspond au nombre de dimensions du tableau et le nombre de colonnes correspond au nombre de dimensions du motif que l’on veut récupérer. Chaque élément ei de la tuile étant déterminé par la somme des coordonnées du point de référence et de la multiplication de la matrice d’ajustage par les coordonnées i de l’élément du motif, comme exprimé dans la formule suivante : ∀i, O ≤ i < Spattern , ei = ref + F · i mod Sarray (2.1) Spattern représentant la forme du motif, Sarray représentant la forme du tableau et F étant 20 CHAPITRE 2. CONTEXTE ET PROBLÉMATIQUE la matrice d’ajustage. Les figures 2.8 et 2.9 présentent deux exemples afin d’illustrer cette notion de motif. Le premier exemple montre l’utilisation d’une tuile récupérant six points contigus à l’intérieur d’un motif rectangulaire et le second exemple montre l’utilisation d’une tuile creuse pour récupérer six points non contigus sur chaque dimension avec un motif trapézoïdal. ( 02 ) ( 12 ) ( 01 ) ( 11 ) ( 00 ) F = ( 10 ) 1 0 0 1 ! ! spattern = 2 3 F IG . 2.8 – La tuile a un motif bidimensionnel et contient 6 éléments, la matrice d’ajustage permet de sélectionner des éléments de manière contiguë pour obtenir un rectangle régulier. ( 12 ) ( 02 ) ( 01 ) ( 00 ) ( 11 ) ( 10 ) F = 2 1 0 1 ! spattern = 2 3 ! F IG . 2.9 – Cet exemple illustre le fait qu’une tuile peut être creuse. La matrice d’ajustage permet en effet de sélectionner des éléments qui ne sont pas forcément contigus dans le tableau et de manière non parallèle aux axes. Pour chaque répétition, le pavage permet de préciser la position de l’élément de référence utilisé pour positionner la tuile dans le tableau. Le placement de ces éléments se fait de manière analogue à la construction d’une tuile, il est déterminé par l’intermédiaire d’une matrice de pavage. Le nombre de ligne de cette matrice correspond au nombre de dimensions du tableau et le nombre de colonnes correspond au nombre de dimensions de l’espace de répétition. Initialement, l’élément de référence de la répétition de base correspond à l’origine o. Pour une répétition r donnée, les coordonnées de refr sont obtenues en faisant la somme de l’origine et du produit de la matrice de pavage par r, comme exprimé dans la formule suivante : ∀r, 0 ≤ r < Srepetition , refr = o + P · r mod Sarray (2.2) P étant la matrice de pavage et Srepetition la forme de l’espace de répétition. La figure 2.10 illustre le processus complet de pavage d’un tableau, le tableau a deux dimensions : neuf éléments sur la première dimension et huit éléments sur la seconde. La tuile utilisée est un rectangle contenant trois éléments sur la première dimension et 2.3. L’ENVIRONNEMENT GASPARD2 7 7 0 7 0 7 7 0 0 r = (2) 8 1 o= 0 0 P = 3 0 0 4 7 0 0 r = (0) 8 0 F = 1 0 0 1 0 0 r = (1) 8 1 0 r = (0) 8 1 21 ! ! spattern = 3 4 sarray = 9 8 srepetition = 3 2 ! ! ! ! 0 0 r = (1) 8 0 0 r = (2) 8 0 F IG . 2.10 – Pavage complet du tableau par une tuile de dimension {3,4} quatre éléments sur la seconde dimension. Pour couvrir complètement le tableau, il est donc nécessaire de répéter l’opération trois fois pour la première dimension et deux fois pour la seconde. Pour chaque répétition, le point de référence se déplace, soit de trois unités sur la première dimension, soit de quatre unités sur la seconde dimension ou soit la combinaison des deux déplacements. Ainsi, l’ajustage permet de décrire les coordonnées des points d’une tuile relativement à un point de référence, le pavage permet de décrire l’ensemble des points de référence des tuiles relativement à l’origine. Le parcours complet d’un tableau est donc rendu possible avec les trois informations que sont l’origine (représentée par un vecteur d’entiers), la matrice d’ajustage (contenant des entiers) et la matrice de pavage (contenant des entiers). Pour une tuile d’indice r dans l’espace de répétition, l’ensemble des points sont énumérés à partir d’un point d’indice i dans le motif avec la formule suivante : o+ F r P · i ! mod Sarray (2.3) F étant la matrice d’ajustage, P la matrice de pavage, o l’origine du tableau et Sarray la forme du tableau. Cette formule garantie que : – les points de la tuile sont régulièrement espacés car ils sont construits depuis le point de référence de la tuile par combinaison linéaire des vecteurs colonnes de la matrice d’ajustage ; – les points de référence des tuiles sont régulièrement espacés car ils sont construits depuis l’origine par combinaison linéaire des vecteurs colonnes de la matrice de pavage ; – tous les points de la tuile sont des points du tableau : les calculs sont effectués modulo la taille du tableau. La figure 2.11 illustre un exemple de tiler dans une application. Prenons le cas du connecteur situé entre les ports m1 et A, le port m1 a une dimension 128x128 et le port A a une dimension de 8x8, Le Tiler permet de découper le tableau situé sur m1 par blocs de 8x8 éléments contigus. 22 CHAPITRE 2. CONTEXTE ET PROBLÉMATIQUE F IG . 2.11 – Illustration de la notion de Tiler. 2.3.2.3 La notion de Reshape Le concept de Reshape a été introduit afin de permettre la liaison élément par élément de deux tableaux ayant des formes différentes. Au niveau conceptuel, un Reshape se contente simplement d’associer deux Tilers l’un après l’autre, le premier Tiler ayant pour tâche de rassembler par motifs les éléments du premier tableau vers un motif intermédiaire et le second Tiler ayant pour fonction de répartir les éléments du motif intermédiaire sous une nouvelle forme dans le tableau de sortie. En plus des deux Tilers, le Reshape apporte les notions de PatternShape et de RepetitionSpace, le PatternShape permettant de représenter la forme du motif intermédiaire et le RepetitionSpace permettant d’exprimer l’espace de répétition parcouru afin de complètement remplir le tableau de sortie. La figure 2.12 illustre un exemple de Reshape. Dans cet exemple, il y a deux tâches t1 et t2, chaque ligne du tableau de sortie de t1 est rangée dans une colonne du tableau d’entrée de t2. On passe donc d’un tableau de dimension 3 x 2 à un tableau de dimension 2 x 3. F IG . 2.12 – Un exemple de Reshape. Cette notion de Reshape apporte donc une représentation plus compacte permettant d’éviter l’introduction d’une tâche «fantôme» ne faisant que consommer les motifs d’un tableau d’entrée pour ensuite les ranger dans un tableau de sortie par l’intermédiaire de 2.3. L’ENVIRONNEMENT GASPARD2 23 Tiler comme le montre la figure 2.13 F IG . 2.13 – Reshape exprimé à l’aide d’une « tâche fantôme » 2.3.2.4 Les notions d’InterRepetition et de Defaultlink Les derniers concepts apportés par le paquetage Factorization concernent les notions d’ InterRepetition et de DefaultLink. InterRepetition permet de qualifier les liens existants entre plusieurs éléments membres du même tableau. InterRepetition permet de définir des dépendances de données entre les différentes itérations ou des liens de communications en ce qui concerne les éléments d’une grille par exemple 2.14. DefaultLink permet quant à lui d’exprimer des connexions irrégulières pouvant se situer sur les bords d’un tableau d’éléments. 2.3.3 Le paquetage Application Le paquetage Application apporte les notions nécessaires pour indiquer qu’un composant représente une partie de l’application et qu’en tant que tel, il est nécessaire d’y associer une sémantique propre. La notion principale introduite étant la classe ApplicationComponent. Avec cette sémantique, les applications peuvent être représentées par un langage de flot de données s’appuyant sur les concepts définis dans les paquetages Component et Factorization. Ce langage est très fortement inspiré de Array-OL dont nous allons présenter les concepts principaux liés à son modèle de calcul [16, 17] et utilisé dans le cadre du paquetage Application. Rappelons également, que par Application, on définit le comportement du système en fonction des entrées qu’on lui fournit, tout ou partie de l’application peut donc être sous une forme logicielle ou matérielle. L’objectif du paquetage Application est de permettre l’expression d’applications de traitement de signal intensif travaillant avec des tableaux multidimensionnels. La dif- 24 CHAPITRE 2. CONTEXTE ET PROBLÉMATIQUE F IG . 2.14 – Illustration des liens InterRepetition, à gauche le composant Gaspard représentant une grille, à droite son équivalent UML ficulté dans la mise au point de telles applications ne provient pas des fonctions élémentaires constituant l’application (pour la plupart, ce sont des fonctions répandues ou disponibles par l’intermédiaire de bibliothèques) mais de leur association ainsi que de la manière d’accéder aux tableaux de données utilisés. La finalité de tels systèmes étant d’en ressortir des performances, il est indispensable d’utiliser le parallélisme potentiel offert par l’application, de manière à l’associer au parallélisme disponible offert par l’architecture matérielle. Dans cette optique, un certain nombre de principes de base ont été choisis pour constituer le langage : – tout le parallélisme potentiel est exprimé ; – toutes les dépendances de données sont explicites ; – les tableaux sont à assignation unique, chaque élément peut être lu plusieurs fois mais ne peut être écrit qu’une seule fois ; – il n’y a pas de différentiation dans le traitement des dimensions spatiale et temporelle dans les tableaux. L’application est alors vue comme un graphe de dépendances, chaque nœud représentant une tâche et chaque arête correspondant à une dépendance entre deux tâches. Le graphe possède un caractère hiérarchique, chaque nœud pouvant contenir lui-même un graphe de dépendances, l’application est donc un ensemble de tâches connectées par l’intermédiaire de ports. Au niveau du méta-modèle Gaspard, les tâches sont représentées par des instances de ApplicationComponents et les ports par des Ports. On recense trois types de tâches : – les tâches élémentaires, représentées par des instances d’ElementaryComponent et qui correspondent à des fonctions cachées à l’intérieur de boîtes noires ; – les tâches composées, représentées par l’instance d’un Component contenant plusieurs instances, de telles tâches correspondent à des graphes de dépendances ; – les tâches répétées, représentées par des instances de Component sur lesquelles des Shape ont été spécifiées. 2.3. L’ENVIRONNEMENT GASPARD2 25 Les tâches communiquent par l’intermédiaire de tableaux multidimensionnels qui peuvent avoir une dimension infinie, chaque tableau étant spécifié par une Shape pour préciser sa taille. Les Ports sont également spécifiés avec une shape et avec le type des éléments du tableau auquel il accède. 2.3.3.1 Parallélisme de tâches La notion de parallélisme de tâches n’a de sens que dans le contexte de tâches composées. Dans ce cas, la composition interne d’un composant correspond à un graphe acyclique orienté, chaque nœud du graphe correspond à une tâche et chaque arête correspond à une dépendance reliant deux ports de même taille et de même type, un nœud représentant une instance et une arête un connecteur reliant port de sortie et port d’entrée. Aucune contrainte n’est définie concernant le type et la taille des ports d’entrée et de sortie d’une tâche, une tâche pouvant lire deux tableaux à une dimension pour ne produire qu’un tableau à deux dimensions. La figure 2.15 illustre cette notion de parallélisme de tâches avec un exemple contenant 4 tâches : un producteur, deux consommateurs et un agrégateur. L’agrégateur a possède une dépendance sur les consommateurs c1 et c2. Les ports de chaque composants sont orientés, imposant l’exécution du producteur p avant les autres tâches. Les deux consommateurs c1 et c2 peuvent être exécutés en parallèles. F IG . 2.15 – Exemple d’une tâche composée dans Gaspard, elle est constituée de quatre sous-tâches : p, c1, c2 et a. La tâche a possède deux dépendances sur c1 et c2, possédant elles-même chacune une dépendance sur p. Les tâches c1 et c2 peuvent être exécutée de manière parallèle. Lors de son exécution, un tâche lit ses tableaux d’entrée un par un et écrit le résultat de son exécution dans ses tableaux de sortie, ce qui correspond à un graphe de dépendance permettant l’ordonnancement des tâches ainsi que l’expression du parallélisme potentiel de l’application. En effet, si deux tâches A et B ont leurs dépendances de satisfaites, il est possible de les exécuter de manière parallèle. 26 2.3.3.2 CHAPITRE 2. CONTEXTE ET PROBLÉMATIQUE Parallélisme de données Le parallélisme de données est toujours lié à l’expression des répétitions de tâches, l’idée étant que chaque répétition de la tâche est indépendante : il n’y a pas d’ordre imposé pour l’exécution, les tâches peuvent donc être exécutées en parallèle. Les Connectors qui interviennent ne peuvent être spécifiés qu’avec des Tilers, ils vont permettre de découper les tableaux présents sur les ports du composant père, pour en faire des motifs qui seront présents sur les ports du composant lui-même. Chaque répétition de tâche n’accède donc qu’à un sous ensemble des tableaux du composant. La figure 2.16 illustre un exemple d’application mettant en œuvre le parallélisme de données. Le composant AplusB contient une tâche Sum répétée 16 x 16 fois et prenant en entrée les données de deux matrices pour en sortir un résultat. Chaque répétition de la tâche va s’occuper de traiter deux motifs des tableaux d’entrée. F IG . 2.16 – Parallélisme de données. Les notions de sémantique apportées par le paquetage Application permettent donc de représenter les dépendances entre les tâches et les répétitions de tâches. Il est également possible de déterminer les dépendances entre un élément du tableau de sortie et les éléments du tableau d’entrée. Toutes ces informations permettent au final, de déduire un ordre d’exécution des tâches. 2.3.4 Le paquetage HardwareArchitecture Le paquetage hardwareArchitecture apporte les éléments nécessaires au concepteur pour définir la composition de l’architecture matérielle du système sur puce. La représentation est toujours assurée à un haut niveau grâce aux notions du paquetage Component qui permet de représenter la structure et la hiérarchie du matériel. Les liaisons directes entre composants sont représentées par les ports et les connecteurs, un connecteur étant équivalent à une connexion de transaction, c’est-à-dire qu’il représente un ensemble de fils. Les différents éléments de l’architecture matérielle ont été classifiés dans quatre catégories : Processor, Memory, Communication et IO. Chaque catégorie étant elle-même décomposée en un ensemble de sous-types plus précis assurant un niveau de détails suffisant pour représenter de manière globale l’architecture du système afin d’y associer une 2.3. L’ENVIRONNEMENT GASPARD2 27 application. Le comportement de l’architecture se situe au niveau des «boîtes noires» représentant les composants matériels élémentaires. La figure 2.17 illustre un exemple de composant matériel. F IG . 2.17 – Un exemple de composant Gaspard, ProcessingUnit est composé de trois souscomposants instanciés sous les noms cb, mem et mips correspondant respectivement à un crossbar, une mémoire et un processeur. À noter également que les concepts introduits par le paquetage Factorization concernant les multiplicités peuvent être appliqués aux composants matériels, la figure 2.18 illustre la spécification d’une grille de processeur, et ce d’une manière très compacte. F IG . 2.18 – Composant matériel Gaspard représentant une grille de 16 unités de calcul réparties sur 2 dimensions. 2.3.5 Le paquetage Association Le paquetage Association est le dernier paquetage du méta-modèle MARTE, il apporte les notions nécessaires pour compléter le modèle en «Y» et établir un lien entre une application et une architecture matérielle servant de support d’exécution. L’association consiste donc à placer les éléments de l’application sur des éléments de l’architecture 28 CHAPITRE 2. CONTEXTE ET PROBLÉMATIQUE matérielle. Les allocations peuvent être de plusieurs types : une TaskAllocation permet de décrire l’association d’une tâche sur une ressource de calcul (processeur, accélérateur matériel), une DataAllocation permet d’exprimer l’allocation de données sur une mémoire et une CommunicationAllocation permet d’indiquer comment synchroniser deux mémoires, son utilisation est indiquée lorsque plusieurs tâches partagent des données allouées sur différentes mémoires de la plate-forme d’exécution et dans ce cas, les données sont copiées en suivant l’information concernant la route donnée par l’allocation. Ces différentes notions d’allocation ne permettent néanmoins de ne spécifier que des placements spatiaux d’application. La gestion du caractère temporel du placement est confiée au compilateur qui a la charge de prendre ces décisions. La figure 2.19 illustre un exemple d’allocation simple d’une tâche sur un processeur. F IG . 2.19 – Allocation de la tâche appli sur le processeur proc. Ces notions d’allocations ne concernent toutefois que des éléments simples, pour prendre en compte les aspects introduits par le paquetage Factorization et leur utilisation pour les éléments d’une application et d’une architecture matérielle, la notion de Distribution a été introduite. Elle permet de distribuer une tâche répétée sur un ensemble de processeurs mais également de spécifier le placement d’un tableau de données sur un ensemble de mémoires. La figure 2.20 illustre cette notion avec un exemple de distribution de tâches sur un élément d’une architecture matérielle. 2.4 Placement et parallélisme de données Le développement du calcul scientifique a été accompagné depuis de nombreuses décennies par le développement de divers langages de programmation. Le premier d’entre eux à avoir permis au programmeur d’être exempté de la tâche visant à porter un algorithme en code machine est Fortran. Il a vu le jour en 1956 et a rapidement été suivi par l’arrivée d’Algol de Pascal, du C et d’Ada. Dans le même temps, d’autres langages ont été développés pour des domaines différents, le COBOL dédié aux les entreprises, le Prolog et le LISP pour l’intelligence artificielle et PL/1 pour le traitement de données, PL/1 étant l’un des langages les plus larges, couvrant des domaines d’application allant des systèmes à la programmation scientifique. Ensuite sont apparus les langages orientés 2.4. PLACEMENT ET PARALLÉLISME DE DONNÉES 29 F IG . 2.20 – Distribution d’une tâche répétée sur une grille de 16 unités de calcul. objet comme C++, Java et Smalltalk. Ces derniers ont contribué à ce que l’accent soit davantage mis sur la philosophie de conception du programme, faisant de ces langages des outils très généralistes. On recense également les langages de scripts comme Basic, Perl, Python ou Ruby. Cependant, avec l’avènement du calcul parallèle, l’un des principaux objectifs était de concevoir des compilateurs capables de faire de la parallélisation automatique, ce qui est plutôt difficile. Plusieurs projets ont été menés afin d’ajouter de manière transparente au compilateur des directives qu’il serait libre d’appliquer ou non. L’un d’entre eux est High Performance Fortran qui contient des directives pouvant être assimilées à des commentaires par un compilateur ou donner des suggestions sur la manière d’exploiter le parallélisme à l’intérieur du code. Cependant ces directives se sont révélées insuffisantes pour décrire les algorithmes qui émergeaient. Sont alors apparues des librairies comme MPI ou PVM permettant d’ajouter de la communication et de la coopération entre différents processeurs. Ces fonctionnalités sont définies à l’extérieur du langage de programmation et sont accessibles via des bindings fournis par l’API. Récemment, de nouveaux langages intégrant des notions de parallélisme sont apparus : CAF, UPC, Titanium, réutilisant des langages existants : Fortran95, C, et Java en proposant des ajouts pour supporter les parallélisations basées sur le PGASM. Le projet HPCS (High Productivity Computing Systems) a été fondé en 2002 par le DARPA (l’agence américaine pour les projets de recherche avancée de défense) dans le but de créer une nouvelle génération d’environnement de programmation, d’outils logiciels et de nouvelles architectures matérielles. L’un des objectifs du projet est le développement de nouveaux langages supportant ces environnements de calcul à forte productivité. Trois langages que sont Fortress, Chapel et X10 ont ainsi été définis dans le cadre 30 CHAPITRE 2. CONTEXTE ET PROBLÉMATIQUE du projet. Ces différents langages devraient à terme prendre la place du vieillissant HPF, devenant au fil des ans de moins en moins utilisé. 2.4.1 2.4.1.1 Les langages de programmation à parallèlisme de données HPF High Performance Fortran est un langage à parallélisme de données, sa première ébauche fût le fruit de nombreuses discussions initiées lors d’une réunion du High Performance Fortran Forum, consortium composé de constructeurs et de vendeurs de compilateurs. Le but étant de définir un langage adapté au calcul scientifique et respectant diverses contraintes comme : – la compatibilité avec le langage Fortran ; – une orientation générale pour ne pas se restreindre à un modèle d’architecture particulier ; – une mise en oeuvre facilitée du parallélisme garantissant des performances quelle que soit l’architecture cible. La version 1.0 de HPF, apparue en 1993, repose sur un Fortran 90 complété par un ensemble de directives permettant d’exprimer les notions de parallélisation. Un noyau minimum appelé subset HPF permettant des extensions progressives. Le modèle d’exécution le plus adapté au modèle de programmation du langage est le modèle SPMD1 . La contrainte de généralité a donc été « effacée » au profit du parallélisme de données pour des raisons de simplicité et de performances : en effet, le parallélisme de tâches serait trop difficile à manipuler et l’exprimer sans perte de performances serait très compliqué. La version 2.0 du langage, apparue en 1997, ajoute une série d’extensions approuvées, d’autres fonctionnalités sont également ajoutées comme les distributions généralisées ou les notions de sous-ensembles de processeurs. Le langage HPF est donc un Fortran que l’on complète par l’ajout de directives de parallélisation et de placement de données. L’ajout de ces directives n’entravent pas la syntaxe du programme si on le soumet à un compilateur standard Fortran, en effet elles prennent la forme de commentaires et ne sont ainsi pas évaluées lors d’une compilation en Fortran traditionnel. En ce qui concerne le placement, HPF distingue ce processus suivant deux aspects de la répartition des données sur différents nœuds : – les alignements qui consistent à placer des tableaux les uns par rapport aux autres dans un but de réductions des communications ; – les distributions qui consistent à spécifier comment seront réparties ces ensembles de données afin d’équilibrer la charge des processeurs. Un alignement est une information concernant la manière dont un tableau doit être aligné sur un template, un template étant un tableau fictif sur lequel sont alignés d’autres tableaux. Différents types d’alignements sont proposés, dont certains permettant soit d’im1 Simple Program Multiple Data 2.4. PLACEMENT ET PARALLÉLISME DE DONNÉES 31 poser une réplication des données, soit un effondrement des données selon le contexte dans lequel l’alignement est défini. Derrière le terme distribution se cache le fait de répartir régulièrement les éléments d’un tableau (ou d’un template) sur les éléments d’une processors, un processor étant une structure abstraire définie par HPF et qui modélise une machine cible virtuelle. Une grille multidimensionnelle et homogène de processeurs abstraits2 forme la structure d’un processor. Cette répartition s’effectuant pour chaque dimension source sur les dimensions successives du processors cible. Une répartition peut être de l’un des types suivants : Block, Cyclic, Block(n), Cyclic(n) ou * correspondant à ce qu’on appelle l’effondrement d’une dimension. 2.4.1.2 Fortress Le langage Fortress [18] est développé par Sun Microsystems et vise à être un langage généraliste pour les applications à hautes performances avec un haut niveau de programmabilité. C’est un objectif important et le langage est large et complexe en conséquence. Par son nom, Fortress tend à évoquer l’idée d’un « Fortran sécurisé » , combinant les idéaux de Fortran concernant le calcul haute performance avec l’abstraction et les types sécurisés inhérents aux langages modernes comme C++ ou Java. Pourtant Fortress n’est pas une évolution de Fortran, c’est un langage développé à partir de zéro. Afin d’explorer des approches en rupture avec les tendances actuelles, Fortress n’a pas été mis au point en vue de respecter une syntaxe ou une sémantique particulière. Tous les aspects du calcul haute performance ont ainsi été repensés depuis l’origine. Les concepts de base de Fortress sont les objets et les traits [19]. Les objets font partie de la programmation orientée objet traditionnelle, ils sont composés d’attributs et de méthodes. Les traits, quant à eux, sont des unités composables de comportement qui permettent la réutilisation de méthodes entre classes non apparentées. Ils mettent l’accent sur le pouvoir de composition en essayant d’être le moins contraignant possible, contrairement aux limitations des mécanismes comme l’héritage ou les mixins [20]. Fortress est capable de prendre en compte des spécifications telles que des transactions, des spécifications de localisation et du calcul parallèle implicite, comme des spécifications entières construites et incluses dans le coeur du langage. Des spécifications telles que le système d’extension (ou de composantes) de Fortress ou son environnement de test, facilitent l’assemblage du programme et sa mise à l’essai, et permettent de puissantes optimisations du compilateur à travers les librairies. Même la syntaxe et le système d’entrée de Fortress sont taillés sur mesure pour la programmation d’applications de calcul hautes performance modernes, en acceptant les notations mathématiques et la vérification statique de propriétés telles que les unités physiques ou les dimensions. De plus, Fortress a été mis au point dans l’intention d’être un langage évolutif, en supportant l’ajout futur de nouvelles spécifications du langage. En fait, la plupart du langage Fortress lui même (y compris la définition de tableaux et d’autres types de base) est codée dans des librairies fondées sur un langage cœur relativement léger. 2 processeurs élémentaires 32 CHAPITRE 2. CONTEXTE ET PROBLÉMATIQUE En ce qui concerne le placement, Fortress introduit le concept de région. Chaque tâche, chaque objet et chaque élément d’un tableau Fortress (correspondant au stockage physique de l’élément) se voit attribuer une région. Les régions décrivent de manière abstraite la structure de la machine sur laquelle le programme est exécuté. Ces régions sont organisées hiérarchiquement pour former un arbre, on distingue la région globale qui représente la racine de la hiérarchie des régions. Les différents niveaux de l’arbre illustrent la structure de la machine comme les processeurs, les mémoires partagées par des groupes de processeurs ou des ressources distribuées à travers la machine entière. Dans un contexte multi processeurs à mémoire distribuée, chaque région serait représentée par un couple processeur-mémoire. La distribution de données à travers les régions est définie par défaut par la librairie Fortress, elle est relative à la taille et à la forme du tableau mais également aux caractéristiques de taille et de localité de l’architecture matérielle sur laquelle est exécuté le programme. Le programmeur peut également décider d’une distribution des données particulière en utilisant la distribution des traits. Plusieurs distributions prédéfinies sont proposées : sequential permettant d’allouer des blocs de données contigus sur des régions, par permettant d’allouer une adresse à chaque région de manière cyclique, blocked consistant à diviser de manière régulière l’espace de données en plusieurs segments et subdivided découpant en deux morceaux et de manière récursive l’espace d’adressage. 2.4.1.3 Chapel Chapel [21] est un langage développé par Cray, il vise à mettre en relation le développement d’algorithmes et le déploiement dans le domaine du calcul hautes performances. Les concepts adoptés proviennent de pratiques de programmation modernes comme la programmation orientée objet, néanmoins certains compromis ont été faits dans le but d’atteindre un certain niveau de performance. L’approche adoptée par Chapel est guidée par quatre concepts clés tirés de technologies des langages : – multithreading : la programmation parallèle multi tâches apporte un support pour le parallélisme à grain fin ainsi qu’une virtualisation des ressources ; – locality-awareness : fournit un moyen de distribuer des structures de données partagées sans avoir à fragmenter les structures de contrôle, dans le style de HPF ; – object-orientation : apporte la couche objet permettant de gérer plus facilement la complexité en séparant les fonctions communes afin de faciliter la réutilisation ; – generic programming : associé avec un système d’inférence de type, simplifie le système de type proposé à l’utilisateur. Ce système de types est requis par le calcul hautes performances pour fournir des détails des structures de données permettant une implémentation efficace. Le langage en lui-même est un langage orienté objet fortement typé supportant les domaines, les tableaux dérivés de Fortran, les structures de données générales, les opérations à parallèlisme de données et un contrôle explicite de la localité. La base du langage repose sur le modèle de vue global de HPF, enrichie avec des structures objet de données arbitraires et de la programmation multi tâches générale. Les domaines sont des ensembles nommés, ils peuvent être combinés avec des distributions, en association avec 2.4. PLACEMENT ET PARALLÉLISME DE DONNÉES 33 des structures de données et fournissant une base pour la formulation de processus itératifs. Ce sont des objets majeurs pouvant survenir comme des éléments de structures de données et pouvant jouer le rôle d’argument ou de retour avec les fonctions. Une sousclasse importante des domaines est la Cartesian product domains, les domaines de ce type supportent les tableaux réguliers de structures de données comme en Fortran et forment une grande partie de la famille de distributions. De tels domaines peuvent également être dynamiquement remaniés et redistribués. En ce qui concerne les distributions, Chapel reprend les distributions de données des extensions de HPF-2, incluant les distributions general block et indirect. Sont également supportées les spécifications de distributions définies par l’utilisateur. L’une des nouveautés est la general tiling distribution, généralisant la distribution general block en permettant le partitionnement d’un ensemble multidimensionnel pour obtenir des sous domaines rectangulaires appelés tuiles. 2.4.1.4 X10 Les langages modernes comme Java et C# ont rendu la programmation concurrente et distribuée accessible aux développeurs d’applications, privilège qui était réservé jusqu’alors aux programmeurs systèmes. Deux types de plate-forme ont été supportées : les plates-formes mono processeur et les plates-formes multiprocesseurs à mémoire partagée (SMP). Cependant, les dernières tendances au niveau des technologies matérielles, avec les difficultés de montée en fréquence, laissent à penser que les systèmes vont rapidement migrer du mono processeur vers le multiprocesseur. Le parallélisme est donc en train de supplanter la course à la fréquence d’horloge pour constituer la base en termes de performances de calcul. Dans cette optique, IBM pense que les futurs systèmes, notamment pour les serveurs, seront constitués de nœuds multi-cœurs SMP avec des hiérarchies de mémoires non uniformes inter-connectés dans des clusters évolutifs. De tels systèmes sont qualifiés de NUCC3 , soulignant les caractères relatifs aux systèmes NUMA (NonUniform Memory Access) et aux clusters qu’ils empruntent. Ce sont ces notions de non-uniformité que les langages orientés objet ne supportent pas, dans l’état actuel des choses. L’état de l’art de la programmation de systèmes NUCC provient de la communauté HPC (High Performance Computing) et repose sur l’utilisation de librairies comme MPI. IBM considère donc qu’il y a un besoin urgent de disposer d’un modèle de programmation orienté objet et adapté aux NUCC, un tel modèle permettrait également de rendre la programmation concurrente et distribuée sur les architectures actuelles accessibles aux développeurs d’applications. X10 [22] est un nouveau langage expérimental actuellement développé par IBM et la communauté académique. Il fait partie du projet IBM PERCS (Productive Easy-to-use Reliable Computer Systems) visant à délivrer de nouveaux systèmes adaptables et évolutifs et apportant une amélioration de la productivité dans le développement d’applications parallèles d’un facteur 10. Le projet PERCS utilise pour ce faire, une approche de coconception matérielle logicielle. L’accent a été mis sur l’augmentation de la productivité du programmeur de NUCC sans faire de compromis sur les performances. X10 se veut être un langage sûr, moderne, parallèle et orienté objets distribués supportant le calcul 3 Non-Uniform Cluster Computing 34 CHAPITRE 2. CONTEXTE ET PROBLÉMATIQUE hautes performances avec des tableaux multidimensionnels distribués. Le respect de la productivité et des performances des systèmes NUCC passe par quatre objectifs majeurs : – Safety : le modèle de programmation doit être sûr, les erreurs types doivent être traitées à la conception ; – Analyzability : les programmes X10 doivent être analysables par d’autres programmes ; – Scalability : l’ajout de ressources de calcul doit conduire à une augmentation des performances ; – Flexibility : les applications doivent exploiter les formes multiples du parallélisme : parallélisme de tâches, de données etc. Les structures de données, la concurrence et les mécanismes de distribution doivent être flexibles et généraux. Parallèlement à ces différents objectifs, cinq décisions clés portant sur la conception ont été prises au début du projet X10 : – l’introduction d’un nouveau langage de programmation plutôt que l’introduction de librairies ou de canevas de conception ; – l’extension des fondations d’un langage orienté objet moderne, en l’occurence Java, afin de profiter des différents outils, librairies et documentations existants. De plus il satisfait aux critères de sûreté, d’analysabilité et de flexibilité ; – l’introduction d’un PGAS (Partitioned Global Adress Space) pour supprimer les contraintes de Java vis à vis du modèle NUCC ; – l’introduction d’activités dynamiques asynchrones en tant que fondation du langage pour les constructions concurrentes ; – l’ajout d’un sous langage manipulant des tableaux afin de gérer les distributions de tableaux multidimensionnels. En ce qui concerne les distributions, un tableau est associé avec un ensemble de points, éventuellement multidimensionnel, que l’on appelle région. Une distribution spécifiant la place, entité permettant de localiser les données et les tâches, que prend chaque élément du tableau au sein de la région. Des distributions BLOCK ou BLOCK-CYCLIC sont proposées de base par X10. 2.4.2 Le placement dans Gaspard2 Le modèle de placement de Gaspard2 se base sur le profil standard MARTE, en particulier ses paquetages allocation et modélisation de structures répétitives constitués de notions reprises du profil Gaspard. Il permet le placement des tâches, des données et des dépendances de données sur des ressources de calcul, de stockage et de communication. Le métamodèle permet de décrire avec souplesse une grande variété de placements (distribution spatiale et ordonnancement temporel) mais parmi tous ceux qui sont exprimables, l’immense majorité ne conduit pas à des spécifications exécutables car incohérents ou non complètement spécifiés. L’objectif est donc de proposer une méthodologie pour s’assurer du caractère complet et cohérent d’un placement. Cette méthodologie devra s’appuyer sur un outil permettant de vérifier un placement. Chapitre 3 Des langages à parallélismes de données vers Marte Sommaire 3.1 3.2 3.3 3.4 3.5 3.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . Représentation formelle de HPF . . . . . . . . . . . . 3.2.1 Représentation formelle des alignements . . . 3.2.2 Représentation formelle des distributions HPF Méthodologie de construction . . . . . . . . . . . . . 3.3.1 Alignements . . . . . . . . . . . . . . . . . . . . 3.3.2 Distribution . . . . . . . . . . . . . . . . . . . . Exemples . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4.1 Distribution (*,block) . . . . . . . . . . . . . . . 3.4.2 Distribution (block, block) . . . . . . . . . . . . 3.4.3 Distribution (cyclic, cyclic) . . . . . . . . . . . 3.4.4 Distribution (block, *, block) . . . . . . . . . . . Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 36 36 37 39 39 43 44 45 46 48 49 51 Introduction avons vu précédemment les différents concepts apportés par les langages de programmation à parallélisme de données vis à vis de la distribution. Le profil Marte proposes des notations pour exprimer de manière compacte des structures répétitives. Les notions apportées permettent d’appliquer une multiplicité à des éléments, s’appliquant alors très bien aux applications basées sur un modèle à parallélisme de données. Il propose également une notation pour la distribution de telles applications sur des architectures répétitives. Cette notation présente des similitudes avec les notations apportés par les différents langages, nous laissant penser que MARTE est suffisamment puissant afin d’exprimer toutes les distributions proposées par ces langages. Dans cette optique, nous proposons une méthodologie de construction illustrant nos pensées, nous allons dans le cadre de cette démonstration nous concentrer plus particulièrement sur l’un d’entre eux : HPF, cette méthodologie est illustrée par plusieurs exemples. Le langage Chapel, reposant en partie sur le modèle de HPF et reprenant les distributions offertes par ce dernier, cette démonstration est donc en partie applicable à ce langage. N OUS 35 36 CHAPITRE 3. DES LANGAGES À PARALLÉLISMES DE DONNÉES VERS MARTE 3.2 Représentation formelle de HPF High Performance Fortran est une extension de Fortran 90 qui apporte le support du calcul parallèle par l’intermédiaire de directives de compilation spéciales. Il permet les constructions parallèles en utilisant des opérations sur des tableaux. HPF possède également un modèle de placement qui repose sur 2 notions : – les alignements, proposent un moyen de spécifier comment un tableau doit être placés sur un autre tableau ; – les distributions, proposent un moyen de spécifier comment un ensemble d’éléments doivent être distribués sur une grille de processeurs. Pierre Boulet et Xavier Redon[23] ont proposé un formalisme pour exprimer ces notions d’alignement et de distribution, nous le réutiliserons dans la suite de ce document. A alignment B distribution T P F IG . 3.1 – Les différentes étapes d’une distribution HPF. Les données des tableaux A et B sont d’abord alignées sur le template T avant d’être distribuées par blocs sur la grille de processeurs P . 3.2.1 Représentation formelle des alignements Pour spécifier la manière dont les données doivent être placées les unes par rapport aux autres, la notion de template a été introduite : un template est un tableau virtuel avec un certain nombre de dimensions et une taille donnée pour chacune d’entre elles. Un template sert de référence pour le placement des tableaux, un alignement consiste justement à définir la manière de placer les éléments d’un tableau source sur un template. Dans l’exemple d’alignement suivant, le tableau A est aligné avec la première ligne du template T et le tableau B est aligné avec la seconde ligne du template B, la figure 3.2 illustre cet alignement. !HPF$ PROCESSORS P(2,2) !HPF$ TEMPLATE T(16,2) real A(16) real B(16) !HPF$ ALIGN A(i) WITH T(i,1) !HPF$ ALIGN B(i) WITH T(i,2) ... En HPF les alignements peuvent être de trois types possibles, correspondants à : 3.2. REPRÉSENTATION FORMELLE DE HPF 37 A align T B F IG . 3.2 – Le tableau A est aligné sur la première ligne du template T et le tableau B est aligné sur la seconde ligne du template T . – : signifie que le placement concerne la colonne entière relative à la dimension ; – une variable : i, j ou une expression 1 − i signifie que le placement sur le template sera relatif à cette variable/expression ; – ∗ signifie que la dimension correspondante est soit effondrée soit répliquée : – si ∗ apparaît dans le tableau source, la dimension correspondant sera effondrée ; – si ∗ apparaît dans le template, les éléments seront répliqués sur la dimension associée. Les alignements HPF peuvent être exprimés en utilisant des transformations linéaires. Dans le meilleur des cas, une seule transformation est suffisante mais l’existence de ∗, donc des réplications et des effondrements pose problème, par exemple : !HPF$ ALIGN A(i) WITH T(i,1) L’alignement peut être défini avec la transformation linéaire γ : ! γ : i 7→ i . 1 (3.1) Mais l’alignement suivant ne peut être représenté avec une unique transformation : !HPF$ ALIGN A(i) WITH T(i,*) La réplication impose l’utilisation d’une seconde transformation δ : γ : i 7→ i, δ : i j ! 7→ i. (3.2) Ainsi, l’alignement HPF sera représenté par : {J | J ∈ DT , γ(I) = δ(J)} = δ −1 (γ(I)). (3.3) I est un élément du tableau A aligné avec le template T . γ est la transformation qui défini la partie réplication de l’alignement. J est l’élément de T sur lequel est placé A(I) 3.2.2 Représentation formelle des distributions HPF Une distribution HPF consiste à sélectionner des éléments par blocs pour chaque dimension depuis un tableau pour les placer sur des éléments d’un tableau de destination. 38 CHAPITRE 3. DES LANGAGES À PARALLÉLISMES DE DONNÉES VERS MARTE Le tableau source est représenté par le template T et le tableau destination correspond à la grille de processeurs P . La selection des dimensions à distribuer est déterminée par la projection ρT . La taille des blocs pour une dimension donnée est déterminée en rapport avec le type de distribution, dans le cas d’une distribution par blocs, la taille sera donnée par le calcul suivant : & Timax − Timin + 1 (kT )i = Pimax − Pimin + 1 ' (3.4) Amin (respectivement Amax ) est le vecteur des bornes inférieures (respectivement supérieures) de A. kT est le vecteur contenant les tailles des blocs pour chaque dimension. Nous pouvons alors représenter une distribution avec la fonction suivante : πT (J) = P min + (ρT (J − T min ) ÷ kT )%(P max − P min + 1) 3.2.2.1 (3.5) Exemple !HPF$ PROCESSORS P(10,10) !HPF$ TEMPLATE T(n,m,p) !HPF$ DISTRIBUTE T(BLOCK,*,CYCLIC(k)) ONTO P Dans cet exemple, trois directives sont définies et déclarent : – une grille de processeurs bi-dimensionnelle P de dimensions {10,10} ; – un template tri-dimensionnel T de dimensions {n,m,p} ; – la distribution du template sur la grille de processeur : la première dimension de T sera distribuée par blocs sur la première dimension de P , la seconde dimension de T sera entièrement placée en mémoire et la troisième dimension de T sera distribuée de manière cyclique par blocs de k éléments sur la seconde dimension de P . Dans cet exemple, la projection ρT sera : j1 j2 7→ j3 j1 j3 ! La distribution se fait en blocs sur la première dimension et cycliquement sur la troisième dimension, ce sont donc les seules dimensions à être distribuée, la seconde dimension est placée en mémoire. Le vecteur kT sera : ! n 10 k La première dimension distribuée sera découpée en blocs de dimension distribuée sera découpée en blocs de k éléments. Ainsi la fonction de distributionπT sera : j1 j2 7→ j3 ! n 1 + ((j1 − 1) ÷ 10 )%10 1 + ((j3 − 1) ÷ k)%10 n 10 éléments, la seconde 3.3. MÉTHODOLOGIE DE CONSTRUCTION 3.3 39 Méthodologie de construction Dans [24], Boulet et al. ont illustré les mécanismes d’allocation et de distribution offerts par MARTE avec quelques exemples. Ils ont avancé le résultat selon lequel MARTE était suffisamment puissant pour exprimer toutes les distributions offertes par HPF. Nous propons une méthodologie de construction pour, à partir d’une distribution HPF, obtenir une distribution MARTE. Cette méthode est accompagnée de plusieurs exemples afin de clairement illustrer le processus. 3.3.1 Alignements Un alignement consiste à récupérer tous les éléments depuis un tableau source, pour les placer dans un tableau destination, n’ayant pas forcément la même forme. C’est exactement le rôle du concept de Reshape. Nous allons donc illustrer, à travers quelques exemples couvrant les différentes possibilités d’alignement offertes par HPF, la construction de Reshape à partir de ces derniers. 3.3.1.1 Exemples Formalisme visuel Nous utilisons un formalisme permettant d’illustrer graphiquement les alignements. En voici la description avec un exemple proposé sur la figure 3.3 : align A T F IG . 3.3 – Formalisme pour l’alignement Le tableau A à aligner est sur la gauche de la figure, le template T est sur la droite. Le tableau A et le template T sont de dimensions 2 x 2, chaque case du tableau A étant un élément. Dans cet exemple, le tableau A est constitué de trois éléments, chaque élément disposant d’une couleur particulière. L’élément rouge du tableau A, correspond au point de coordonnées (0,0), est aligné sur la case rouge du template T , correspondant au point de coordonnées (3,3). L’élément bleu du tableau A, correspondant au point de coordonnées (1,0), est aligné sur la case bleue du template T , correspond au point de coordonnées (1,0) et l’élément vert du tableau A, correspondant au point de coordonnées (1,0) est aligné sur la case verte du template T , correspondant au point de coordonnées (2,0). Alignement identité/implicite !HPF$ Template T(4,4) real A(4,4) !HPF$ ALIGN A(i,j) with T(i,j) Dans cet exemple, nous avons déclaré un template bi-dimensionnel T , nous avons également déclaré un tableau bi-dimensionnel de réels A que nous alignons sans modifications sur le template T : A(i, j) sera placé sur T (i, j). 40 CHAPITRE 3. DES LANGAGES À PARALLÉLISMES DE DONNÉES VERS MARTE align A T F IG . 3.4 – ALIGN A(i,j) with T(j,i) Forme du motif et espace de répétition L’alignement ne modifie pas le placement des éléments, nous pouvons donc effectuer une distribution en utilisant un seul bloc contenant tous les éléments du tableau A, ce qui ne nécessite qu’une seule opération. ! ! i 1 Forme du motif : , Espace de répétition : . j 1 Tiler origine Le tiler origine doit donc prendre tous les éléments de A. Sur la première dimension il faut donc récupérer i éléments ce qui implique que le pavage vaut i pour cette dimension, sur la seconde dimension, il faut récupérer j éléments ce qui implique que le pavage vaut j pour cette dimension. Les éléments sont pris de manière contiguë, l’ajustage vaut donc 1 pour chaque dimension. ! ! ! 0 1 0 i 0 Origine : , Matrice de pavage : , Matrice d’ajustage : . 0 0 1 0 j Tiler destination Nous voulons placer le tableau A exactement sur le template T sans aucune modification, avec le tiler source nous allons récupérer un bloc complet représentant A, il suffit donc de paver sur la première dimension i éléments et sur la seconde dimension j éléments, les éléments sont toujours contigus, l’ajustage vaut donc 1 sur chaque dimension. ! ! ! 0 1 0 i 0 Origine : , Matrice de pavage : , Matrice d’ajustage : . 0 0 1 0 j Alignement transposé !HPF$ Template T(4,4) real A(4,4) !HPF$ ALIGN A(i,j) with T(j,i) Dans cet exemple, le tableau A est aligné sur le template T en appliquant une transposée : l’élément A(i, j) sera placé sur l’élément T (j, i). Forme du motif et espace de répétition L’alignement transpose les éléments du tableau A, une manière possible d’effectuer l’alignement consiste à prendre les éléments de A par colonne, et de placer chaque colonne comme une ligne de T . Ainsi il faudra répéter l’opération pour chaque colonne, soit i fois pour la première dimension 1 fois pour la seconde dimension. ! ! 1 i Forme du motif : , Espace de répétition : . j 1 3.3. MÉTHODOLOGIE DE CONSTRUCTION 41 align A T F IG . 3.5 – ALIGN A(i,j) with T(j,i) Tiler source Le tiler source récupère les éléments de A par colonne, sur la première dimension le pavage vaut 1 et sur la seconde dimension le pavage vaut j. On récupère les éléments de manière contiguë sur la seconde dimension, l’ajustage vaut donc 1. ! ! ! 0 0 0 1 0 Origine : , Matrice d’ajustage : , Matrice de pavage : . 0 0 1 0 j Tiler destination Pour appliquer la transposer, le tiler destination doit donc placer les colonnes qu’il reçoit du tiler source sur les lignes de T . Les éléments sont contigus, l’ajustage vaut donc 1 pour les lignes. Au lieu de paver les colonnes, nous allons paver les lignes : le pavage vaut donc j sur la première dimension et 1 sur la seconde dimension. ! ! ! 0 1 0 j 0 Origine : , Matrice d’ajustage : , Matrice de pavage : . 0 0 1 0 1 Alignement avec effondrement !HPF$ Template T(4) real A(4,4) !HPF$ ALIGN A(i,*) with T(i) Dans cet exemple, le tableau A est aligné avec le template T en effondrant la seconde dimension de A, chaque élément A(i, j) sera placé sur l’élément T (i). align A T F IG . 3.6 – ALIGN A(i,*) with T(i) Forme du motif et espace de répétition Chaque colonne de A est effondrée et placée sur le template T , nous allons donc récupérer les éléments par colonnes donc des blocs de {1,j} éléments, opération qu’il faut répéter i fois relativement au nombre de colonnes. ! ! 1 i Forme du motif : , Espace de répétition : . j 1 42 CHAPITRE 3. DES LANGAGES À PARALLÉLISMES DE DONNÉES VERS MARTE Tiler source Le tiler source récupère les éléments de A par colonne, sur la première dimension le pavage vaut 1 et sur la seconde dimension le pavage vaut j. On récupère les éléments de manière contiguë sur la seconde dimension, l’ajustage vaut donc 1. ! ! ! 0 0 0 1 0 Origin : , Fitting matrix : , Paving matrix : . 0 0 1 0 j Tiler destination Chaque colonne est placé sur un élément de T , le pavage vaut donc 1 sur la première dimension, et l’ajustage vaut 0. ! 0 Origin : , Fitting matrix : 0 0 , Paving matrix : 1 0 . 0 Alignement avec réplication !HPF$ Template T(4,4) real A(4) !HPF$ ALIGN A(i) with T(i,*) Dans cet exemple, le tableau A est aligné avec le template T en utilisant la réplication, chaque élément A(i, j) sera placé sur l’élément T (i, j). align A T F IG . 3.7 – ALIGN A(i) with T(i,*) Forme du motif et espace de répétition Chaque élément du tableau A sera répliqué sur la colonne entière correspondante de T , on peut donc procéder récupérant la ligne entière de A et en la répliquant un nombre de fois valant le nombre de lignes sur le template T . ! ! i 1 , Espace de répétition : . Forme du motif : j 1 Tiler source Le tiler source récupère la ligne complète, le pavage vaut donc i et l’ajustage vaut 1. ! 0 Origine : , Matrice d’ajustage : 1 0 , Matrice de pavage : i 0 . 0 Tiler destination Le tiler destination doit donc répliquer chaque colonne qu’il reçoit sur toutes les lignes du template T . Le pavage vaut donc i sur la première dimension et 1 sur la seconde, les éléments étant contigus, l’ajustage vaut 1 sur les 2 dimensions. ! ! ! 0 1 0 i 0 Origine : , Matrice d’ajustage : , Matrice de pavage : . 0 0 1 0 1 3.3. MÉTHODOLOGIE DE CONSTRUCTION 3.3.2 3.3.2.1 43 Distribution Forme du motif La forme du motif est représentée par un vecteur dont la taille correspond au nombre de dimension du template T et pour lequel chaque composante du vecteur correspond au nombre d’éléments présents sur chaque dimension. Son calcul est exprimé par l’algorithme 1. Algorithm 1 Calcul de la forme du motif if distribution(i) = ∗ then mi = size(dimension(i)) else mi = (kT )i end if 3.3.2.2 Espace de répétition L’espace de répétition est un vecteur dont la taille correspond au nombre de dimensions du template T , chaque composante ri du vecteur est calculée avec : ri = 3.3.2.3 size(Ti ) (kT )i Tiler source Origine L’origine du tiler source correspond à l’origine du template T . Calcul de la matrice d’ajustage Pour chaque dimension di du template T , on associe un vecteur f calculé en fonction du type de distribution avec l’algorithme 2 Algorithm 2 Calcul de la matrice d’ajustage for i in dimensions(T ) do if distribution(i) = CY CLIC or BLOCK(1) then f =∅ else f = 0 · · · 0 and fi = 1 end if end for Calcul de la matrice de pavage Pour chaque dimension di du template T , on associe un vecteur f calculé suivant le type de distribution avec l’algorithme 3 3.3.2.4 Tiler destination Calcul de la matrice de pavage Pour chaque dimension di de la grille de processeur P , on associe un vecteur p dont 44 CHAPITRE 3. DES LANGAGES À PARALLÉLISMES DE DONNÉES VERS MARTE Algorithm 3 Calcul de la matrice de pavage p = 0 ··· 0 for i in dimensions(T ) do if distribution(i) = ∗ then pi = size(di ) else if di = CY CLIC then pi = 1 else if di = BLOCK then pi = (kT )i else di = CYCLIC(n) or BLOCK(n) andpi = n end if end for la taille correspond au nombre de dimension de di , de valeur nulle et pour lequel la composante pi vaut 1. Exemples : 1 0 0 1 0 Une dimension : 1 , Deux dimensions : , Trois dimensions : 0 1 0. 0 1 0 0 1 ! Calcul de la matrice d’ajustage La matrice d’ajustage est une matrice nulle dont le nombre de dimensions correspond au nombre de dimensions de P , chaque dimension ayant pour taille celle de la forme du motif. Exemple : Par exemple, si on a une grille de processeur P de dimensions {8,8} avec un motif de forme {2,2}, la matrice d’ajustage sera de dimension bidimensionnelle et chaque dimension sera de taille 2 : ! 0 0 0 0 3.4 Exemples Formalisme visuel Nous utilisons un formalisme permettant d’illustrer graphiquement les distribution. En voici la description avec un exemple proposé sur la figure 3.8 : Le template T à distribuer est sur la gauche de la figure, la grille de processeurs P est sur la droite. Le template T est de dimension 16 x 16 et la grille de processeurs P est de dimension 2 x 2, à chaque case du template T correspond un bloc de quatre éléments (2 x 2), une couleur est affectée à chaque blocs d’éléments. Chaque bloc de couleur est alloué sur le processeur ayant la même couleur. Les éléments du template appartenant au bloc rouge, correspondant aux points (0,0) - (1,0) - (0,1) et (1,1) sont placés sur le processeur de même couleur, même procédé pour les éléments des blocs vert et bleu. 3.4. EXEMPLES 45 16 12 4 3 distribute 8 2 1 4 0 0 4 8 12 1 3 2 4 16 T P F IG . 3.8 – Formalisme visuel pour la distribution 3.4.1 Distribution (*,block) !HPF$ PROCESSORS P(4) !HPF$ TEMPLATE T(256,256) !HPF$ DISTRIBUTE T(*, BLOCK) ONTO P Cet exemple montre la distribution d’un template bi-dimensionnel T sur un grille de processeur mono-dimensionnelle P . La première dimension est placée en mémoire tandis que la seconde dimension est distribuée par blocs sur l’unique dimension de P . La figure 3.9 illustre graphiquement cette distribution. 256 192 distribute 128 0 1 2 3 4 64 0 256 T P F IG . 3.9 – Distribution {*,block} : la première dimension du tableau est placée en mémoire et la seconde dimension est distribuée par blocs sur la grille de processeurs. 46 CHAPITRE 3. DES LANGAGES À PARALLÉLISMES DE DONNÉES VERS MARTE Distribution j1 j2 ρT : ! 7→ j2 kT : 64 πT : j1 j2 ! 7→ 1 + ((j2 − 1) ÷ 64)%4 Motif et espace de répétition : Avec des blocs de 256 éléments et un template avec 256 éléments sur la première dimension, l’opération doit être faite 1 fois. Avec des blocs de 64 éléments et un template de 64 éléments sur la seconde dimension, l’opération doit être faite 4 fois. Les blocs sont formés de 256 éléments sur la première dimension et de 64 éléments sur la seconde dimension. ! ! 256 1 Forme du motif : , Espace de répétition : . 64 4 Tiler source : Dans cet exemple, le template T est un tableau bi-dimensionnel. Le tableau source sera donc le template T , son origine sera l’origine de T . La première dimension est entièrement placée en mémoire par blocs de 256 éléments (distribution *) et la seconde dimension est distribuée par blocs de 64 éléments. Les blocs sont composés d’éléments contigus, l’ajustage vaut donc 1 sur chaque dimension. Le pavage vaut 256 sur la première dimension et 64 sur la seconde. ! ! ! 0 1 0 256 0 Origine : , Ajustage : , Pavage : . 0 0 1 0 64 Tiler destination : La grille de processeurs P est un tableau mono-dimensionnel. Le tableau de destination sera la grille P . Son origine sera l’origine de P . Les blocs seront distribués sur 1 élément de P à chaque fois. Le pavage vaut donc 1. Origine : 0 , Pavage : 1 0 , Ajustage : 0 0 . 3.4.2 Distribution (block, block) !HPF$ PROCESSORS P(4,4) !HPF$ TEMPLATE T(16,16) !HPF$ DISTRIBUTE T(BLOCK, BLOCK) ONTO P Cet exemple montre la distribution d’un template bi-dimensionnel sur une grille de processeurs bi-dimensionnelle. La première (resp. seconde) dimension est distribuée par blocs sur la première (resp. seconde) dimension de P . La figure 3.10 illustre graphiquement cette distribution. Distribution ρt : j1 j2 ! 7→ j1 j2 ! 3.4. EXEMPLES 47 16 12 4 3 distribute 8 2 1 4 0 0 4 8 1 2 3 4 16 12 T P F IG . 3.10 – Distribution {BLOCK,BLOCK} : les deux dimensions du tableau sont distribuées par blocs sur la grille de processeurs. kT : j1 j2 ! 4 4 ! ! 1 + ((j1 − 1) ÷ 64)%4 1 + ((j2 − 1) ÷ 4)%4 7→ Forme du motif et espace de répétition : La première dimension est distribuée par blocs de 64 éléments et le template en compte 256, l’opération doit donc être répétée 4 fois. La seconde dimension est également distribuée par blocs de 64 éléments et me template en compte 256, l’opération doit donc être répétée 4 fois. Le motif et l’espace de répétition sont donc : ! ! 64 4 Motif : , Espace de répétition : . 64 4 Tiler source : Dans cet exemple, le template T est un tableau bi-dimensionnel. Le tableau source sera donc T , son origine sera l’origine de T . La première dimension est distribuée par blocs de 64 éléments et la seconde dimension est également distribuée par blocs de 64 éléments, le pavage vaut donc 64 sur chaque dimension. Les éléments sont contigus, l’ajustage vaut donc 1 sur chaque dimension. ! ! ! 0 1 0 64 0 Origine : , Ajustage : , Pavage : . 0 0 1 0 64 Tiler destination : La grille de processeurs P est un tableau bi-dimensionnel. Le tableau destination sera P , 48 CHAPITRE 3. DES LANGAGES À PARALLÉLISMES DE DONNÉES VERS MARTE son origine sera celle de P et chaque processeur de P recevra un bloc d’éléments. le pavage vaut donc 1 sur chaque dimension. ! ! ! 0 1 0 0 0 Origine : , Pavage : , Ajustage : . 0 0 1 0 0 3.4.3 Distribution (cyclic, cyclic) !HPF$ PROCESSORS P(16,16) !HPF$ TEMPLATE T(256,256) !HPF$ DISTRIBUTE T(CYCLIC(2), CYCLIC(8)) ONTO P Cet exemple montre la distribution d’un template bi-dimensionnel sur une grille de processeurs bi-dimensionnel. La première dimension de T est distribuée sur la première dimension de P de manière cyclique en utilisant des blocs de 2 éléments, la seconde dimension de T est distribuée de manière cyclique en utilisant des blocs de 8 éléments. La figure 3.11 illustre graphiquement cette distribution. 256 16 24 distribute 16 3 2 1 8 0 0 2 4 6 1 2 3 16 256 T P F IG . 3.11 – Distribution {CYCLIC(2),CYCLIC(8)} : les deux dimensions du tableau sont distribuées par blocs de deux et huit éléments et de manière cyclique. Distribution ρt : j1 j2 ! 7→ j1 j2 ! ! kT : j1 j2 ! 7→ 2 8 1 + ((j1 − 1) ÷ 2)%4 1 + ((j2 − 1) ÷ 8)%4 ! 3.4. EXEMPLES 49 Forme du motif et espace de répétition : La première dimension de T est distribuée cycliquement par blocs de 2 éléments tandis que le template en contient 256, l’opération doit donc être répétée 128 fois. La seconde dimension de T est distribuée cycliquement par blocs de 8 éléments tandis que le template en contient 256, l’opération doit donc être répétée 32 fois. Le motif et l’espace de répétition associés sont donc : ! ! 2 128 Motif : , Espace de répétition : . 8 32 Tiler source : Dans cet exemple, le template T est un tableau bi-dimensionnel, le tableau source sera donc T , son origine sera l’origine de T . La première dimension est distribuée de manière cyclique par blocs de 2 éléments, le pavage vaut donc 2 sur cette dimension. La seconde dimension est distribuée de manière cyclique par blocs de 8 éléments, le pavage vaut donc 8 sur cette dimension. Les éléments étant contigus, l’ajustage vaut 1 pour chaque dimension. ! ! ! 0 1 0 2 0 Origine : , Ajustage : , Pavage : . 0 0 1 0 8 Tiler destination : La grille de processeurs P est un tableau bi-dimensionnel. Le tableau destination sera P , son origine sera celle de P et chaque processeur de P recevra un bloc d’éléments. le pavage vaut donc 1 sur chaque dimension. ! ! ! 0 1 0 0 0 Origine : , Pavage : , Ajustage : . 0 0 1 0 0 3.4.4 Distribution (block, *, block) !HPF$ PROCESSORS P(16,16) !HPF$ TEMPLATE T(256,256,256) !HPF$ DISTRIBUTE T(BLOCK,*,BLOCK) ONTO P Cet exemple montre la distribution d’un template tri-dimensionnel T sur une grille de processeurs bi-dimensionnelle P . La première dimension de T est distribuée par blocs sur la première dimension de P , la seconde dimension de T est placée en mémoire et la troisiéme dimension de T est distribuée par blocs sur la seconde dimension de P . La figure 3.12 illustre graphiquement cette distribution. Distribution j1 j1 j3 ρt : j2 → 7 j3 ! kT : 16 16 ! 50 CHAPITRE 3. DES LANGAGES À PARALLÉLISMES DE DONNÉES VERS MARTE 16 256 distribute 2 1 0 16 1 2 16 0 16 32 48 256 T P F IG . 3.12 – Distribution {BLOCK,*,BLOCK} : la première dimension du tableau est distribuée par blocs sur la première dimension de P , la seconde dimension est placée en mémoire et la troisième dimension est distribuée par blocs sur la seconde dimension de P. j1 j2 7→ j3 ! 1 + ((j1 − 1) ÷ 16)%16 1 + ((j3 − 1) ÷ 16)%16 Motif et espace de répétition : La première dimension de T est distribuée par blocs de 16 éléments tandis que le template en contient 256, l’opération doit donc être répétée 16 fois. La seconde dimension de T est placée en mémoire, cela représente donc un bloc de 256 éléments, l’opération ne doit être faite qu’une fois. La troisième dimension est distribuée par blocs de 16 éléments tandis que le template en contient 256, l’opération doit donc être répétée 16 fois. Le motif et l’espace de répétition sont donc : 16 16 PatternShape : 256, RepetitionSpace : 1 . 16 16 Source tiler : Dans cet exemple, le template T est une tableau tri-dimensionnel. Le tableau source sera le T , son origine sera également l’origine de T . La première dimension est distribuée par blocs de 16 éléments, le pavage vaut donc 16 pour cette dimension. La seconde est placée en mémoire, le pavage vaut donc 256 pour cette dimension.La troisième est distribuée par blocs de 16 éléments, le pavage vaut donc 16 pour cette dimension. Les éléments étant contigus, l’ajustage vaut 1 pour chaque dimension. 3.5. CONCLUSION 51 16 0 0 1 0 0 0 Origine : 0, Ajustage : 0 1 0, Pavage : 0 256 . 0 0 64 0 0 1 0 Destination tiler : La grille de processeurs P est un tableau bi-dimensionnel. Le tableau destination sera P , son origine sera celle de P et chaque processeur de P recevra un bloc d’éléments. le pavage vaut donc 1 sur chaque dimension. ! ! ! 0 1 0 0 0 Origine : , Pavage : , Ajustage : . 0 0 1 0 0 3.5 Conclusion Nous avons donc montré, par l’intermédiaire d’une méthodologie de construction, que Marte, avec son mécanisme d’allocation et de distribution adapté aux structures répétitives, était capable d’exprimer toutes les distributions offertes par HPF. Les concepts manipulés par les nouveaux langages à parallélisme de données tels Fortress, Chapel ou X10 et relatifs aux distributions peuvent se ramener à la manipulation de structure tabulaire. Dans le cas de Chapel, on a montré par l’intermédiaire de HPF, sur lequel il est en partie basé, que c’était le cas, pour ce qui est de la distribution general tiling distribution permettant de partitionner un ensemble multidimensionnel pour obtenir des sous domaines rectangulaires que l’on appelle tuiles, le parallèle évident avec les concepts de MARTE ne laisse pas trop de doute sur la capacité de ce dernier à les gérer.Pour Fortress, les distributions sequential, par et blocked sont supportées par MARTE., en revanche la distribution subdivided consistant à découper en deux morceaux et de manière récursive l’espace d’adressage ne semble pas être exprimable. Enfin, pour X10, les distributions, concernant des ensembles de points multidimensionnels, peuvent être de type block ou cyclic, familles de distribution prises en charge par MARTE. 52 CHAPITRE 3. DES LANGAGES À PARALLÉLISMES DE DONNÉES VERS MARTE Chapitre 4 Validation d’un placement Gaspard2 Sommaire 4.1 4.2 4.3 Allocations . . . . . . . . . . . . . . . . . . . . . . 4.1.1 Allocations répétitives . . . . . . . . . . . . 4.1.2 Allocations hiérarchiques . . . . . . . . . . 4.1.3 Ordonnancement . . . . . . . . . . . . . . . Critères de validation d’un modèle d’association 4.2.1 Critère de complétude . . . . . . . . . . . . 4.2.2 Critère de cohérence . . . . . . . . . . . . . Outil de vérification d’un placement . . . . . . . 4.3.1 Approches envisagées . . . . . . . . . . . . 4.3.2 Plugin de validation Gaspard2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 54 56 59 60 61 61 62 62 65 avons vu, qu’au travers des différents concepts apportés dans le méta-modèle Gaspard, nous étions capable d’exprimer un grand nombre de placement de natures différentes. Cependant, parmi tous ces placements, un certain nombre se révèle incorrect, car étant non complètement spécifiés ou non cohérents. N OUS Dans ce chapitre, nous proposons, d’une part des évolutions afin d’étendre le métamodèle Gaspard permettant de rendre moins ambiguë et plus aisée l’expression d’allocations entre application et plateforme d’exécution et, d’autre part un outil sous la forme d’une extension de l’outil Gaspard2 permettant de s’assurer du caractère correct d’une association. 4.1 Allocations Les performances des systèmes parallèles sont directement liées à l’équilibrage de charge entre les différentes unités de calcul du système. Pour ce faire, il est nécessaire de distribuer de manière équitable les différentes répétitions des tâches de l’application sur les processeurs. Selon la distribution, la localité des données sera plus ou moins différente, imposant davantage de communications et réduisant le gain en performance dans le cas de faible localité. La distribution optimale d’une tâche est relative à la distribution des données et à la distribution des différentes tâches. Pour s’en approcher, il est donc nécessaire de disposer des outils permettant d’exprimer les distributions avec le plus de précision possible et le moins d’ambiguïté. 53 54 CHAPITRE 4. VALIDATION D’UN PLACEMENT GASPARD2 Le mécanisme d’allocation apporté par le méta-modèle Gaspard permet d’associer une partie de l’application avec une partie de l’architecture matérielle. Cependant la syntaxe actuelle peut introduire une sémantique ambiguë rendant l’expression d’une association correcte plus difficile. Plusieurs aspects sont concernés et nous allons les développer dans la suite de cette section. 4.1.1 Allocations répétitives Les concepts apportés permettant de présenter de manière compacte des systèmes possédant une structure répétitive régulière représentent le point fort du méta-modèle Gaspard. Une Shape permet, dans un premier temps, de définir une multiplicité sur un composant, spécifiant le nombre de répétitions de ce dernier. Dans un second temps, un Tiler permet de construire des liens entre deux composants répétés, spécifiant le partage d’un ensemble d’éléments d’un tableau. Enfin, un Reshape permet de lier directement et d’une certaine manière deux composants répétés. 4.1.1.1 Distributions Les notions de TaskAllocation et de DataAllocation ont été étendues afin de prendre en charge les composants répétitifs. Cette extension passe par l’utilisation conjointe d’une Allocation et d’un Reshape pour former ce que l’on appelle une Distribution. Une Distribution désigne le placement d’un composant répété de l’application sur un ensemble de composants matériels répétés. C’est un concept clé dans l’exploitation du parallélisme des applications et des architectures matérielles représentées de manière compacte permettant d’exprimer la parallélisation d’une tâche sur un ensemble de processeurs identiques et la répartition des tableaux de données sur un ensemble de bancs mémoire. Plus précisément, dans le cas d’une TaskAllocation distribuée, cela indique quel processeur exécutera chaque répétition de la tâche et dans le cas d’une DataAllocation distribuée, cela indique quels éléments d’un tableau d’éléments seront placés sur quelle répétition d’une mémoire. Les répétitions peuvent être multidimensionnelles sans contrainte d’avoir des dimensions égales. Il est également possible d’associer une répétition d’un composant de l’application à plusieurs répétitions d’un composant de l’architecture matérielle, ce qui présente un intérêt dans un but de réduction des communications par exemple, en répliquant les données sur toutes les mémoires locales des processeurs. Rappelons qu’une Distribution est composée de deux Tilers, d’un PatternShape et d’un RepetitionSpace. Chaque élément du tableau de sortie, relatif à l’architecture matérielle, peut être associé à zéro, un ou plusieurs éléments du tableau d’entrée, relatif à l’application. Toutes les distributions classiques, rencontrées dans les langages du domaine du calcul haute performance, sont exprimables. 4.1.1.2 Exemples de distribution Nous allons illustrer cette notion de distribution à l’aide d’une application de calcul matriciel. La partie application est modélisée sur la figure 4.1. Elle contient une instance appli de AplusB qui lit deux matrices de 128 x 128 éléments et génère une matrice de sortie de 128 x 128 éléments, résultat de la somme des deux matrices d’entrée. La tâche qui effectue l’addition est décomposée en une répétition de 16 x 16 instances de Sum. Chaque répétition de la tâche travaille sur des motifs de 8 x 8 éléments. C’est cette répétition qui 4.1. ALLOCATIONS 55 sera distribuée sur l’architecture matérielle. F IG . 4.1 – Une application permettant de calculer la somme de deux matrices carrées de dimension 128x128. L’architecture matérielle modélisée sur la figure 4.2 représente un système sur puce multiprocesseur composé d’une grille de 4 x 4 unités de calcul (ProcessingUnit). Chaque instance de l’unité de calcul est reliée à quatre autres instances par l’intermédiaire des ports n, s, e et w et de liens InterRepetition pour former une grille torique. Chaque ProcessingUnit est composée d’un processeur, d’une mémoire et d’un crossbar pour la gestion des communications. La figure 4.3 présente une distribution par blocs concernant les deux dimensions de l’instance de l’application sum. Chaque processeur de chaque unité de calcul va traiter un bloc de 4 x 4 répétitions de la tâche, information donnée par la valeur du PatternShape. Le pavage fait en sorte que les différents blocs ne se recouvrent pas : un élément d’un bloc ne se retrouvera pas dans un autre bloc. Enfin le RepetitionSpace assure que l’ensemble du tableau est recouvert. Chaque unité de calcul [i, j] se chargera d’exécuter les seize instances comprises dans l’interval allant de [i x 4, j x 4] à [i x 4 + 3, j x 4 + 3]. La figure 4.4 présente une distribution cyclique de chaque dimension de l’instance de l’application sum. Chaque processeur va traiter un bloc de Y x Y répétitions de sum. Le PatternShape vide indique que chaque motif ne contient qu’un seul élément. Le modulo permet de revenir sur le premier processeur de la dimension quand la dimension a été entièrement parcourue. Chaque processeur [i, j] exécutera les 16 instances de [p x 4 + i, q x 4 + j], p et q étant des entiers compris entre 0 et 15. La figure 4.5 modélise une distribution de données. Le tableau présent sur m2, de 56 CHAPITRE 4. VALIDATION D’UN PLACEMENT GASPARD2 F IG . 4.2 – Une architecture matérielle, composée d’une grille de 16 unités de calcul, chacune dotée d’un bus d’interconnexion, d’une mémoire et d’un processeur. dimensions 128 x 128, est distribué sur l’ensemble des unités de calcul présentes sur l’architecture matérielle. Sur chacune d’entre elles est alloué un bloc de données contenant 32 x 32 éléments. La distribution se fait par blocs sur les deux dimensions. Nous avons, à travers ces quelques exemples, illustré le fait que la notion de distribution permet une grande expressivité de l’association sur l’architecture et ce en adoptant une syntaxe très compacte et élégante. Cependant, dans le cadre de modèles complexes, cette liberté d’expression sera la source d’erreurs dans le modèle d’association. Nous allons dans la section suivante présenter quelques situations portant à confusion et proposer une solution permettant de les éviter. Puis nous proposerons un outil permettant de tester le caractère correct d’une association vis à vis d’une application et d’une architecture matérielle. 4.1.2 Allocations hiérarchiques Il n’y pas de règle particulière pour effectuer une association entre tâches et données, le développeur est libre de choisir l’allocation des tâches et des données. Il n’y a pas de restriction entre le placement de données sur des mémoires et le placement sur des processeurs des tâches qui utilise ces données. De cette grande liberté résultent des placements qui ne sont pas corrects ne permettant pas d’obtenir un code de simulation fonctionnel. 4.1. ALLOCATIONS 57 F IG . 4.3 – Placement complet d’un ensemble de tâches sur la grille de processeurs, toutes les tâches sont associées à un processeur. F IG . 4.4 – Placement complet d’un ensemble de tâche sur la grille de processeurs, toutes les tâches sont associées à un processeur. 58 CHAPITRE 4. VALIDATION D’UN PLACEMENT GASPARD2 F IG . 4.5 – Distribution de données, le tableau présent sur le port m2 est alloué par bloc de 32 x 32 éléments sur chaque unité de calcul de la plateforme d’exécution. La figure 4.6 illustre un exemple d’allocation hiérarchique. L’application est composée de deux tâches t1 et t2, chaque tâche étant elle-même composée de deux d’une tâche producteur et d’une tâche consommateur. On cherche à placer cette application sur une architecture composée de deux unités de calcul bp1 et bp2 possédant chacune deux processeurs p1 et p2. On souhaite définir un placement particulier en plaçant les différentes sous-tâches sur un processeur particulier de la plateforme d’exécution, à savoir : le producteur p de la tâche t1 sur le processeur p1 de l’unité de calcul bp1, le consommateur c de la tâche t1 sur le processeur p2 de l’unité de calcul bp2, le producteur p de la tâche t2 sur le processeur p2 de l’unité de calcul bp1 et le consommateur de la tâche t2 sur le processeur p2 de l’unité de calcul bp2. On constate, que la spécification de tels placements est rendue difficile et sa mise en oeuvre est plutôt laborieuse. En effet, si cela reste raisonnable avec notre exemple, imaginer des placements concernant des applications et des architectures plus complexes deviendrait très vite fastidieux. Rappelons que le modèle d’allocation s’inspire du modèle proposé par SysML, néanmoins dans la mise au point du modèle d’allocation de MARTE, il a été décidé de ne pas conserver la notion de table d’allocation, concept permettant de spécifier, à l’intérieur d’un tableau, les différentes allocations et les éléments source et cible qui sont concernés. Cette notation permet de garder les modèles visuels suffisamment lisibles et permet de lever plus facilement une possible ambiguïté. La figure 4.7 reprend l’application précédente, en ayant remplacé toutes les allocations avec une table d’allocation. On y gagne donc en lisibilité tout en permettant au développeur de préci- 4.1. ALLOCATIONS 59 F IG . 4.6 – TODO. ser avec moins de risques d’erreur des allocations hiérarchiques complexes. Nous avons donc proposé le retour de cette notion dans le modèle, nous nous sommes cependant fait devancés par les développeurs de MARTE qui ont récemment décidés de la réintroduction de cette notion. 4.1.3 Ordonnancement Un second point pouvant facilité des ambiguïtés et donc des erreurs concerne la notion d’ordonnancement. La figure 4.8 illustre un exemple d’association faisant intervenir la notion d’ordonnancement. L’application est constituée de quatre tâches, l’architecture comporte un processeur et on souhaite distribuer les quatre tâches sur ce processeur en leur imposant un ordre d’exécution particulier. Pour ce faire, on utilise la notion de orderDependancy, néanmoins si pour cet exemple, cela reste eexploitable, comment sur un modèle plus complexe, donc faisant intervenir potentiellement plus de tâches, apporter une syntaxe plus élégante permettant de conserver une certaine lisibilité dans le modèle ? En lieu et place de la notion d’orderDependancy, nous pourrions introduire un nouveau stéréotype du même nom, applicable à un processeur afin de préciser un ordre d’exécution des différentes tâches allouées sur ce dernier. Ce stéréotype contiendrait une tagged value contenant, sous forme d’une chaîne de caractère, la liste ordonnées des tâches à exécuter. 4.9. 60 CHAPITRE 4. VALIDATION D’UN PLACEMENT GASPARD2 F IG . 4.7 – TODO. F IG . 4.8 – TODO. 4.2 Critères de validation d’un modèle d’association Reprenons notre exemple d’addition de matrices. Nous avons d’une part défini le modèle d’application faisant la somme de deux matrices et d’autre part le modèle d’architecture matérielle qui accueillera cette application. Ce qui nous intéresse ici, c’est l’étape d’association entre les deux modèles. Le but étant d’aboutir à un code de simulation fonctionnel, il est donc nécessaire de s’assurer du caractère valide de l’association. Cette vérification peut se dérouler suivant deux étapes : la vérification du caractère complet de l’association et la vérification du caractère cohérent de l’association. 4.2. CRITÈRES DE VALIDATION D’UN MODÈLE D’ASSOCIATION 61 F IG . 4.9 – TODO. 4.2.1 Critère de complétude Avec ce critère de complétude de l’association, on cherche à s’assurer de la propriété suivante : chaque tâche élémentaire du modèle d’association doit être associée à au moins une unité de calcul du modèle d’architecture avec une TaskAllocation, et chaque donnée présente dans le modèle d’association doit être allouée sur au moins une mémoire du modèle d’architecture à l’aide d’une DataAllocation. Si ces deux règles sont respectées, cela signifie, en considérant l’application sous la forme d’un arbre, que pour chaque feuille correspondant à une tâche, il y aura au moins un processeur qui sera chargé de son exécution et que chaque donnée sera stockée dans au moins une mémoire. À noter qu’en ce qui concerne les tâches, l’allocation peut être directe ou indirecte : une tâche peut être allouée indirectement par une tâche de niveau supérieur dans l’arborescence. La figure 4.10 illustre un exemple de placement incomplet. L’application est toujours la même : c’est l’addition de matrices modélisée à la figure 4.1 exécutée sur l’architecture présentée sur la figure 4.2. L’association de l’application et de l’architecture matérielle se fait à l’aide d’une distribution par bloc sur les deux dimensions de l’instance sum. Il y a 16 x 16 répétitions de l’instance sum qui seront distribuées sur la grille comprenant 4 x 4 unités de calcul par blocs de 4 x 4 tâches. 4.2.2 Critère de cohérence Si le critère de complétude nous assure que chaque tâche sera placée sur au moins un processeur et chaque donnée allouée sur au moins une mémoire, il n’est pas suffisant pour garantir le bon fonctionnement de l’application. C’est pourquoi, avec ce critère de cohérence de l’association, on cherche à s’assurer du bon fonctionnement de l’application. Toutes les tâches de l’application doivent pouvoir s’exécuter normalement, l’ordonnancement doit donc être valide. Si les tâches ont besoin d’utiliser des données, ces dernières doivent être placées sur des mémoires accessibles pour la tâche. Des données différentes ne doivent pas se recouvrir, le placement des communications doit être en accord avec les besoins des tâches. 62 CHAPITRE 4. VALIDATION D’UN PLACEMENT GASPARD2 F IG . 4.10 – Placement incomplet d’un ensemble de tâche sur la grille de processeurs, l’espace de répétition ne permettant pas de distribuer l’intégralité des tâches de l’application. La figure 4.11 illustre un exemple de placement complet mais incohérent. L’application est constituée de deux tâches, comprenant chacune un producteur et un consommateur. L’architecture matérielle est composée de deux unités de calcul, chaque unité étant composé de deux processeurs. 4.3 4.3.1 Outil de vérification d’un placement Approches envisagées La seconde partie de ces travaux concerne la mise en œuvre d’un outil nous permettant, pour une association donnée, de nous assurer que celle-ci est correcte, à savoir que les critères de complétude et de cohérence que nous avons présentés sont respectés. Pour ce faire, cet outil utilisera les modèles générés pendant le processus, plus particulièrement les modèles d’application, d’architecture et surtout d’association. Plusieurs approches se sont offertes à nous pour réaliser cet outil de vérification. Parmi les nombreuses approches possibles, nous en avons retenu deux. Nous présenterons d’abord l’approche basée sur OCL puis l’approche reposant sur SynDex. 4.3.1.1 OCL Présentation OCL [25] (Object Constraint Language) est un langage formel pour l’expression de contraintes standardisé par l’OMG, ces contraintes s’appliquent à des mo- 4.3. OUTIL DE VÉRIFICATION D’UN PLACEMENT 63 F IG . 4.11 – Placement incohérent. dèles UML qui ne sont pas capables, seuls, de spécifier complètement une application. OCL apporte les outils pour exprimer des contraintes de deux types : les invariants qui sont des contraintes devant être respectées en permanence et les pré/post conditions, les préconditions représentent des contraintes devant être vérifiées avant l’exécution et les postconditions représentent des contraintes devant être vérifiées après l’exécution. OCL supporte également les opérations sur les ensembles et la logique des prédicats. La contrainte suivant illustre un exemple. Cette dernière exprime le fait qu’un composant de type GaspardComponent ne peut contenir que des parts typée par un composant stéréotypé à l’aide de GaspardComponent. inv : self.part->exists(p|p.stereotype->exists(name=’GaspardComponent’)) Vérificateur de contraintes OCL de Gaspard2 Il est également intéressant de noter qu’un outil de vérification de contraintes OCL pour les modèles Gaspard2 est actuellement développé au sein de l’équipe. Dans sa version actuelle, cet outil, appelé GaspardValidation, apporte des contraintes sur la syntaxe et la sémantique des modèles d’architecture et d’application. Une mémoire ne peut pas contenir un processeur par exemple. L’idée est donc d’étendre ce vérificateur, afin d’y ajouter nos propres contraintes à vérifier sur le modèle d’association entre un modèle architecture et un modèle d’application. Limitations Les contraintes OCL ne nous permettront finalement pas de mettre en œuvre un outil permettant de faire une vérification complète de la spécification d’une association entre application et architecture matérielle. En effet, s’il est possible de vérifier des 64 CHAPITRE 4. VALIDATION D’UN PLACEMENT GASPARD2 contraintes relativement simple comme l’association d’un composant simple sur une partie de l’architecture, OCL ne se révèle pas assez puissant ni expressif pour spécifier des contraintes plus complexes mettant en œuvre les notions de hiérarchie, de multiplicités ou les concepts intervenants dans les processus de distribution. Alors que la vérification syntaxique est complètement prise en charge par OCL, le côté vérification sémantique ne l’est pas entièrement. 4.3.1.2 SynDEx Présentation SynDEx [26] est un logiciel de CAO (Conception Assistée par Ordinateur) niveau système. Il est fondé sur la méthodologie « Adéquation Algorithme Architecture » [27] (AAA) et a été conçu pour le prototypage rapide et pour l’optimisation d’applications distribuées temps réel embarquées. Il permet de spécifier l’algorithme d’application et l’architecture basé sur des composants, d’exprimer une adéquation correspondant à une implantation optimisée de l’algorithme d’application sur l’architecture et le résultat est une simulation temporelle de l’exécution du premier cité sur le second. SynDEx permet la génération automatique d’un exécutif temps réel dédié pour chaque processeur, ces exécutifs étant produits à partir de bibliothèques de noyaux d’exécutifs extensibles et portables dépendant des processeurs de l’architecture. L’idée est d’utiliser les outils proposés par SynDEx pour tester notre association, il faut donc effectuer une transformation du modèle Gaspard2 vers le modèle de SynDEx. Limitations Cependant, cette transformation n’est pas possible en l’état en raison de certaines limitations du modèle de SynDEx. En effet, plusieurs aspects du modèle Gaspard ne sont pas pris en charge. Au niveau des modèles d’architecture, il n’y a pas de support de la hiérarchie ni de support des répétitions. En ce qui concerne les modèles d’application, seules les répétitions monodimensionnelles sont supportées ainsi que les aspects hiérarchiques, tout en présentant une certaine lacune. Si on prend un exemple d’application hiérarchique avec un grand nombre de niveaux, SynDEx peut se comporter de deux manières : soit il considère la tâche hiérarchique comme un tout et ne regarde pas ce qui la compose, soit il déroule les niveaux un par an et dans le cadre d’un placement, il réfléchira pour placer les éléments un par un. Pour être capable de transformer le modèle Gaspard afin de le rendre utilisable par SynDEx, il est donc nécessaire d’effectuer une modification au niveau du modèle afin de le rendre compatible. Mise à plat du modèle Gaspard2 Afin de rendre le modèle de Gaspard2 exploitable avec SynDEx, la première étape consiste à « supprimer » les notions ne pouvant être prises en charge. C’est un travail qui a été effectué durant l’été 2007 et qui a consisté à « mettre à plat » le modèle Gaspard2. Les notions de hiérarchie et de répétition au niveau du modèle d’architecture ont été supprimées. Transformation du modèle mis à plat Une fois le modèle « aplati », il ne reste plus qu’à le transformer vers un modèle SynDEx. Ce travail de transformation vient d’être réalisé par un étudiant de maîtrise dans le cadre d’un stage filé. Il serait donc intéressant de creuser davantage dans cette direction afin d’étudier les gains que l’on pourrait retirer de l’utilisation de SynDEx. 4.3. OUTIL DE VÉRIFICATION D’UN PLACEMENT 4.3.2 65 Plugin de validation Gaspard2 Présentation Nous avons donc décidé de définir notre propre outil de validation à intégrer dans l’environnement Gaspard2. Cet environnement est basé autour d’Eclipse [28] et fonctionne en tant qu’application autonome. Nous avons donc décidé d’étendre l’environnement en lui greffant un « plug-in » permettant de tester l’association entre une application et une architecture. En tant qu’application Eclipse, notre validateur est donc un programme Java. La développement d’un « plug-in» est facilité par les outils et la structure même d’Eclipse : Eclipse se révèle en fait être un noyau offrant un grand nombre de points d’extensions, entité faisant office de point d’ancrage destiné à accueillir des extensions. Fonctionnement L’environnement Gaspard2 permet, à partir d’un modèle qu’on lui fournit en entrée, d’effectuer de manière successive un certain nombre de transformation, dans le but d’obtenir au final un code de simulation. F IG . 4.12 – Un modèle vu avec Gaspard2 Son fonctionnement est le suivant : à partir d’un modèle d’entrée conforme, modélisé au préalable à l’aide d’un modeleur UML comme Papyrus ou MagicDraw, on effectue une transformation vers un autre modèle. Dans notre cas ça sera le modèle Gaspard, cette transformation UML2ToG2 génère à partir du modèle d’entrée, plusieurs modèles de Gaspard2 (figure 4.13 : Application, Architecture, Association etc. Ces trois modèles sont justement les modèles qui nous intéressent dans le cadre du plugin : Toutes les associations sont donc inscrites dans le fichier asso.gaspard2, nous avons donc fait en sorte d’ajouter un bouton Association Validation nous permettant d’invoquer l’action de vérification de l’association et de le rendre actif lorsque l’on sélectionne ce modèle d’association. Techniquement parlant, nous avons créé une extension qui se greffe sur deux points d’extension : l’un pour le démarrage automatique du «plug-in» et l’autre permettant de spécifier le comportement à adopter lorsque l’on sélectionne un fichier ayant pour nom asso.gaspard2. 66 CHAPITRE 4. VALIDATION D’UN PLACEMENT GASPARD2 F IG . 4.13 – Résultat de la transformation UML2ToG2 Le programme est organisé par l’intermédiaire de trois paquetages que sont association, complete et consistent. Le paquetage association contient le squelette nécessaire au bon fonctionnement du programme, le paquetage complete s’occupe des spécificités liées à la vérification de la complétude et le paquetage consistent s’occupe des notions de cohérence. F IG . 4.14 – L’organisation en paquetage Fonctionnalités manquantes Dans sa version actuelle, l’outil supporte la vérification d’un placement vis à vis de son critère complet : le «plug-in» vérifie que toutes les tâches concernées par une allocation sont effectivement placées et que les données consommées par les tâches sont placées sur au moins une mémoire. L’outil est toujours en développement afin de compléter la validation vis à vis du critère de cohérence : données placées à des endroits accessibles, ordonnancement correct des tâches etc. À noter que nous n’avons pas pris en charge la gestion des communications. Exemple d’utilisation Nous terminons la présentation de l’outil avec deux exemples d’utilisation. Nous allons utiliser un modèle correspond à une application et une architecture que nous avons déjà présenté précédemment : l’application effectue une addition de deux matrices de dimension 128 x 128 à l’aide d’une répétition d’une tâche élémentaire travaillant sur deux matrices de dimension 8 x 8. L’architecture est composée d’une grille de 4 x 4 unités de calcul. Le placement correspond à une distribution par blocs de 4 x 4 tâches sur l’architecture. Dans cet exemple on vérifie que toutes les tâches sont effectivement placées sur au moins un processeur, notre exemple étant correct, le résultat de la vérification nous informe de la validité de l’association(figure 4.15. Pour le second exemple, nous allons conserver la même application et la même architecture, nous allons seulement opérer une modification au niveau de l’association. Nous 4.3. OUTIL DE VÉRIFICATION D’UN PLACEMENT 67 F IG . 4.15 – Validation réussie d’un placement allons volontairement oublier de prendre en compte un certain nombre de tâche dans la distribution : la dernier bloc de la première dimension ne trouvera donc pas de processeur pour s’exécuter. Le résultat de la validation est présent sur la figure 4.16. F IG . 4.16 – Validation échouée d’un placement 68 CHAPITRE 4. VALIDATION D’UN PLACEMENT GASPARD2 Chapitre 5 Conclusion ODO contrib démo T contrib méthodo contrib gaspard perspective 69 70 CHAPITRE 5. CONCLUSION Bibliographie [1] D. D. Gajski and R. Kuhn. Guest editor introduction : New VLSI-tools. 16(12) :11–14, December 1983. [2] Hubert Tardieu, Arnold Rochfeld, and René Colletti. La Méthode Merise : Principes et outils. Editions d’Organisation, 1991. [3] Malcon Eva. SSADM Version 4 : A User’s Guide. McGraw-Hill Publishing Co, April 1994. [4] Object Management Group, Inc., editor. UML 2 Infrastructure (Final Adopted Specifcation). http://www.omg.org/cgi-bin/doc?ptc/2003-09-15, September 2003. [5] Eclipse Consortium. EMF. http://www.eclipse.org/emf, 2007. [6] Object Management Group, Inc. MOF meta object facility, specification, version 1.3. http://www.omg.org/cgi-bin/doc?formal/00-04-03, January 2000. [7] Tom Mens, Krzysztof Czarnecki, and Pieter Van Gorp. A taxonomy of model transformations. In Jean Bezivin and Reiko Heckel, editors, Language Engineering for Model-Driven Software Development, number 04101 in Dagstuhl Seminar Proceedings. Internationales Begegnungs- und Forschungszentrum (IBFI), Schloss Dagstuhl, Germany, 2005. http://drops.dagstuhl.de/opus/volltexte/2005/11. [8] Object Management Group, Inc., editor. SysML v0.9. http://www.omg.org/ cgi-bin/doc?ad/05-01-03, January 2005. [9] Object Management Group, Inc., editor. UML Profile for Modeling and Analysis of Real-Time and Embedded systems (MARTE) RFP. http://www.omg.org/cgi-bin/ doc?realtime/2005-02-06, February 2005. [10] Object Management Group, Inc., editor. (UML) Profile for Schedulability, Performance, and Time Version 1.1. http://www.omg.org/technology/documents/ formal/schedulability.htm, January 2005. [11] WEST Team LIFL, Lille, France. Graphical Array Specification for Parallel and Distributed Computing (GASPARD-2). http://www.lifl.fr/west/gaspard/, 2005. [12] A. Benveniste, P. Caspi, S. Edwards, N. Halbwachs, P. L. Guernic, and R. de Simone. Synchronous Languages Twelve Years Later. Proceedings of the IEEE, January 2003. [13] P. Caspi, D. Pilaud, N. Halbwachs, and J.A. Plaice. LUSTRE : a declarative language for real-time programming. ACM Press, 1987. [14] Paul Le Guernic, Jean-Pierre Talpin, and Jean-Christophe Le Lann. Polychrony for system design. Journal for Circuits, Systems and Computers, Special Issue on Application Specific Hardware Design, apr 2003. [15] Rabie Ben Atitallah, Pierre Boulet, Arnaud Cuccuru, Jean-Luc Dekeyser, Antoine Honoré, Ouassila Labbani, Sébastien Le Beux, Philippe Marquet, Éric Piel, Julien 71 72 BIBLIOGRAPHIE Taillard, and Huafeng Yu. Gaspard2 uml profile documentation. Technical Report 0342, September 2007. [16] Alain Demeure, Anne Lafarge, Emmanuel Boutillon, Didier Rozzonelli, Jean-Claude Dufourd, and Jean-Louis Marro. Array-OL : Proposition d’un formalisme tableau pour le traitement de signal multi-dimensionnel. In Gretsi, Juan-Les-Pins, France, sep 1995. in-french. [17] Pierre Boulet. Array-OL revisited, multidimensional intensive signal processing specification. Technical Report RR-6113, February 2007. [18] Allen, Chase, Hallett, Luchangco, Maessen, Ryu, Steele, and Tobin-Hochstadt. The fortress language specification, version 1.0. Sun Microsystems, Inc., March 2008. [19] Stéphane Ducasse, Oscar Nierstrasz, Nathanael Schärli, Roel Wuyts, and Andrew Black. Traits : A mechanism for fine-grained reuse. ACM Transactions on Programming Languages and Systems, 28(2) :331–388, mar 2006. [20] Gilad Bracha and William Cook. Mixin-based inheritance. In OOPSLA/ECOOP ’90 : Proceedings of the European conference on object-oriented programming on Object-oriented programming systems, languages, and applications, pages 303–311, New York, NY, USA, 1990. ACM Press. [21] D. Callahan, B.L. Chamberlain, and H.P. Zima. The cascade high productivity language. In High-Level Parallel Programming Models and Supportive Environments, 2004. Proceedings. Ninth International Workshop on, pages 52–60, 2004. [22] Philippe Charles, Christopher Donawa, Kemal Ebcioglu, Christian Grothoff, Allan Kielstra, Vijay Saraswat, Vivek Sarkar, and Christoph Von Praun. X10 : An objectoriented approach to non-uniform cluster computing. In Proceedings of the 20th ACM SIGPLAN conference on Object-oriented programing, systems, languages, and applications, pages 519–538. ACM SIGPLAN, 2005. [23] Pierre Boulet and Xavier Redon. Communication pre-evaluation in HPF. In EUROPAR’98, volume 1470 of LNCS, pages 263–272. Springer Verlag, 1998. [24] Pierre Boulet, Philippe Marquet, Éric Piel, and Julien Taillard. Repetitive Allocation Modeling with MARTE. In Forum on specification and design languages (FDL’07), Barcelona, Spain, September 2007. Invited Paper. [25] Object Management Group, Inc., editor. Object Constraint Language Specification, version 2.0. http://www.omg.org/cgi-bin/doc?formal/2006-05-01, may 2006. [26] Yves Sorel and Christophe Lavarenne. Modèle unifié pour la conception conjointe logiciel-matériel. (numéro spécial Adéquation Algorithme Architecture), 14(6) :569–578, 1997. [27] Y. Sorel. Massively parallel systems with real time constraints, the algorithm architecture adequation methodology. In Proceedings of Conference on Massively Parallel Computing Systems, MPCS’94, Ischia, Italy, May 1994. [28] eclipse.org. Eclipse. http://www.eclipse.org, 2008.