Pourquoi n'avons-nous pas plus de registres dans les microprocesseurs?

18

Les registres ne sont théoriquement pas requis; tous les microprocesseurs fonctionneraient toujours sans registres. Mais cet ajout apparemment insignifiant a contribué à rendre les microprocesseurs plus efficaces.

Pourquoi ne pouvons-nous pas avoir plus de registres pour en tirer encore plus d'avantages? Ils ne sont que de la mémoire sur puce et on peut imaginer pas très difficile à ajouter? Quel facteur a influencé le nombre de registres pour qu'ils soient ce qu'ils sont maintenant et non, disons 10 fois plus?

Darshan Chaudhary
la source
8
@ Alper91 De nombreuses architectures, hypothétiques et réelles, n'ont pas de registres, et ce n'est pas du tout nécessaire. C'est simplement une optimisation utile.
pipe
4
Hmm. Personne n'a mentionné le Sparc. La plus grande implémentation pourrait contenir 520 registres (32 fenêtres fois 16 registres, + 8 globaux). Je m'en souviens bien.
jonk
13
Je pense que le nombre de bits dans l'instruction dont vous avez besoin pour spécifier le registre est un gros problème. Si vous avez 1024 registres, vous avez besoin d'au moins 30 bits pour chaque instruction arithmétique - sauf si vous ajoutez d'autres contraintes comme "les 3 registres doivent être du même groupe de 32 (auquel cas vous avez besoin de 20 bits).
user253751
8
@pipe - en fait à peu près n'importe quelle conception pratique nécessite des "registres" dans le sens schématique, car même si vous construisez une machine de pile ou quelque chose comme ça, vous devez avoir un endroit pour contenir les arguments de l'ALU, ou bien les sorties - la plupart des mémoires n'ont pas trois ports d'accès. Et une machine à pile a besoin d'un pointeur de pile qui est ... un registre! Et ne parlons pas des registres de pipeline. Vous pouvez masquer l'utilisation de ces "registres" au programmeur, mais vous en avez toujours besoin, et probablement presque autant qu'une machine à registres primitive.
Chris Stratton
4
@ChrisStratton Bien sûr, mais tant qu'ils ne sont pas exposés via l'ISA, il s'agit simplement d'un détail d'implémentation. Argument quelque peu inutile cependant, car nous ne savons pas ce que OP signifie par registre .
pipe

Réponses:

33

