Dans l’architecture des ordinateurs, une technique utilisée pour éviter la sérialisation inutile des opérations du programme imposée par la réutilisation des registres du processeur est connue sous le nom de renommage des registres.
Définition du problème
Les programmes sont composés d’instructions qui opèrent sur des valeurs, et ces instructions doivent nommer ces valeurs pour les distinguer des autres. Une instruction typique consisterait à additionner X et Y afin de stocker le résultat dans Z. Dans cette instruction, X, Y et Z font référence à des emplacements de stockage.
Afin d’obtenir un codage compact, la plupart des jeux d’instructions disposent d’un petit ensemble d’emplacements spéciaux qui peuvent être nommés directement. Par exemple, l’architecture du jeu d’instructions x86 possède 8 registres de nombres entiers, x86-64 en a 16, la plupart des RISC en ont 32 et IA-64 en a 128. Sur les processeurs plus petits, les noms de ces emplacements correspondent directement aux éléments du fichier de registres.
Les différentes instructions prennent plus ou moins de temps. Par exemple, un processeur peut exécuter des centaines d’instructions lors d’un chargement à partir de la mémoire principale. Les instructions les plus courtes exécutées pendant que le chargement est en cours se terminent en premier, de sorte que les instructions se terminent en dehors de l’ordre initial du programme. L’exécution hors ordre a été utilisée dans la plupart des processeurs récents à haute performance pour obtenir un certain gain de vitesse.
Prenons l’exemple suivant d’un code qui s’exécute dans le désordre sur un processeur :
Les instructions 4, 5 et 6 sont indépendantes des 1, 2 et 3, mais le processeur ne peut pas terminer l’instruction 4 s’il n’a pas terminé l’instruction 3, sinon cette dernière écrirait une valeur incorrecte.
Il est possible de supprimer cette restriction en changeant le nom de certains registres :
Les instructions 4, 5 et 6 peuvent alors être exécutées en parallèle avec les instructions 1, 2 et 3, de sorte que le programme peut être exécuté plus rapidement.
Dans la mesure du possible, le compilateur effectue ce changement de nom. Le compilateur est limité de plusieurs manières, principalement par le nombre fini de noms de registres dans le jeu d’instructions. De nombreux processeurs à haute performance ont plus de registres physiques que ceux qui peuvent être nommés directement dans le jeu d’instructions, de sorte que les registres matériels sont renommés pour obtenir un parallélisme supplémentaire.
Risques et renommage
Lorsque plusieurs instructions font référence à un emplacement particulier d’un opérande, que ce soit en lecture ou en écriture, leur exécution dans un ordre différent de l’ordre original peut entraîner trois types de problèmes, également connus sous le nom de risques :
Tout emplacement lu ou écrit peut être renommé. Bien que le renommage soit principalement appliqué aux registres à usage général et aux registres à virgule flottante, la technique est également appliquée aux registres de marque ou d’état.
Les emplacements de mémoire peuvent également être renommés, comme c’est le cas dans une certaine mesure dans le processeur Transmeta Crusoe, bien que ce ne soit pas le plus courant.
Si les programmes s’abstiennent de réutiliser les registres immédiatement, il n’est en principe pas nécessaire de les renommer. Certains jeux d’instructions, comme celui de l’IA-64, autorisent un très grand nombre de registres spécifiquement pour cette raison. Cette approche présente toutefois des limites :
L’augmentation de la taille du code est importante car plus le code est volumineux, plus la mémoire cache se remplit rapidement et plus le processeur se bloque dans l’attente de nouvelles instructions.
Registres d’architecture et registres physiques
Les programmes en langage machine spécifient des lectures et des écritures dans un ensemble limité de registres marqués par l’architecture du répertoire d’instructions. Par exemple, l’ensemble DEC Alpha spécifie 32 registres d’entiers et 32 registres de virgules flottantes, tous deux de type 64 bits. Il s’agit de registres d’architecture. Les programmes écrits pour les processeurs utilisant le jeu d’instructions Alpha effectueront des opérations de lecture et d’écriture sur ces 64 registres. Si un programmeur arrête le programme dans un débogueur de code, il peut consulter le contenu des 64 registres (et de certains registres d’état) pour déterminer la progression de la machine.
Un cas particulier de processeur mettant en œuvre ce répertoire est l’Alpha 21264, qui dispose de 80 registres de nombres entiers et de 72 registres de nombres à virgule flottante. Sur la puce Alpha 21264, il y a 80 emplacements distincts qui peuvent stocker les résultats des opérations sur les nombres entiers, et 72 pour stocker les résultats des opérations sur les nombres à virgule flottante (en fait, il y a encore plus d’emplacements, mais on ne peut pas leur appliquer le renommage des registres).
Deux styles de renommage des registres sont décrits ci-dessous, différenciés par le circuit qui prépare les données pour l’unité d’exécution.
Dans tous les schémas de renommage, la machine convertit les registres d’architecture utilisés dans le flux d’instructions en étiquettes. Alors que les registres d’architecture peuvent être spécifiés sur 3 à 5 bits, les étiquettes sont généralement des nombres de 6 à 8 bits. Le fichier de renommage doit avoir un port de lecture pour chaque entrée de chaque instruction renommée dans chaque cycle, et un port d’écriture pour chaque sortie de chaque instruction renommée dans chaque cycle. Étant donné que la taille du fichier de registres augmente généralement de façon géométrique par rapport au nombre de ports, le fichier de renommage est généralement physiquement volumineux et consomme une grande quantité d’énergie.
Dans la technique du fichier journal indexé par balise, il existe un grand fichier journal pour les données, contenant un enregistrement pour chaque balise. Par exemple, si la machine possède 80 registres physiques, elle utilisera des balises de 7 bits, ce qui laisse 48 valeurs de balises inutilisées.
Dans cette technique, lorsqu’une instruction est envoyée à l’unité d’exécution, les étiquettes du registre source sont envoyées au fichier de registre physique, où les valeurs correspondant à ces étiquettes sont lues et envoyées à l’unité d’exécution.
Dans la technique de la station de sauvegarde, il existe de nombreux petits fichiers de registres associatifs, généralement un à l’entrée de chaque unité d’exécution. Chaque opérande de chaque instruction dans une file d’attente d’émission a une place pour sa valeur dans l’un de ces fichiers de registres.
Dans cette technique, lorsqu’une instruction est envoyée à une unité d’exécution, les entrées du fichier de registres correspondant à l’entrée de la file d’attente sont lues et envoyées à l’unité d’exécution.
Similar Posts:
- Harvard Architecture: How did Harvard Mark I separate data and instruction?
- Harvard Architecture : Comment le Harvard Mark I a-t-il séparé les données et les instructions ?
- Puma (microarchitecture)
- Encodage delta
- L’exhaustivité des anciens registres paroissiaux dans les années 1700
- Pourquoi le registre paroissial indique-t-il plus de baptêmes que d’enterrements ?
- Histoire ancienne des nombres premiers