OCREP


Un outil de répartition automatique pour les langages synchrones


english   An English version is also available   english

Table des matières


Introduction

Les systèmes réactifs sont des systèmes informatiques dont le rôle est de réagir continûment à leur environnement, à une vitesse imposée par celui-ci. Les langages synchrones ont été inventés pour faciliter la programmation des systèmes réactifs. Les principaux langages synchrones sont Esterel, Lustre, Argos et Signal.

Beaucoup de systèmes réactifs doivent être réparti sur plusieurs sites de calcul, pour des raisons diverses : amélioration des performances, localisation des capteurs et actionneurs, tolérance aux pannes ... L'outil ocrep répartit automatiquement les programmes synchrones, en fonction de directives fournies par l'utilisateur.


Description de l'outil ocrep

Ocrep est fondé sur la méthode de répartition du code objet. Cela consiste à compiler le programme source en un programme objet centralisé, et ensuite à répartir ce programme centralisé en autant de programmes qu'il y a de sites de calcul, de telle sorte que chaque site n'effectue que les calculs qui lui sont propres. Aussi ocrep utilise le format interne OC commun aux langages synchrones. En effet, les compilateurs Lustre, Esterel et Argos produisent du code OC. Sans entrer dans les détails, un programme OC est un automate d'états fini couplé à une mémoire finie pour les calculs. Ocrep prend en entrée :

Les directives de répartition consistent en une partition de l'ensemble des entrées/sorties du programme en autant de sous-ensembles qu'il y a de sites de calcul. Ceci permet d'attribuer un site de calcul unique à chaque entrée/sortie. Des directives plus fines peuvent être fournies en attribuant un site de calcul à des variables locales. Concrètement, le fichier des directives de répartition contient une table de sites, avec globalement la même syntaxe que les autres tables OC :

site_part        :   /* empty */
                 |   'sites:' number_of_sites site_table 'end:'
                 ;

number_of_sites  :   integer
                 ;

site_table       :   site_table site_definition
                 ;

site_definition  :   site_num ':' identifier '(' signal_list ')'
                 |   site_num ':' identifier '(' signal_list ')' '(' variable_list ')'
                 ;

site_num         :   integer
                 ;

Ici, signal_list est une liste de noms d'entrées/sorties du programme OC. Plus de directives peuvent être données en ajoutant à un site une liste optionnelle variable_list d'index de variables. Toutefois, dans la mesure où OC est un format interne, il est difficile de relier les variables OC au programme source. De plus, il ne doit pas y avoir de conflits entre signal_list et variable_list. En particulier, il est interdit d'attribuer un site à un signal d'entrée et d'attribuer un autre site à la variable véhiculée par ce signal. En cas de conflit, une erreur sera signalée et ocrep s'arrêtera.

Quelques mots sur les signaux de type local et exception. Ils proviennent de programmes Esterel et expriment des synchronisations entre des modules en parallèle, des constructions trap/exit ... Cependant, au niveau du code OC, toutes ces synchronisations sont exprimées directement pas la structure de contrôle de l'automate : les signaux de type local et exception sont traduits en transitions par le compilateur Esterel. Par conséquent, il ne devrait jamais y avoir d'action output ou present impliquant des signaux de type local ou exception. C'est pourquoi ocrep décide arbitrairement de localiser tous les signaux de type local ou exception sur le site 0. Notons que comme ces signaux n'ont pas de nom, il ne peuvent apparaître dans aucune liste signal_list.

Les communications ont lieu par l'intermédiaire d'un réseau complet de files d'attente FIFO. Deux primitives de communication sont utilisées :

Ocrep produit un programme OC pour chaque site de calcul spécifié dans le fichier de directives de répartition. Chaque programme OC contient les instructions de communication nécessaires aux références aux variables non locales. Par exemple, la commande :

  ocrep foo.oc

produit deux fichiers foo.2.0.oc et foo.2.1.oc si le fichier foo.rep spécifie une répartition vers deux sites de calcul. Chaque fichier produit par ocrep peut ensuite être compilé, par exemple par le compilateur Esterel.


Options

Les options sont les suivantes :

-h Imprime le message d'aide.
-version Imprime le numéro de version d'ocrep.
-info Imprime toutes les informations à propos d'ocrep.
-sb Synchronise faiblement les programmes OC (seulement ceux qui communiquent).
-st Synchronise faiblement les programmes OC (tous).
-e Élimine localement les puts redondants.
-E Élimine globalement les puts redondants.
-a Insère les puts aussi tôt que possible.
-r Réduit les branchements dont les deux branches ont des comportement équivalents.

Comment obtenir ocrep

Ocrep est disponible pour les architectures Unix :<\p>

Cette distribution d'ocrep contient quatre répertoires :

L'utilitaire poc qui permet de pretty-printer les programmes OC est disponible ici.

Bonne répartition avec ocrep !


Contributions

Ce travail a été partiellement subventionné par la société Merlin-Gerin (aujourd'hui partie du groupe Schneider Electric), par l'Inria et par l'Université de Californie à Berkeley.


Articles



Dernière modification : 27 avril 1998