Il y a plusieurs facteurs:

  • les micro-architectures hautes performances utilisent le renommage des registres. Autrement dit, le nombre de registres physiques est supérieur au nombre de registres visibles sur le plan architectural et ils sont capables de suivre leurs utilisations indépendantes.

  • doubler le nombre de registres ne double pas les performances. ISTR (de l'architecture informatique, une approche quantitative ) qui passant de 16 à 32 registres apporte quelque chose comme une amélioration de 10% en supposant que l'augmentation n'a pas d'effet négatif (ce qui est une hypothèse très optimiste).

  • les registres visibles sur le plan architectural ont des coûts. Par exemple:

    • L'augmentation de leur nombre augmente le nombre de bits pris dans le format d'instruction pour indiquer sur quel registre est appliqué (doubler le nombre de registres implique d'avoir un bit de plus par registre dans le format, empêchant ainsi d'utiliser ces bits pour d'autres usages ou forçant une taille d'instruction plus longue).
    • L'augmentation du nombre de registres architecturaux augmente le coût de changement de contexte (car ils doivent être enregistrés et restaurés lors du changement de contexte).
AProgrammer
la source
1
Je parierais que l'amélioration des performances de 16 à 32 registres dépend totalement du potentiel d'optimisation du compilateur en question. Dans l'assembleur, avoir le droit de doubler le nombre de registres (dans l'architecture x64) peut considérablement améliorer les performances - mais uniquement pour les rôles de niche, et uniquement s'ils sont réellement utilisés.
rdtsc
6
@rdtsc: passer de 8 à 16 registres architecturaux donne de grandes améliorations dans la quantité de déversements / rechargements pour le code typique, selon les données de simulations dans un article lié à cette réponse . Cela affecte la taille du code, le nombre d'instructions et l'importance du transfert de mémoire à faible latence. 16-> 32 est un effet beaucoup plus petit. AFAICT, 16 registres architecturaux est un bon choix pour le matériel avec un changement de nom de registre pour supprimer les dangers WAR et WAW.
Peter Cordes
2
Cependant, l'AVX512 d'Intel ajoute 16 regs vectoriels supplémentaires, pour un total de 32. (En plus de doubler leur largeur à 64 octets, une ligne de cache complète). Masquer la latence des opérations FP à haut débit et à latence élevée peut prendre beaucoup de registres. Par exemple, Intel Haswell a 5c lat, un par FMA de débit de 0,5c, vous avez donc besoin de 10 accumulateurs vectoriels pour saturer les unités d'exécution FMA pour une réduction (par exemple, produit scalaire ou sommant un tableau, où le FMA fait partie d'une dépendance à boucle) ). x86-64 n'a que 16 registres vectoriels. Mais rappelez-vous, les opérations entières, en particulier. sur les regs GP, ont rarement plus de latence 1c.
Peter Cordes
1
Le compromis est différent pour les registres entiers, FP et vectoriels. Par exemple, la sauvegarde / restauration paresseuse de registres entiers n'a pas de sens, le faire pour le vecteur un est un bien meilleur pari. Et le vecteur ISA a souvent plus de registres qu'un entier (AltiVec en a au moins jusqu'à 128, ISTR en a lu environ 256 pour Sparc mais ne peut pas trouver de référence maintenant).
AProgrammer
1
en.wikipedia.org/wiki/AltiVec a trente-deux registres vectoriels 128b. Je suis devenu curieux à propos de SPARC et j'ai cherché comment fonctionnaient ses fenêtres de registre pour les changements de contexte. Il a 32 registres visibles à la fois, mais utilise une fenêtre coulissante sur un fichier de registre plus grand. Il semble à partir de cette version simplifiée que le système d'exploitation a besoin de connaître la taille de l'ensemble du fichier de registre de fenêtre coulissante pour l'enregistrer / le restaurer, car même si les instructions de diapositive de fenêtre fournissent de la mémoire pour l'enregistrement / la restauration des regs si nécessaire, cela se fait par trapping à l'OS.
Peter Cordes
16

Bien que les registres et la RAM soient tous deux de la mémoire, ils sont accessibles de différentes manières, pour refléter le coût (dans la zone de la puce ou des cycles d'horloge cachés) de leur accès.

Les registres sont étroitement liés à l'ALU et peuvent jouer de nombreux rôles de sources de données, de récepteurs, de modificateurs, etc. Ils ont donc besoin d'une multitude de connexions multiplexées étendues. Dans certaines architectures, nous pouvons écrire R1 <= R2 + R3, et c'est exactement ce qui se passe en un seul cycle d'horloge. Chaque registre est directement adressé dans le code op, cet adressage est une ressource très limitée.

Les registres étant coûteux à implémenter, leur nombre est généralement limité à 10/20 dans la plupart des architectures.

La mémoire RAM est vaguement liée au CPU, généralement acheminée via une seule connexion partagée. Cela rend beaucoup moins cher l'implémentation d'une grande quantité de RAM. Les adresses RAM proviennent généralement d'une adresse stockée dans un registre, donc ne consommez pas de largeur d'instruction importante.

SPARC est une architecture intéressante, avec 72 à 640 registres 64 bits, avec un contexte de 32 registres qui peut être décalé avec des chevauchements pour des appels de sous-programme rapides avec passage de paramètres. Vous avez tendance à ne pas les trouver sur les PC et les serveurs où les coûts sont importants, comme dans 99,999% des applications.

Neil_UK
la source
4
Un autre aspect est que vous devez sauvegarder / restaurer les registres lors d'un changement de contexte. Plus de registres, plus de temps.
Michel Billaud
Je noterais que l'ancien TMS9900 gardait tous ses registres de travail dans la mémoire externe en.wikipedia.org/wiki/Texas_Instruments_TMS9900
Peter Smith
1
Je m'étais qualifié «invariablement» avec (à l'exception de quelques ajustements) mais je l'ai retiré pour le simplifier. Je vais peut-être simplement le changer en «généralement». Fondamentalement, si vous pouvez trouver et comprendre les exceptions, vous n'avez pas besoin de moi pour les signaler. Si vous êtes assez niave pour être induit en erreur, cela n'a pas d'importance, car cela ne vous causera aucun problème. TMS9900, c'était bizarre, j'avais un 99/4 pour mes péchés dans une vie antérieure, étrange bête!
Neil_UK
Itanium a également des fenêtres d'enregistrement.
Simon Richter
1
@ChrisStratton: Bien qu'il existe un précédent pour "vous ne pouvez pas utiliser les registres X et Y" étant considéré comme faisant partie d'un "ABI" (par exemple les registres k0 et k1 sur mips), c'est une utilisation inhabituelle. Il existe certainement des canaux de messagerie cachés indésirables / dangereux entre les processus si la sauvegarde / restauration de ces "registres interdits par ABI" n'est pas effectuée lors du changement de contexte. Autrement dit, les processus qui ne devraient pas pouvoir communiquer peuvent le faire en stockant des informations dans les registres interdits et en attendant les changements de contexte.
R ..
12

Les registres doivent être adressés dans l'instruction. S'il y a beaucoup de registres, l'instruction est plus longue. L'enregistrement et la restauration du contenu du registre pour un service d'interruption nécessitent plus de temps s'il y a beaucoup de registres.

Uwe
la source
5

Comme la plupart des choses, le nombre de registres est un compromis entre coût, complexité et utilité.

Les registres sont implémentés en tant que RAM statique multi-ports, ce qui les rend plus coûteux (zone de puce) que les autres options de stockage.

Ensuite, ils sont couplés au jeu d'instructions du processeur, l'augmentation du nombre de registres augmente la complexité du jeu d'instructions. Donc, si vous voulez rester compatible avec le jeu d'instructions, vous ne pouvez pas simplement augmenter le nombre de registres disponibles dans la prochaine génération de processeurs pour augmenter l'efficacité, les programmes ne les utiliseraient pas.

Ensuite, de combien de registres avez-vous vraiment besoin? Il y a une limite à leur utilité. Considérez que vous écrivez un algorithme qui effectue une opération mathématique sur 1024 octets, disons multipliez par 5. Avec le nombre actuel de registres, vous vous retrouvez avec quelque chose comme:

load operand1=5
load address
loop: load operand2=byte1@address
multiply Register1 with Register2
store result
increment address
if address = end goto endLoop
jump loop
endLoop:

Maintenant, si vous aviez 1024 registres et toutes les données qui y sont stockées, votre programme ressemblerait à:

multiply Register1 with Register2
multiply Register1 with Register3
multiply Register1 with Register4
multiply Register1 with Register5
multiply Register1 with Register6
...

Parce que chacun d'eux est une instruction différente, chacun d'eux doit être écrit. Votre mémoire de programme nécessaire explose donc. Après avoir réalisé cela, vous voudrez peut - être présenter quelques instructions comme, multiply register1 with register(2 to 256). Mais quand arrêteriez-vous, fournissez-vous une instruction pour toutes les combinaisons?

Alors peut-être que les chiffres dont nous disposons actuellement sont un bon compromis entre le coût, la complexité et l'utilité.

Arsenal
la source
1
Je pense que le programme multiply Register1 with Register2 multiply Register1 with Register3est très irréaliste car les données doivent provenir directement ou indirectement de l'extérieur de l'ordinateur, donc les registres doivent être chargés, et les résultats doivent être utilisés quelque part, directement ou indirectement, donc les registres doivent être stockés. En réalité, un compilateur d'optimisation décent pour un langage de haut niveau `` déroulera '' la boucle du premier programme pour créer quelque chose comme le deuxième programme, optimisant l'utilisation du registre, la latence de la mémoire, peut-être l'occupation du cache et la vitesse d'exécution.
gbulmer
1
De nombreuses multiply register1 with register(2 to 256)instructions spéciales ne sont pas nécessaires . Le pipeline améliore considérablement le débit du processeur, en particulier pour les instructions de décodage et d'exécution plus simples. Ainsi, l'effet d'instructions de variétés complexes et massives peut être obtenu en utilisant plusieurs instructions plus simples avec un taux d'exécution plus élevé. Le fait d'avoir un plus grand nombre de registres aide en permettant au compilateur de générer de nombreuses instructions indépendantes (celles qui ne partagent pas de registre), qui peuvent être exécutées indépendamment, améliorant ainsi le débit. Votre exemple = plus de registres sont meilleurs.
gbulmer
4

Les registres sont très chers. Très cher. Ce ne sont pas tellement les registres eux-mêmes, ce sont toutes les connexions depuis et vers les registres. Supposons que vous ayez une instruction reg1 = reg2 + reg3. Pour implémenter cette vitesse , vous devez lire les données de deux registres dans un cycle et écrire dans un autre registre dans le deuxième cycle. Maintenant, si vous avez un processeur qui peut exécuter plusieurs instructions par cycle, par exemple trois instructions, vous devez être capable de lire les données de six registres à chaque cycle et d'écrire des données dans 3 registres. C'est énormément, énormément de connexions très rapides.

Bien sûr, vous pouvez simplement utiliser plus de transistors. Le problème est: la vitesse diminue. Vous avez besoin de plus de matériel pour choisir parmi plus de registres. L'espace pour le fichier de registre s'agrandit. Tout cela ralentit les choses. Donc, avec la même technologie, vous pourriez avoir 16 registres et fonctionner à 2600 MHz ou 32 registres et fonctionner à 2400 MHz. Maintenant, les registres supplémentaires doivent compenser une baisse significative de la vitesse d'horloge.

gnasher729
la source
2

Quel facteur a influencé le nombre de registres

- Hiérarchie de la mémoire

Les registres, le cache et la RAM sont tous implémentés avec différentes technologies de stockage.

Différentes technologies diffèrent

  1. Temps d'accès
  2. Coût
  3. Densité

Un exemple: les registres internes trouvés dans un processeur sont la mémoire à accès aléatoire statique , tandis que la mémoire principale de l'ordinateur est la mémoire à accès aléatoire dynamique

Une cellule binaire RAM statique est implémentée à l'aide d'un circuit à 6 transistors tandis qu'une cellule binaire RAM dynamique est implémentée à l'aide d'un condensateur et d'un transistor. Comparaison de SRAM et DRAM

  • La mémoire SRAM est beaucoup plus rapide que la mémoire DRAM [Peu de cycles pour accéder à la SRAM par rapport à la DRAM]
  • Le circuit SRAM consomme moins d'énergie que la DRAM
  • La DRAM nécessite un rafraîchissement périodique de chaque bit de la mémoire contrairement à la SRAM
  • SRAM coûte plus cher que DRAM
  • La SRAM a une densité plus faible que la DRAM

Il n'est donc pas pratique d'augmenter le nombre de mémoire rapide, coûteuse et moins dense. En fait, nous pourrions en utiliser quelques-uns et un programme bien écrit stockera les données utilisées les plus fréquentes dans ces registres rapides tandis que les données utilisées les moins fréquentes sont stockées dans la mémoire la plus lente.

- Durée de l'instruction

L'adresse des registres est incluse dans une instruction, ce qui limite le nombre de registres accessibles en fonction du nombre de bits pouvant représenter l'adresse. Par exemple, dans l'architecture MIPS, l'instruction de longueur 32 bits ne contient que 5 bits pour représenter l'adresse des registres accessibles, ce qui limite le nombre de registres à 2 5 = 32 registres. L'augmentation du nombre de registres nécessiterait d'augmenter la longueur de l'instruction afin d'inclure suffisamment de bits pouvant accéder à tous les registres.

Elbehery
la source
2

Si vous regardez le jeu d'instructions d'un processeur, il existe plusieurs façons de les regrouper. Par exemple, toutes les ADDinstructions peuvent être regroupées et toutes les XORinstructions.

Dans chaque groupe de la même instruction, il peut y avoir des versions qui fonctionnent sur la mémoire ou sur les registres. C'est ce sous-groupe qui définit efficacement le nombre de registres du processeur.

À titre d'exemple hypothétique sur 8 bits, disons que les $Axinstructions peuvent être des ADDinstructions et $Cxpeuvent être des XORinstructions. Avec cette conception, il ne reste que quatre bits pour définir les opérandes!

  • On peut n'avoir que quatre registres à usage général et utiliser deux bits pour définir l'un et deux bits pour définir l'autre.
  • Ou bien, on pourrait utiliser le premier bit pour distinguer les variantes "spéciales", et les 3 autres bits pour définir lequel des huit registres fonctionner avec l'accumulateur ( $x0pourrait être l'accumulateur lui-même).
  • Ou, on pourrait avoir plus que ce nombre de registres - mais alors limiter quels registres sont accessibles à quelles instructions.

