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?
microprocessor
Darshan Chaudhary
la source
la source
Réponses:
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:
la source
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.
la source
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.
la source
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:
Maintenant, si vous aviez 1024 registres et toutes les données qui y sont stockées, votre programme ressemblerait à:
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é.
la source
multiply Register1 with Register2 multiply Register1 with Register3
est 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.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.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.
la source
- 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
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
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.
la source
Si vous regardez le jeu d'instructions d'un processeur, il existe plusieurs façons de les regrouper. Par exemple, toutes les
ADD
instructions peuvent être regroupées et toutes lesXOR
instructions.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
$Ax
instructions peuvent être desADD
instructions et$Cx
peuvent être desXOR
instructions. Avec cette conception, il ne reste que quatre bits pour définir les opérandes!$x0
pourrait être l'accumulateur lui-même).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
,CMP
etc. Il y a 16 possibilités ici. Ensuite, pour les instructions où le registre à registre est logique (par exempleADD Rx,Ry
), vous devez spécifierRx
etRy
. Disons que les deux bits suivants sont pourx
et que les deux derniers sont poury
. Donc: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) etSUB Rx, Rx
(produit toujours0
). Celles-ci pourraient devenir des instructions spéciales:SUB Rx, Rx
pourrait devenirNOT Rx
- une instruction à un seul opérande.MOV Rx, Rx
pourrait devenir uneMOV
instruction qui prend un deuxième octet comme valeur immédiate, interprétée commeMOV 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.
la source
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.
la source