Fonctionnement d'un ordinateur/Les architectures actionnées par déplacement

Un livre de Wikilivres.
Sauter à la navigation Sauter à la recherche

Sur certains processeurs, les instructions machine correspondent directement à des micro-instructions qui configurent directement le bus interne au processeur. De tels processeurs sont ce qu'on appelle des architectures actionnées par déplacement (transport triggered architectures). Sur une architecture actionnée par déplacement, toutes les instructions (sauf quelques branchements) vont configurer le bus interne du processeur, en reliant ou non les ALU aux registres, en reliant les registres entre eux, etc. Chaque configuration va soit relier une unité de calcul au banc de registres, soit échanger deux données entre registres du banc de registres (connecter un port de lecture du banc de registres sur un port d'écriture), soit effectuer un branchement. Sur certains de ces processeurs, on n’a besoin que d'une seule instruction qui permet de copier une donnée d'un emplacement (registre ou adresse mémoire) à un autre. Pas d'instructions LOAD, STORE, etc. : on fusionne tout en une seule instruction supportant un grand nombre de modes d'adressages. Certaines de ces architectures utilisent plusieurs bus internes, afin de pouvoir faire plusieurs micro-instructions à la fois.

Fichier:Transport Triggered Architecture.png
Parts of Transport Triggered Architecture

Implémentation[modifier | modifier le wikicode]

On peut implémenter ces architectures de deux manières :

  • soit en nommant les ports des unités de calcul ;
  • soit en intercalant des registres en entrée et sortie des unités de calcul.

Avec des ports[modifier | modifier le wikicode]

Dans le premier cas, le banc de registres peut être directement connecté sur les entrées et sorties des ALU, que ce soit en entrée ou en sortie. Chaque entrée ou sortie est ce qu'on appelle un port (d'entrée ou de sortie). Mais avec cette organisation, les ports des ALU doivent être sélectionnables : on doit pouvoir dire au processeur que l'on veut connecter tel registre à tel port, tel autre registre à un tel autre port, etc. Ainsi, les ports sont identifiés par une suite de bits, de la même manière que les registres sont nommés avec un nom de registre : chaque port reçoit un nom de port.

Il existe un port qui permet de déclencher le calcul d'une opération : quand on connecte celui-ci sur un des bus internes, l'opération démarre alors. Toute connexion des autre ports d'entrée ou de sortie de l'ALU sur le banc de registres ne déclenche pas l'opération : l'ALU se comporte comme si elle devait faire un NOP et n'en tient pas compte.

Avec des registres[modifier | modifier le wikicode]

Dans le second cas, on intercale des registres intermédiaires spécialisés en entrée et sortie de l'ALU : le but de ces registres est de stocker les opérandes et le résultat d'une instruction. Tout ce que peut faire le processeur, c'est relier :

  • transférer une donnée du banc de registres vers ces registres ;
  • transférer des données entre banc de registres et mémoire ;
  • éventuellement, faire des échanges de données entre registres généraux.

Ces registres servent spécialement à stocker les opérandes d'une instruction machine, et ne permettent pas de déclencher des opérations : on peut écrire dedans sans que l'ALU ne fasse rien. Par contre, certains registres servent à déclencher des instructions : lorsqu'on écrit une donnée dans ceux-ci, cela va automatiquement déclencher l’exécution d'une instruction bien précise par l'unité de calcul.

Par exemple, un processeur de ce type peut contenir trois registres « ajout.opérande.1 », « ajout.déclenchement » et « ajout.résultat ». Le premier registre servira à stocker le premier opérande de l'addition. Pour déclencher l'opération d'addition, il suffira d'écrire le second opérande dans le registre « ajout.déclenchement », et l'instruction s’exécutera automatiquement. Une fois l'instruction terminée, le résultat de l'addition sera automatiquement écrit dans le registre « ajout.résultat ». Il existera des registres similaires pour la multiplication, la soustraction, les comparaisons, etc.

Utilité[modifier | modifier le wikicode]

La raison d'exister de ces architectures est tout autant la simplicité du processeur que la performance. Dans les grandes lignes, de tels processeurs ont un séquenceur extrêmement simple, qui utilise peu de portes logiques. La raison à cela est simplement que le séquencement des micro-instructions n'a pas à être réalisé par le processeur, mais est réalisé par le compilateur. Le fait que le compilateur aie la main sur les micro-instructions peut permettre des simplifications assez fines, qui ne seraient pas possibles avec un compilateur qui réordonne des instructions machines. Par exemple, on peut envoyer le résultat fourni par une unité de calcul directement en entrée d'une autre, sans avoir à écrire ce résultat dans un registre intermédiaire du banc de registres. Évidemment, ces micro-instructions ont un temps de latence qui doit être connu pour obtenir un programme correct : sans cela, on pourrait par exemple lire une donnée avant que celle-ci ne soit disponible. Cela demande donc des compilateurs dédiés, qui connaissent les temps de latence de chaque instruction. La portabilité des programmes compilés pour de telles architecture est donc faible.