Bien sûr, nous avons dépassé les jeux d'instructions 8 bits. Mais encore, cette logique a aidé à définir des ensembles de registres dans le passé - elle continuera de le faire à l'avenir.

MODIFIER (comme demandé)

Dites le haut quatre bits sont pour l'instruction: ADD, SUB, XOR, MOV, CMPetc. Il y a 16 possibilités ici. Ensuite, pour les instructions où le registre à registre est logique (par exemple ADD Rx,Ry), vous devez spécifier Rxet Ry. Disons que les deux bits suivants sont pour xet que les deux derniers sont pour y. Donc:

ADD R1, R2  =>  'ADD' + 'R1' + 'R2' => $A0 + $04 + $02

Avec seulement deux bits pour définir un registre comme celui-ci, vous n'avez que de la place pour un total de quatre registres!

En passant, vous remarquerez que certaines combinaisons de registres n'ont pas de sens. Par exemple, MOV Rx, Rx(ne fait rien) et SUB Rx, Rx(produit toujours 0). Celles-ci pourraient devenir des instructions spéciales:

  1. SUB Rx, Rxpourrait devenir NOT Rx- une instruction à un seul opérande.
  2. MOV Rx, Rxpourrait devenir une MOVinstruction qui prend un deuxième octet comme valeur immédiate, interprétée comme MOV Rx, #$yy.

