Fonctionnement d'un ordinateur/Les architectures actionnées par déplacement
Sur les architectures actionnées par déplacement (transport triggered architectures), les instructions machines correspondent directement à des micro-instructions. Chaque instruction du langage machine configure directement le bus interne au processeur. Elles peuvent relier les ALU aux registres, relier les registres entre eux, effectuer un branchement, etc. De tels processeurs n'ont pas besoin d'un décodeur d'instruction pour traduire les instructions machines en signaux de commandes. Mais elles ont quand même besoin d'une unité de chargement, d'un program counter et des circuits pour gérer les branchements.

Les avantages et désavantages d'un processeur actionné par déplacement
[modifier | modifier le wikicode]La raison d'exister de ces architectures est tout autant la simplicité du processeur que la performance. Et évidemment, comme vous commencez à vous y habituer, cela ne se fait pas sans contreparties.
Les avantages : l'absence de décodeur d'instruction et des optimisations logicielles
[modifier | modifier le wikicode]L'avantage le plus flagrant est l'absence de décodeur d'instruction et de microcode, qui rend de tels processeurs très simples à fabriquer. Cette simplicité fait que de tels processeurs utilisent peu de portes logiques, qui peuvent être utilisés pour ajouter plus de cache, de registres, d'unités de calcul, et autres.
L'autre avantage est que le séquencement des micro-instructions n'est pas réalisé par le processeur, mais par le compilateur. Ce qui peut permettre des simplifications assez fines, qui ne seraient pas possibles avec des instructions machines normales. 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.
Cette optimisation est très utilisée sur ces architectures, au point que celles-ci adaptent leur bancs de registres en conséquence. Elles peuvent retirer quelques ports de lecture et écriture sans que cela impacte les performances. Du moins, tant que le compilateur arrive efficacement à transférer les données entre unités de calcul sans passer par le banc de registre.
Les désavantages : une portabilité minable et une taille de code beaucoup plus élevée
[modifier | modifier le wikicode]Le désavantage principal est que la portabilité des programmes compilés pour de telles architecture est faible. La raison principale est qu'il n'y a pas de séparation entre jeu d'instruction et microarchitecture. Si l'on change la microarchitecture du processeur, alors le jeu d’instruction change et la compatibilité part avec. Impossible de rajouter une unité de calcul, de changer les temps d’exécution des instructions ou quoique ce soit d'autre. Par exemple, les micro-instructions ont un temps de latence à prendre en compte. Si les temps de latence changent, les programmes écrits en tenant compte des anciens temps de latences peuvent se mettre à dysfonctionner. De fait, de telles architectures ne sont pas utilisables dans les PC grands public, mais elles peuvent être utilisées dans certains systèmes embarqués, dans des utilisations très spécifiques.
Un second désavantage non-négligeable est que la densité de code est généralement mauvaise sur ces processeurs. Et cela pour deux raisons : les instructions sont plus longues et l'instruction path length (le nombre d'instructions du programme) est aussi plus élevé. Premièrement, les instructions sont plus longues que pour les autres processeurs. Rien d'étonnant vu que les micro-instructions d'un processeur normal sont plus longues que les instructions machines. Deuxièmement, le nombre d'instructions par programme augmente lui aussi. N'oublions pas qu'une instruction machine correspond à une séquence de plusieurs micro-instructions. Le nombre d'instructions est donc multiplié en conséquence. Et les optimisations qui permettent d'économiser les micro-instructions n'y font pas grand chose.
L'implémentation des processeurs actionnés par déplacement
[modifier | modifier le wikicode]Sur les processeurs actionnés par déplacement, on n’a besoin que d'une seule instruction MOV, qui copie une donnée d'un emplacement (registre ou adresse mémoire) à un autre. Pas d'instructions LOAD, STORE, ni même d'instructions arithmétiques : on fusionne tout en une seule instruction supportant un grand nombre de modes d'adressages. 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.
L'implémentation avec des ports
[modifier | modifier le wikicode]Dans le premier cas, l'instruction machine connecte directement l'ALU sur le bus interne. Mais avec cette organisation, les ports de l'ALU (les entrées et sorties de l'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. Pour ce faire, 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 numéro 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. 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.

L'implémentation 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, pour stocker les opérandes et le résultat d'une instruction. L’exécution d'une opération par l'unité de calcul est déclenchée automatiquement par une écriture dans certains registres d'opérande. Les autres registres ne permettent pas de déclencher des opérations : on peut écrire dedans sans que l'ALU ne fasse rien.
Par exemple, un processeur de ce type peut contenir trois registres « opérande.1 », « opérande.2/déclenchement » et « résultat ». Le premier registre stocke le premier opérande de l'addition, le second stocke le second opérande, le troisième stocke le résultat de l'opération. Pour déclencher une opération, il faut écrire le second opérande dans le registre « opérande.2/déclenchement ». Une fois l'instruction terminée, le résultat de l'addition sera disponible dans le registre « ajout.résultat ».
