Register sind theoretisch nicht erforderlich; Alle Mikroprozessoren würden weiterhin ohne Register arbeiten. Aber diese scheinbar triviale Ergänzung hat dazu beigetragen, Mikroprozessoren effizienter zu machen.
Warum können wir nicht mehr Register haben, um weiter davon zu profitieren? Sie sind nur Memory on Chip und man kann sich vorstellen, nicht sehr schwer hinzuzufügen? Welcher Faktor hat die Anzahl der Register so beeinflusst, wie sie jetzt sind und nicht, sagen wir 10x mehr?
microprocessor
Darshan Chaudhary
quelle
quelle
Antworten:
Es gibt mehrere Faktoren:
Hochleistungs-Mikroarchitekturen verwenden die Umbenennung von Registern. Das heißt, die Anzahl der physischen Register ist höher als die Anzahl der architektonisch sichtbaren Register und sie können deren unabhängige Verwendung verfolgen.
Verdoppelung der Anzahl der Register verdoppelt nicht die Leistung. ISTR (von Computer Architecture, A Quantitative Approach ), das von 16 auf 32 Register steigt, bringt unter der Annahme, dass der Anstieg keine nachteiligen Auswirkungen hat, eine Verbesserung um etwa 10% (was eine sehr optimistische Annahme ist).
Architektonisch sichtbare Register sind kostenpflichtig. Zum Beispiel:
quelle
Während Register und RAM beide Speicher sind, wird auf unterschiedliche Weise auf sie zugegriffen, um die Kosten (im Chipbereich oder von verborgenen Taktzyklen) des Zugriffs auf sie widerzuspiegeln.
Register sind eng an die ALU gebunden und können viele Funktionen von Datenquellen, Senken, Modifizierern usw. übernehmen. Sie benötigen daher eine Fülle von breiten Multiplexverbindungen. In einigen Architekturen können wir R1 <= R2 + R3 schreiben, und genau das passiert in einem einzigen Taktzyklus. Jedes Register wird direkt im Operationscode adressiert, diese Adressierung ist eine sehr begrenzte Ressource.
Da die Implementierung von Registern teuer ist, ist die Anzahl in den meisten Architekturen normalerweise auf die Größenordnung von 10/20 beschränkt.
Der Arbeitsspeicher ist lose an die CPU gebunden und wird normalerweise über eine einzige gemeinsam genutzte Verbindung geleitet. Dies macht es sehr viel billiger, eine große Menge an RAM zu implementieren. RAM-Adressen stammen im Allgemeinen von einer in einem Register gespeicherten Adresse, verbrauchen also keine signifikante Befehlsbreite.
SPARC ist eine interessante Architektur mit 72 bis 640 64-Bit-Registern und einem 32-Register-Kontext, der mit Überlappungen für schnelle Unterprogrammaufrufe mit Parameterübergabe verschoben werden kann. Sie finden sie normalerweise nicht auf PCs und Servern, auf denen die Kosten eine Rolle spielen, wie in 99,999% der Anwendungen.
quelle
Register müssen innerhalb der Instruktion adressiert werden. Wenn es viele Register gibt, ist der Befehl länger. Das Speichern und Wiederherstellen von Registerinhalten für einen Interrupt-Dienst benötigt mehr Zeit, wenn viele Register vorhanden sind.
quelle
Wie die meisten Dinge ist die Anzahl der Register ein Kompromiss zwischen Kosten, Komplexität und Nützlichkeit.
Register werden als statisches RAM mit mehreren Ports implementiert, wodurch sie teurer (Chipfläche) sind als andere Speicheroptionen.
Dann werden sie mit dem Befehlssatz des Prozessors gekoppelt, wobei ein Erhöhen der Anzahl von Registern die Komplexität des Befehlssatzes erhöht. Wenn Sie also mit dem Befehlssatz kompatibel bleiben möchten, können Sie nicht einfach die Anzahl der in der nächsten Prozessorgeneration verfügbaren Register erhöhen, um die Effizienz zu erhöhen, da die Programme diese nicht verwenden würden.
Wie viele Register benötigen Sie wirklich? Ihre Nützlichkeit ist begrenzt. Stellen Sie sich vor, Sie schreiben einen Algorithmus, der eine mathematische Operation mit 1024 Bytes ausführt. Nehmen wir an, Sie multiplizieren mit 5. Bei der aktuellen Registeranzahl erhalten Sie Folgendes:
Wenn Sie nun 1024 Register und alle darin gespeicherten Daten hätten, würde Ihr Programm folgendermaßen aussehen:
Da jeder von ihnen eine andere Anweisung ist, muss jeder einzelne von ihnen ausgeschrieben werden. Ihr benötigter Programmspeicher explodiert also. Nachdem Sie dies erkannt haben, möchten Sie vielleicht einige Anweisungen einführen, wie z
multiply register1 with register(2 to 256)
. Aber wann würden Sie aufhören, geben Sie eine Anleitung für alle Kombinationen?Vielleicht ist die Anzahl, über die wir derzeit verfügen, ein guter Kompromiss zwischen Kosten, Komplexität und Nützlichkeit.
quelle
multiply Register1 with Register2 multiply Register1 with Register3
für sehr unrealistisch, da die Daten direkt oder indirekt von außerhalb des Computers stammen müssen, die Register also geladen werden müssen und die Ergebnisse direkt oder indirekt irgendwo verwendet werden müssen, damit die Register gespeichert werden müssen. In der Realität wird ein anständiger Optimierungs-Compiler für eine Hochsprache die Schleife des ersten Programms "ausrollen", um so etwas wie das zweite Programm zu erstellen, wobei die Registernutzung, die Speicherlatenz, möglicherweise die Cache-Belegung und die Ausführungsgeschwindigkeit optimiert werden.multiply register1 with register(2 to 256)
Anweisungen sind nicht erforderlich . Das Pipelining verbessert den CPU-Durchsatz erheblich, insbesondere, um Anweisungen einfacher dekodieren und ausführen zu können. Der Effekt komplexer, massiver Varieté-Befehle kann also durch Verwendung mehrerer einfacher Befehle mit einer höheren Ausführungsrate erzielt werden. Eine größere Anzahl von Registern hilft, indem der Compiler viele unabhängige Anweisungen (solche, die kein Register gemeinsam haben) generieren kann, die unabhängig voneinander ausgeführt werden können, wodurch der Durchsatz verbessert wird. Ihr Beispiel = mehr Register sind besser.Register sind sehr teuer. Sehr teuer. Es sind nicht so sehr die Register selbst, sondern alle Verbindungen von und zu den Registern. Angenommen, Sie haben eine Anweisung reg1 = reg2 + reg3. Um dies schnell zu implementieren , müssen Sie in einem Zyklus Daten aus zwei Registern lesen und im zweiten Zyklus in ein anderes Register schreiben. Wenn Sie nun einen Prozessor haben, der mehrere Befehle pro Zyklus ausführen kann, beispielsweise drei Befehle, müssen Sie in der Lage sein, Daten aus sechs Registern pro Zyklus zu lesen und Daten in drei Register zu schreiben. Das ist eine schreckliche Menge sehr schneller Verbindungen.
Natürlich können Sie auch einfach mehr Transistoren verwenden. Das Problem ist: Die Geschwindigkeit sinkt. Sie benötigen mehr Hardware, um aus mehr Registern auswählen zu können. Der Platz für die Registerdatei wird größer. All das macht die Dinge langsamer. Mit der gleichen Technologie sind Sie möglicherweise in der Lage, 16 Register mit 2.600 MHz oder 32 Register mit 2.400 MHz zu betreiben. Jetzt müssen die zusätzlichen Register einen signifikanten Abfall der Taktrate ausgleichen.
quelle
- Speicherhierarchie
Register, Cache und RAM sind alle mit unterschiedlichen Speichertechnologien implementiert.
Unterschiedliche Technologien unterscheiden sich in
Ein Beispiel: Die internen Register in einer CPU sind statische Arbeitsspeicher , während der Hauptspeicher des Computers dynamischer Direktzugriffsspeicher ist
Eine statische RAM-Binärzelle wird unter Verwendung einer 6-Transistor-Schaltung implementiert, während eine dynamische RAM-Binärzelle unter Verwendung eines Kondensators und eines Transistors implementiert wird. Vergleich von SRAM und DRAM
Daher ist es nicht praktikabel, die Anzahl der schnellen, teuren Speicher mit geringerer Speicherdichte zu erhöhen. In der Tat könnten wir einige von ihnen verwenden, und ein gut geschriebenes Programm speichert die am häufigsten verwendeten Daten in diesen schnellen Registern, während die weniger häufig verwendeten Daten im langsameren Speicher gespeichert werden.
- Anweisungslänge
Die Adresse der Register ist in einem Befehl enthalten, der die Anzahl der zugreifbaren Register basierend auf der Anzahl der Bits begrenzt, die die Adresse darstellen können. Beispielsweise enthält in der MIPS-Architektur der 32-Bit-Längenbefehl nur 5 Bits, um die Adresse der zugreifbaren Register darzustellen, wodurch die Anzahl der Register auf 2 5 = 32 Register begrenzt wird. Das Erhöhen der Anzahl der Register würde das Erhöhen der Befehlslänge erfordern, um genügend Bits einzuschließen, die auf alle Register zugreifen könnten.
quelle
Wenn Sie sich den Befehlssatz eines Prozessors ansehen, gibt es verschiedene Möglichkeiten, diese zu gruppieren. Beispielsweise können alle
ADD
Anweisungen und alleXOR
Anweisungen zu einer Gruppe zusammengefasst werden .Innerhalb jeder Gruppe desselben Befehls kann es Versionen geben, die im Speicher oder in Registern arbeiten. Diese Untergruppierung definiert effektiv die Anzahl der Register, über die der Prozessor verfügt.
Nehmen wir als hypothetisches 8-Bit-Beispiel an, dass die
$Ax
Anweisungen dieADD
Anweisungen und$Cx
möglicherweise dieXOR
Anweisungen sind. Bei diesem Entwurf sind nur noch vier Bits zum Definieren der Operanden verfügbar!$x0
könnte der Akkumulator selbst sein).Natürlich sind wir hinter 8-Bit-Befehlssätzen. Diese Logik hat jedoch in der Vergangenheit bei der Definition von Registersätzen geholfen - und wird dies auch in Zukunft tun.
EDIT (wie gewünscht)
Sagen Sie den oberen vier Bits für den Befehl sind:
ADD
,SUB
,XOR
,MOV
,CMP
etc. Es gibt 16 Möglichkeiten. Dann wird für diese Befehle in dem Register-zu-Register ist sinnvoll (zBADD Rx,Ry
), müssen Sie angeben ,Rx
undRy
. Sagen wir, die nächsten beiden Bits sind fürx
und die letzten beiden sind füry
. Somit:Mit nur zwei Bits, um ein solches Register zu definieren, haben Sie nur Platz für insgesamt vier Register!
Im Übrigen werden Sie feststellen, dass einige Registerkombinationen keinen Sinn ergeben. Zum Beispiel
MOV Rx, Rx
(macht nichts) undSUB Rx, Rx
(produziert immer0
). Dies können spezielle Anweisungen sein:SUB Rx, Rx
werden könnteNOT Rx
- eine Einzeloperandenanweisung.MOV Rx, Rx
könnte zu einerMOV
Anweisung werden, die ein zweites Byte als unmittelbaren Wert annimmt und als interpretiert wirdMOV Rx, #$yy
.Auf diese Weise können Sie mit der Anweisungsübersicht "spielen" und die Löcher für ansonsten nutzlose oder unsinnige Anweisungen ausfüllen, um einen größeren Anweisungssatz für den Programmierer bereitzustellen. Letztendlich definiert der Befehlssatz den Registersatz.
quelle
Intel verwendet heutzutage Tausende von Registern - Hunderte pro CPU-Kern. Die größte Datenmenge, die auf einer CPU gespeichert ist, befindet sich jedoch im Cache, wodurch die Frage indirekt beantwortet wird. Der Cache ist in Schichten organisiert, mit einem kleinen schnellen L1-Cache und langsameren L2- und L3-Caches in größerer Entfernung. Die Registerdatei ist in gewissem Sinne L0, noch schneller als L1, aber auch noch kleiner. Sie könnten also die Anzahl der Register erhöhen, dies würde sie jedoch wahrscheinlich verlangsamen.
quelle