De cette façon, vous pouvez "jouer" avec la carte d'instructions, en remplissant les trous pour des instructions autrement inutiles ou absurdes pour fournir un ensemble d'instructions plus large au programmeur. Mais finalement, l'ensemble d'instructions définit l'ensemble de registres.

John Burger
la source
Je suis toujours confus, pouvez-vous expliquer comment il ne reste que 4 bits pour les opérandes?
Darshan Chaudhary
Vérifiez ma réponse mise à jour
John Burger
1
À mon humble avis, cette réponse serait considérablement améliorée en déplaçant "l' exemple hypothétique supposé un ensemble d'instructions de 8 bits " au début de la question. J'ai perdu du temps à essayer de comprendre cela, j'ai conclu que cela n'avait de sens que pour une instruction de longueur fixe de 8 bits, puis j'ai lu pour trouver que c'était le cas. À mon humble avis, ce type de jeu d'instructions n'est pas très hors de propos dans le contexte de la question; tout son espace d'adressage pourrait être une RAM statique étroitement couplée. Je pense également que la partie commençant par " Certaines combinaisons de registres n'ont pas de sens ... " n'est pas pertinente pour la question et pourrait être supprimée. Mon 0,02 $
gbulmer
-2

Intel utilise aujourd'hui des milliers de registres - des centaines par cœur de processeur. Mais la plus grande quantité de données stockées sur un processeur se trouve dans le cache, ce qui répond indirectement à la question. Le cache est organisé en couches, avec un petit cache L1 rapide et des caches L2 et L3 plus lents plus loin. Le fichier de registre dans un sens est L0, encore plus rapide que L1 mais aussi encore plus petit. Ainsi, vous pourriez augmenter le nombre de registres, mais cela les ralentirait probablement.

MSalters
la source