« Fonctionnement d'un ordinateur/Les architectures dataflow » : différence entre les versions

Contenu supprimé Contenu ajouté
Ligne 44 :
==Les architectures ''dataflow'' statiques==
 
La détection de la disponibilité des opérandes est primordiale sur les architectures dataflow. Suivant l'ordinateur utilisé, cette gestion du jeton peut être plus ou moins évoluée et peut permettre ou interdire certaines manipulations potentiellement intéressantes. Dans ce qui va suivre, on va voir qu'il existe différentes façons de gérer ce jeton, qui peuvent être plus ou moins évoluées suivant l'ordinateur ''dataflow'' utilisé. Le principal problème avec les jetons, c'est que ceux-ciqu'ils doivent parfois attendre que leur instruction ait réunie toutes ses opérandes pour être utilisés. Dans pas mal de cas, cela ne pose pas de problèmes : les jetons n'ontattendent pas trop de temps à attendrelongtemps et un nouveau jeton n'a pas le temps d'arriver entre temps. Mais ceil n'est pas toujours le cas, et parfois, onse peut se retrouver avec qu'un nouveau jeton qui arrive avant que le précédent soit consommé. DansOn ceest cas, on estalors face à un problème : comment faire pour différencier l'ancienne donnée, qui doit être utilisée dans le calcul à faire, de la donnée du jeton nouveau venu ? La première solution est celle utilisée sur les '''architectures dataflow statiques'''. Sur ces architectures, on doit se débrouiller pour n'avoir qu'un seul jeton de disponible pour chaque opérande. Dit autrement, chaque flèche du graphe ne doit contenir qu'un seul jeton à la fois lors de l’exécution du programme. En clair, une instruction ne peut pas avoir plusieurs valeurs différentes d'une même opérande en attente, chose qui serait possible avec l'usage de boucles, par exemple.
 
La première solution est celle utilisée sur les '''architectures dataflow statiques'''. Sur ces architectures, on n'a qu'un seul jeton de disponible pour chaque opérande, par construction. Une instruction ne peut pas avoir plusieurs valeurs différentes d'une même opérande en attente, chose qui serait possible avec l'usage de boucles, par exemple. Dit autrement, chaque flèche du graphe ne doit contenir qu'un seul jeton à la fois lors de l’exécution du programme.
 
===Le codage des instructions===
 
Une instruction contient alors, outre son opcode, un espace pour stocker les opérandes (les jetons) et quelquesdes bits de présence qui indiquent si l'opérande associée est disponible. Les jetons sont donc stockés dans l'instruction, et sont mis à jour par réécriture directe de l'instruction en mémoire. De plus, il ne faut pas oublier de représenter la flèche, les dépendances de données qu'elle peut avoir. Pour cela, chaque instruction contient l'adresse de l'instruction suivante, celle à laquelle envoyer le résultat. Tout cela ressemble aux entrées des stations de réservation sur les processeurs à exécution dans le désordre, à un détail près : tout est stocké en mémoire, dans la suite de bits qui code l'instruction. Vu qu'une instruction contient ses propres opérandes, on préfère parfois utiliser un autre terme que celui d'instruction et on parle d''''activity template'''.
 
{|
<gallery widths=450px heights=300px>
|[[File:Dataflowsimplestructure.png|centre|vignette|upright=1.5|Illustration du codage de haut niveau d'un instruction sur une architecture dataflow statique. On voit bien que chaque instruction a un espace réservé pour chaque opérande.]]
|[[File:Dataflowiterstructure.png|centre|vignette|upright=1.5|Même chose, mais avec des instructions Switch et Merge.]]
|}
</gallery>
 
EnAvec effetcette technique, il faut trouver un moyen de toujours respecter cette contrainte. Il faut empêcher une instruction de s’exécuter et de fournir un résultat si une autre donnée est en train d'attendre sur la même flèche. Pour empêcher cela, chaque instruction contient un bit, un jeton d'autorisation qui indique si elle peut calculer un nouveau résultat. Ce bit est appelé le '''jeton d'autorisation'''. Quand une instruction s’exécute, elle prévient l'instructionles instructions qui aont calculécalculées l'opérandeses opérandes qu'elle est prête à accepter un nouvel opérande. :Les le jetonjetons de cellecelles-ci estsont mis à jour. PurPour que cela fonctionne, chaque instruction doit savoir quelle est la ou les instructions qui la précédent dans l'ordre des dépendances. Pour cela, unece seulequi solutionimplique :de stocker toutesmémoriser leurs adresses dans l'instruction.
 
[[File:Représentation d'une instruction en mémoire sur une architecture dataflow.jpg|centre|vignette|upright=2|Représentation d'une instruction en mémoire sur une architecture dataflow.]]
 
===La microarchitecture d'une architecture ''dataflow'' statique===
 
Dans les grandes lignes, une architecture ''dataflow'' statique est composée de plusieurs éléments, représentés sur le schéma que vous pouvez voir en-dessous. La file d'instructions est une mémoire qui met en attente les instructions dont toutes les données sont prêtes : elle contient leurs adresses, qu'elle peut fournir à l'unité de chargement. L'unité de mise à jour enregistre les résultats des instructions en mémoire et met à jour les bits de présence. Elle vavérifie aussi vérifier que l'instruction de destination du résultat a tous ses opérandes disponibles, et charge celle-ci dans la file d'instructions si c'est le cas.
 
[[File:Diagramme d'une architecture dataflow statique.jpg|centre|vignette|upright=2|Diagramme d'une architecture dataflow statique.]]
Ligne 67 ⟶ 69 :
===Les défauts de ces architectures===
 
Ces architectures ont''dataflow'' toutefoisstatiques ont de gros défauts. :Le plus important est que certaines fonctionnalités importantes de nosdes langages de programmation fonctionnels ne sont pas implémentables sur ces architectures. Exemples : pas de fonctions de première classe, pas de fonctions réentrantes, ni de récursivité. Autant vous dire que ces architectures ne servent pas à grand chose. PireDe :plus, les boucles dont les itérations sont indépendantessystématiquement neexécutées peuventen pas être déroulées (ni pipelinées) : on exécutesérie, itérations après itérations, au lieu d’exécuter toutesdes les bouclesitérations en parallèle quand c'est possible. En effet, lorsqu'on exécute une fonction réentrante ou plusieurs itérations d'une boucle, plusieurs versions des mêmes instructions peuvent s’exécuter en même temps : une version de la fonction par appel récursif ou par itération. Et chaque version va vouloir écrire dans les champs opérandes et mettre à jour les bits de présence. Heureusement, les jetons d'autorisation vont éviter tout problème, en ne laissant qu'une seule version (la plus ancienne) s'exécuter, en faisant attendre les autres.
 
==Les architectures ''dataflow'' dynamiques==