- Lernen
- Informatik & Informationswissenschaften
- Informatik
- Rechnerarchitektur – Prozessoren, Speicher und RISC-V
- Prozessor-Datenpfad und Pipelining
Prozessor-Datenpfad und Pipelining
MittelEinheit 4 von 6 in Kurs: Rechnerarchitektur – Prozessoren, Speicher und RISC-V
Was du lernst
- Benenne die Hardwareeinheiten, die ein RISC-V-Prozessor benötigt, verschalte sie so, dass arithmetische Befehle, Speicherbefehle und bedingte Sprünge jeweils in einem Taktzyklus abgeschlossen werden, und verfolge konkrete Befehle durch den entstandenen Datenpfad.
- Benenne die Bausteine eines Datenpfads und beschreibe ihre TaktungUnterscheide kombinatorische Schaltungselemente von Speicherelementen und beschreibe die Aufgaben von Befehlszähler, Speichern, Registersatz, ALU, Direktoperandengenerator, Addierern und Multiplexern.
- Verschalte den Datenpfad für arithmetische Befehle, Speicherbefehle und bedingte SprüngeErmittle, welche Einheiten und Verbindungen jede Befehlsklasse nutzt, und verbinde die einzelnen Pfade zu einem Datenpfad, wobei du an ihren Schnittstellen Multiplexer einsetzt.
- Verfolge Befehle durch den Einzyklus-DatenpfadVerfolge konkrete Befehle mit konkreten Register- und Speicherwerten durch jede Einheit, gib die Werte auf den wichtigsten Leitungen an und benenne, was sich an der Taktflanke ändert.
- Benenne die Bausteine eines Datenpfads und beschreibe ihre Taktung
- Leite die Steuersignale ab, mit denen der Datenpfad jeden Befehl ausführt. Nutze dazu ein vom Operationscode gesteuertes Hauptsteuerwerk und eine kleine, von den Funktionsfeldern gesteuerte ALU-Steuerung.
- Lege die Hauptsteuersignale für jeden Befehl festErkläre die Wirkung jedes Hauptsteuersignals, erstelle die Steuertabelle für R-Typ-, Lade- und Speicherbefehle sowie bedingte Sprünge und verwende Don't-Care-Werte korrekt.
- Leite den ALU-Steuercode aus ALUOp und den Funktionsfeldern abWandle mit zweistufiger Dekodierung das 2-Bit-Signal ALUOp sowie die Felder funct7 und funct3 des Befehls in den 4-Bit-Code um, der die ALU-Operation auswählt.
- Lege die Hauptsteuersignale für jeden Befehl fest
- Erkläre, wie die überlappende Ausführung von Befehlen den Durchsatz erhöht, beschreibe den fünfstufigen Pipeline-Datenpfad mit seinen Pipelineregistern und seiner Steuerung und verfolge Befehle anhand von Pipelinediagrammen.
- Erkläre, warum Pipelining einen Prozessor beschleunigtBestimme die Taktperiode eines Einzyklusentwurfs anhand seines kritischen Pfads und berechne dann Durchsatz, Latenz und Speedup einer Pipelineversion.
- Beschreibe den fünfstufigen Pipeline-Datenpfad und seine PipelineregisterErkläre, was die Pipelineregister enthalten, wie Steuersignale mit jedem Befehl weitergegeben werden und warum jeder Befehl alle fünf Stufen durchläuft.
- Verfolge Befehle anhand von PipelinediagrammenZeichne und lies Pipeline-Zeitdiagramme, bestimme für einen gegebenen Zyklus den Befehl in jeder Stufe und zähle die Gesamtzahl der Zyklen mit und ohne Pipeline-Stillstände.
- Erkläre, warum Pipelining einen Prozessor beschleunigt
- Erkenne, wann Befehle in der Pipeline in Konflikt geraten, und behebe Datenkonflikte durch Datenweiterleitung, Pipeline-Stillstände und Befehlsplanung.
- Erkenne Konflikte und die Datenabhängigkeiten, die sie verursachenOrdne Konflikte als Struktur-, Daten- oder Steuerkonflikte ein, finde die Abhängigkeiten zwischen Befehlen und ermittle, welche davon in einer Pipeline ohne Datenweiterleitung Stillstände verursachen.
- Leite Ergebnisse weiter, um Pipeline-Stillstände zu vermeidenErkläre die Weiterleitungspfade und die Bedingungen der Weiterleitungseinheit und bestimme für eine gegebene Befehlsfolge die Herkunft jedes ALU-Operanden.
- Füge bei Load-Use-Konflikten Wartezyklen ein und vermeide sie durch BefehlsplanungErkenne Load-Use-Konflikte, erkläre, wie die Pipeline eine Pipelineblase einfügt, und ordne Befehle um, um Pipeline-Stillstände zu vermeiden, ohne das Programmergebnis zu ändern.
- Erkenne Konflikte und die Datenabhängigkeiten, die sie verursachen
- Verringere die Kosten von Sprüngen durch frühe Sprungentscheidung, Pipeline-Flush und statische oder dynamische Sprungvorhersage und schätze ab, wie sich alle Konflikte zusammen auf die Rechenleistung der Pipeline auswirken.
- Verringere die Sprungverzögerung in der PipelineErkläre, warum Sprünge Steuerkonflikte verursachen, vergleiche Pipeline-Stillstände, die Vorhersage „Sprung nicht genommen“ und frühere Sprungentscheidungen und behandle Ausnahmen als verwandte Änderung des Kontrollflusses.
- Sage Sprünge anhand ihres bisherigen Verlaufs dynamisch vorausVerfolge 1-Bit- und 2-Bit-Sprungprädiktoren, erkläre die Sprungverlaufstabelle und den Sprungzielpuffer und erkenne, wo einfache Prädiktoren versagen.
- Schätze die Rechenleistung einer Pipeline unter Berücksichtigung von Konflikten abFasse Load-Use-Stillstände und Sprungverzögerungen zu einem effektiven CPI-Wert zusammen, berechne Ausführungszeiten und vergleiche Strategien zur Sprungbehandlung und Prozessorentwürfe.
- Verringere die Sprungverzögerung in der Pipeline
Prozessor-Datenpfad und Pipelining einfach erklärt
1Baue einen Einzyklus-Datenpfad auf
Ein Prozessor setzt Befehlsbits in Änderungen an Registern, Speicher und der nächsten Befehlsadresse um. Verfolge die Bausteine, die diese Arbeit leisten, und verbinde sie anschließend zu Pfaden für arithmetische Befehle, Lade- und Speicherbefehle sowie bedingte Sprünge. Konkrete Abläufe zeigen die Werte auf den Leitungen und die Änderungen, die an jeder Taktflanke gespeichert werden. Der Entwurf verwendet RV64-Register und eine kleine Auswahl von 4 Byte langen RISC-V-Befehlen, sodass jede Verbindung einen klaren Zweck hat.
1.1 Erkenne die Hardware und die Taktgrenze
Ein Datenpfad hält und verändert die Werte, die ein Befehl benötigt. Das Steuerwerk lenkt diese Werte und gibt Schreibzugriffe frei. Zusammen führen sie Befehle wie add, sub, and, or, ld, sd und beq aus.
Verfolge Werte zwischen Taktflanken
Ein Speicherelement merkt sich einen Wert: Beispiele sind der Befehlszähler, der Registersatz und der Datenspeicher. Ein kombinatorisches Schaltungselement erzeugt aus seinen aktuellen Eingaben eine Ausgabe. Addierer, Multiplexer, die ALU und der Direktoperandengenerator erfüllen diese Aufgabe, ohne das Ergebnis eines Befehls zwischen Zyklen zu speichern.
An der aktiven Taktflanke übernehmen Speicherelemente ihre nächsten Werte. Zwischen den Flanken speisen ihre Ausgänge die kombinatorische Logik. Der PC kann daher während eines Zyklus die aktuelle Adresse liefern und an dessen Ende die nächste Adresse übernehmen. Das Lesen eines Speicherelements überschreibt es nicht.
Befehle holen und auf Register zugreifen
Der Befehlszähler (PC) enthält die Befehlsadresse. Der Befehlsspeicher gibt den 32-Bit-Befehl an dieser Adresse zurück. In diesem Modell wird er während der Programmausführung nur gelesen und ordnet einer Adresse einen Befehl zu. Ein separater Addierer bildet PC + 4, weil die Befehle dieser Teilmenge 4 Bytes belegen.
Der Registersatz enthält x0–x31. Zwei Leseports nehmen die Quellregisternummern rs1 und rs2 entgegen und geben ihre Werte zurück. Ein Schreibport erhält das Zielregister rd, die Schreibdaten und RegWrite. Lesezugriffe erfolgen kombinatorisch; ein freigegebener Schreibzugriff wird an der Taktflanke gespeichert. Aus Register x0 wird immer null gelesen; Schreibzugriffe darauf werden verworfen. RV64-Register enthalten 64 Bit. Eine RV32-Version nutzt 32-Bit-Register und lw/sw mit denselben grundlegenden Verbindungen.
Rechnen, auswählen und auf den Speicher zugreifen
Die arithmetisch-logische Einheit (ALU) addiert, subtrahiert oder führt eine bitweise Operation aus. Ein 4-Bit-Steuercode wählt die Operation. Ihr Zero-Ausgang ist 1, wenn das Ergebnis null ist; durch Subtraktion lässt sich daher prüfen, ob zwei Werte gleich sind.
Der Direktoperandengenerator, ImmGen, setzt den Direktoperanden eines Befehls wieder zusammen und erweitert ihn mit Vorzeichen auf 64 Bit. Das Kopieren des Vorzeichenbits erhält einen negativen Wert. Das 12-Bit-Muster 1111 1111 1000 stellt −8 dar; eine Nullerweiterung würde daraus 4088 machen und eine Speicheroperation an die falsche Adresse lenken.
Ein Multiplexer, kurz Mux, wählt einen Eingang aus. Multiplexer wählen den zweiten ALU-Operanden, die Schreibdaten für den Registersatz und den nächsten PC-Wert. Ein Multiplexer ändert den Weg; eine Schreibfreigabe entscheidet, ob sich ein gespeicherter Wert ändert.
Der Datenspeicher hat Eingänge für Adresse und Schreibdaten, einen Ausgang für Lesedaten und die Steuersignale MemRead und MemWrite. Ein Ladebefehl muss im selben einzelnen Zyklus einen Befehl holen und auf Daten zugreifen. Getrennte Befehls- und Datenspeicher ermöglichen beide Zugriffe. Separate Addierer erlauben außerdem die Berechnung von PC + 4 und des Sprungziels, während die ALU andere Arbeit ausführt.
Nicht verwendete Ausgänge können sich während eines Zyklus trotzdem ändern. Eine korrekte Steuerung sorgt dafür, dass nur die ausgewählten Ausgänge zu freigegebenen Schreibzugriffen auf Speicherelemente gelangen. Ein berechneter Wert auf einer nicht ausgewählten Leitung hat keine Auswirkung auf das Programm.
Wichtige Erkenntnisse
- Der Datenpfad verarbeitet Werte; Steuersignale wählen Wege aus und geben Schreibzugriffe frei.
- Speicherelemente bewahren Werte über Taktflanken hinweg; kombinatorische Schaltungselemente verändern aktuelle Eingaben.
- Der Registersatz hat zwei Leseports und einen Schreibport, und aus x0 wird immer null gelesen.
- Die Vorzeichenerweiterung erhält den vorzeichenbehafteten Wert eines Direktoperanden.
- Getrennte Speicher und Addierer ermöglichen Arbeiten, die in einem einzelnen Zyklus gleichzeitig nötig sind.
1.2 Verschalte die Pfade für jede Befehlsklasse
Beginne mit der Frage, was jeder Befehl lesen und was er ändern muss. Der gemeinsame Datenpfad verbindet diese Wege; überall dort, wo alternative Werte auf einen Eingang treffen, steht ein Multiplexer.
Befehle holen und Felder dekodieren
Beim Holen wird der PC verwendet, um den Befehlsspeicher zu lesen; parallel wird PC + 4 berechnet. Der Operationscode belegt die Bits 6–0. Sofern vorhanden, liegt rd in den Bits 11–7, funct3 in 14–12, rs1 in 19–15 und rs2 in 24–20; funct7 beim R-Typ belegt die Bits 31–25. Da die Positionen der Quellfelder gleich bleiben, können Register gelesen werden, während die Steuerung für den Befehl dekodiert wird. Ein Speicherbefehl oder bedingter Sprung hat kein rd-Feld: Die Bits 11–7 tragen zu seinem Direktoperanden bei.
Vergleiche die Ausführungspfade
| Befehl | ALU-Eingaben und Aktion | Datenspeicher | Gespeichertes Ergebnis |
|---|---|---|---|
add x5, x6, x7 | x6 + x7 | Kein Zugriff | Summe nach x5 |
ld x5, 16(x6) | x6 + 16 | Lesen an der effektiven Adresse | Speicherdaten nach x5 |
sd x5, 24(x6) | x6 + 24 | x5 an die effektive Adresse schreiben | Speicher ändert sich |
beq x8, x9, offset | x8 − x9 | Kein Zugriff | Nächsten PC-Wert auswählen |
Bei einem Ladebefehl ist das ALU-Ergebnis eine effektive Adresse, also die Adresse der zu lesenden Daten. Die Speicherausgabe gelangt dann zurück zum Registersatz. Auch ein Speicherbefehl bildet mit der ALU eine Adresse, aber sein zweiter Quellwert gelangt getrennt zum Schreibdateneingang des Speichers. Wird ein Direktoperand als ALU-Operand ausgewählt, darf dieser Speicherwert nicht verworfen werden. ImmGen setzt den Offset im S-Format aus seinen beiden Bitgruppen wieder zusammen.
Ein bedingter Sprung führt zwei Operationen parallel aus. Die ALU subtrahiert die verglichenen Registerwerte; Zero zeigt an, ob sie übereinstimmen. Der Sprungaddierer addiert den vorzeichenbehafteten Byteoffset zum PC-Wert des Sprungbefehls. Die Kodierung im B-Format lässt das stets null gesetzte niederwertigste Bit aus. ImmGen kann den vollständigen Byteoffset einschließlich dieser Null rekonstruieren; eine Darstellung, die den Offset stattdessen in Halbwort-Einheiten erzeugt, benötigt eine Linksverschiebung um ein Bit. Die Verschiebung gehört genau einmal in den Pfad.
Führe die Pfade mit Multiplexern zusammen
ALUSrc wählt entweder den Wert von rs2 oder den Direktoperanden für den zweiten ALU-Eingang. MemtoReg wählt entweder das ALU-Ergebnis oder die Datenspeicherausgabe für das Zurückschreiben in den Registersatz. PCSrc wählt PC + 4 oder das Sprungziel. Zwei konkurrierende Ergebnisse benötigen einen Auswahlschalter, keine direkte Verbindung ihrer Ausgänge.
Diese Pfade zeigen, warum der Ladebefehl die längste Kette hat: Befehl holen, Register lesen, Adresse berechnen, Speicher lesen und Register schreiben tragen alle dazu bei. Arithmetische Befehle umgehen den Datenspeicher; ein Speicherbefehl umgeht das Zurückschreiben in den Registersatz.
Erweitere die bestehenden Wege
addi x5, x6, 3 nutzt den ALU-Pfad für den Direktoperanden und den Rückschreibpfad für das ALU-Ergebnis erneut. Er benötigt eine passende Steuerung, aber keine neue Datenpfadeinheit. jal hat eine zusätzliche Anforderung: Der Befehl schreibt PC + 4 nach rd und lenkt gleichzeitig den PC ohne Gleichheitsprüfung um. Sein Multiplexer für das Zurückschreiben benötigt daher einen Eingang für PC + 4, und die Logik für den nächsten PC-Wert muss einen unbedingten Sprung unterstützen.
Wichtige Erkenntnisse
- Ein Ladebefehl schreibt Speicherdaten nach rd; seine ALU-Ausgabe ist die Adresse.
- Ein Speicherbefehl sendet rs2 an den Speicher, während die ALU Basis und Offset addiert.
- Ein bedingter Sprung vergleicht Registerwerte und berechnet parallel PC + Offset.
- ALUSrc, MemtoReg und PCSrc wählen gemeinsame Wege aus.
- Bei der Rekonstruktion des Byteoffsets im B-Format wird das implizite Nullbit genau einmal berücksichtigt.
- Die Addition mit Direktoperand nutzt vorhandene Hardware erneut; ein Sprung mit Rückadressensicherung benötigt zusätzlich einen Rückschreibpfad für PC + 4.
1.3 Verfolge die Werte und Zustandsänderungen
Das Nachverfolgen eines Befehls verbindet die Assembleroperation mit konkreten Leitungswerten. Unterscheide Werte, die während des Zyklus berechnet werden, von Werten, die an der abschließenden Taktflanke gespeichert werden.
Verwende eine einheitliche Reihenfolge
- Hole den Befehl am aktuellen PC-Wert und bestimme seine Felder.
- Lies die Quellregister und bilde den vorzeichenbehafteten Direktoperanden.
- Wähle die ALU-Operanden und berechne das Ergebnis.
- Führe den angeforderten Datenspeicherzugriff aus.
- Wähle die Schreibdaten für den Registersatz und den nächsten PC-Wert.
- Liste die Schreibzugriffe auf Speicherelemente an der Taktflanke auf.
Addiere zwei Registerwerte
Bei PC 400 hat add x5, x6, x7 die Kodierung 0x007302B3. Seine Felder sind Operationscode 0110011, rd 5, funct3 000, rs1 6, rs2 7 und funct7 0000000. Bei x6 = 25 und x7 = −9 geben die Leseports 25 und −9 aus. ALUSrc wählt den zweiten Registerwert, und die ALU erzeugt 16. MemtoReg wählt 16 zum Zurückschreiben. An der Flanke wird x5 zu 16 und der PC zu 404. MemRead und MemWrite sind beide null.
Lade und speichere ein Doppelwort
Betrachte bei PC 404 den Befehl ld x5, 16(x6) mit x6 = 1000 und dem Wert 42 im Speicher an Adresse 1016. ImmGen gibt 16 aus. Die ALU berechnet die Adresse 1016, und der Datenspeicher gibt 42 zurück. MemtoReg wählt diesen Speicherwert, sodass x5 an der Flanke zu 42 und der PC zu 408 wird. Würde 1016 in x5 geschrieben, wäre die Adresse mit dem dort gespeicherten Wert verwechselt worden.
Bei PC 408 liest sd x5, 24(x6) die Werte x5 = 42 und x6 = 1000. Die ALU berechnet 1024, während der rs2-Pfad dem Speicher den Wert 42 liefert. MemWrite gibt das Speichern frei; RegWrite ist null. An der Flanke wird das Doppelwort an Adresse 1024 zu 42 und der PC zu 412. Speicheradresse und Speicherwert laufen über unterschiedliche Leitungen.
Die Offsets werden in Bytes gemessen. Benachbarte RV64-Doppelwörter beginnen im Abstand von 8 Bytes: Nach dem Doppelwort an Adresse 1016 beginnt das nächste bei 1024. Ein Schritt um ein Byte würde nicht zum nächsten Doppelwort führen.
Entscheide einen Sprung
Bei PC 412 vergleicht beq x8, x9, 12 den Wert x8 = 7 mit x9 = 7. Die ALU subtrahiert und erhält null. Branch ist 1, also ist Branch AND Zero gleich 1, und PCSrc wählt das Sprungziel. Der Sprungaddierer erzeugt 424, indem er 12 zu 412 addiert. Nur der PC ändert sich.
Ist x9 stattdessen 8, ergibt die Subtraktion −1 und Zero ist 0. Der nächste PC-Wert ist dann 416. Der kodierte Offset wird in Einheiten von 2 Bytes angegeben, sodass der gespeicherte vorzeichenbehaftete Wert für diesen Versatz von 12 Bytes gleich 6 ist; der vom Addierer verwendete vollständige Versatz ist weiterhin 12.
Lies den Zustand für den nächsten Befehl
Jeder Einzyklusbefehl schließt seine Arbeit zwischen benachbarten Taktflanken ab. Der nächste Befehl liest den Zustand, der an der vorherigen Flanke gespeichert wurde. Somit kann der Speicherbefehl im nächsten Zyklus den neuen x5-Wert des Ladebefehls ohne Datenweiterleitung in einer Pipeline lesen. Jeder Befehl benötigt einen Taktzyklus, was einen Einzyklus-CPI-Wert von 1 ergibt, unabhängig davon, wie viele Hardwareeinheiten sein Pfad nutzt.
Wichtige Erkenntnisse
- Ein Ablauf zeigt numerische Leitungswerte und benennt gesondert die Zustandsänderungen an der Taktflanke.
- Ein arithmetischer Befehl schreibt ein ALU-Ergebnis; ein Ladebefehl schreibt die Speicherausgabe.
- Ein Speicherbefehl ändert den Speicher und den PC, ohne in den Registersatz zu schreiben.
- Bei beq wählt Gleichheit das Ziel aus, dessen Offset vom PC-Wert des Sprungbefehls aus gemessen wird.
2Entwirf das Steuerwerk für den Einzyklusprozessor
Dieselbe Hardware kann zwei Register addieren, eine Speicheradresse berechnen oder Werte für einen bedingten Sprung vergleichen. Steuersignale entscheiden, welche Aktion in jedem Zyklus wirksam ist. Leite diese Signale aus der Arbeit ab, die ein Befehl ausführen muss, einschließlich der Schreibfreigaben, die gespeicherte Zustände schützen. Verfolge dann die beiden Dekodierungsstufen, die einen Operationscode und Funktionsbits in eine bestimmte ALU-Operation umwandeln, und erweitere den Entwurf um die Addition mit Direktoperand.
2.1 Leite die Hauptsteuertabelle her
Das Hauptsteuerwerk übersetzt einen Operationscode in Auswahlsignale und Schreibfreigaben. Es ist eine kombinatorische Wahrheitstabelle, die mit Logikgattern implementiert wird: ein festverdrahtetes Steuerwerk.
Weise jedem Signal eine Aufgabe zu
RegWrite gibt einen Schreibzugriff auf rd frei. ALUSrc wählt den zweiten ALU-Eingang: 0 für rs2, 1 für einen Direktoperanden. MemRead und MemWrite fordern den entsprechenden Datenspeicherzugriff an. MemtoReg wählt die Schreibdaten für den Registersatz: 0 für das ALU-Ergebnis, 1 für Speicherdaten. Branch kennzeichnet einen Gleichheitssprung. Das 2-Bit-Signal ALUOp teilt der separaten ALU-Steuerung mit, welche Operationsklasse benötigt wird.
PCSrc ist anders: Es hängt vom Befehl und den verglichenen Werten ab. Das Hauptsteuerwerk setzt Branch, und die ALU liefert Zero. Deren AND-Verknüpfung bildet PCSrc, sodass ein gewöhnliches arithmetisches Ergebnis von null allein keinen Sprung auslösen kann.
Erstelle die Tabelle aus den nötigen Aktionen
| Klasse | ALUSrc | MemtoReg | RegWrite | MemRead | MemWrite | Branch | ALUOp |
|---|---|---|---|---|---|---|---|
| R-Typ | 0 | 0 | 1 | 0 | 0 | 0 | 10 |
ld | 1 | 1 | 1 | 1 | 0 | 0 | 00 |
sd | 1 | X | 0 | 0 | 1 | 0 | 00 |
beq | 0 | X | 0 | 0 | 0 | 1 | 01 |
Bei ld benötigt die ALU einen Offset als Direktoperanden, also ist ALUSrc gleich 1. Die geladenen Daten gelangen nach rd, sodass MemtoReg und RegWrite beide 1 sind. Der Speicher wird gelesen, nicht beschrieben; daraus folgen MemRead = 1 und MemWrite = 0. Branch ist 0, und ALUOp = 00 fordert die Addition zur Adressbildung an.
Bei sd addiert die ALU ebenfalls einen Offset, aber das Ziel ist der Speicher. Setze MemWrite = 1 und RegWrite = 0. MemRead bleibt null: Den Speicher zu nutzen bedeutet nicht, ihn zu lesen. Bei beq nutzt die ALU beide Registerwerte und subtrahiert, während die einzige mögliche Änderung des architektonischen Zustands den PC betrifft.
Verwende Don't-Care-Werte nur bei ignorierten Ergebnissen
X ist ein Don't-Care-Wert: Beide Auswahlwerte führen zum selben Verhalten. MemtoReg darf bei einem Speicherbefehl oder bedingten Sprung X sein, weil RegWrite null ist. Der Schreibdateneingang des Registersatzes wird ignoriert, sodass beim Entwurf der Auswahlwert gewählt werden kann, der die Schaltung vereinfacht.
Eine Schreibfreigabe für ein Speicherelement darf nicht so behandelt werden, wenn ein Schreibzugriff verboten ist. Ein versehentliches MemWrite während eines arithmetischen Befehls kann den Speicher verändern, obwohl der arithmetische Befehl die entsprechende Speicherausgabe sonst nicht benötigt. RegWrite und MemWrite müssen daher für Befehle, die diese Schreibzugriffe nicht ausführen, ausdrücklich null sein.
Ergänze eine Zeile für Arithmetik mit Direktoperand
addi x5, x6, 3 bezieht seinen zweiten Operanden von ImmGen und schreibt die ALU-Summe. Seine Zeile lautet ALUSrc 1, MemtoReg 0, RegWrite 1, MemRead 0, MemWrite 0, Branch 0, ALUOp 00. Sein Operationscode 0010011 unterscheidet sich vom R-Typ-Operationscode 0110011, daher benötigt das Hauptsteuerwerk diese zusätzliche Zeile. Um andi und ori zu unterstützen, müssen auch ihre funct3-Werte dekodiert werden, um die Operation auszuwählen.
Signalnamen hängen vom Entwurf ab. RegWEn, BSel und WBSel in anderen Kursdiagrammen beschreiben verwandte Aufgaben der Schreibfreigabe und Eingangsauswahl. Achte beim Lesen eines neuen Diagramms auf die Definition eines Signals und die Eingänge seines Multiplexers.
Wichtige Erkenntnisse
- Das Hauptsteuerwerk leitet aus dem Operationscode die Auswahl der Wege und die Schreibfreigaben ab.
- PCSrc verknüpft Branch mit dem Zero-Flag der ALU.
- Ein Speicherbefehl aktiviert MemWrite und deaktiviert RegWrite und MemRead.
- Ein Auswahlsignal ist nur dann ein Don't-Care-Wert, wenn der ausgewählte Wert das Verhalten nicht beeinflussen kann.
- addi benötigt eine neue Operationscodezeile, nutzt aber den vorhandenen Datenpfad für die Addition mit Direktoperand erneut.
2.2 Dekodiere die ALU-Operation in zwei Stufen
Der Operationscode allein kann add nicht von sub unterscheiden: Beide gehören zur R-Typ-Klasse. Die zweistufige Steuerung bestimmt zuerst die Klasse und nutzt dann die Funktionsbits, wo sie relevant sind.
Von ALUOp zur Operation
Das Hauptsteuerwerk liefert neben seinen anderen Ausgaben ein 2-Bit-Signal ALUOp. Die ALU-Steuerung kombiniert es mit funct3 und Bit 30 des Befehls, einem Teil von funct7, und erzeugt vier Operationssteuerbits.
| ALUOp | Zusätzliche Information | ALU-Steuercode | Operation |
|---|---|---|---|
| 00 | Funktionsbits ignoriert | 0010 | Addieren |
| 01 | Funktionsbits ignoriert | 0110 | Subtrahieren |
| 10 | funct3 000, Bit 30 = 0 | 0010 | Addieren |
| 10 | funct3 000, Bit 30 = 1 | 0110 | Subtrahieren |
| 10 | funct3 111 | 0000 | AND |
| 10 | funct3 110 | 0001 | OR |
Diese Codes beschreiben diese ALU-Implementierung, keine RISC-V-Befehlskodierungen. Lade- und Speicherbefehle nutzen ALUOp 00, weil sie Basis und Offset addieren. Gleichheitssprünge nutzen ALUOp 01, weil die Subtraktion bei übereinstimmenden Operanden Zero erzeugt. R-Typ-Befehle nutzen ALUOp 10 und benötigen weitere Dekodierung.
Verfolge eine kodierte Subtraktion
sub x5, x6, x7 hat die Kodierung 0x407302B3. Der Operationscode 0110011 bezeichnet den R-Typ und wählt ALUOp 10. Das funct3-Feld ist 000, sodass Addition und Subtraktion möglich bleiben. Bit 30 ist 1, aus funct7 0100000, also gibt die ALU-Steuerung 0110 für die Subtraktion aus.
Wird dieses Funktionsbit auf null geändert, ergibt sich die entsprechende add-Kodierung 0x007302B3 mit funct7 0000000 und ALU-Steuercode 0010. Die Zeile des Hauptsteuerwerks bleibt gleich, weil beide Befehle zwei Registereingaben nutzen, ein ALU-Ergebnis schreiben und nicht auf den Datenspeicher zugreifen.
Verwende den Addierer für die Subtraktion erneut
In der klassischen ALU stehen die Steuerleitungen für Ainvert, Bnegate und einen 2-Bit-Operationsauswahlschalter. Die Subtraktion nutzt den Addierer, nachdem der zweite Operand invertiert und ein Eingangsübertrag von 1 angelegt wurde:
Diese Zweierkomplement-Gleichung ermöglicht es Addition und Subtraktion, Hardware gemeinsam zu nutzen. Der Unterschied bei Bnegate erklärt die Codes 0010 und 0110; er erfordert keinen separaten arithmetischen Pfad für jeden Befehl.
Dekodiere Bits nur im passenden Format
Bei ALUOp 00 oder 01 wählen die Positionen der Funktionsfelder nicht die ALU-Operation aus. Das funct3-Feld 011 eines Ladebefehls beschreibt einen Doppelwortzugriff. Höherwertige Bits von Speicherbefehlen und bedingten Sprüngen enthalten Bits des Direktoperanden. Würden diese Positionen als R-Typ-Funktionsfelder behandelt, würde die Adressbildung mit der arithmetischen Dekodierung verwechselt.
Für eine schnelle R-Typ-Prüfung: ALUOp 10 mit funct3 110 wählt 0001, die OR-Operation. Wird unter demselben Operationscode eine weitere Operation ergänzt, muss unter Umständen nur die ALU-Steuerung geändert werden, sofern die ALU sie bereits unterstützt. Eine neue Befehlsklasse kann auch Änderungen am Hauptsteuerwerk erfordern, wie bei der Arithmetik mit Direktoperand.
Wichtige Erkenntnisse
- ALUOp wählt eine Operationsklasse; beim R-Typ schließen die Funktionsbits die Dekodierung ab.
- ALUOp 00 fordert Addition und 01 Subtraktion an, ohne die Funktionsfelder zu dekodieren.
- In diesem Entwurf wählt 0010 die Addition und 0110 die Subtraktion.
- Bit 30 unterscheidet add von sub, wenn funct3 gleich 000 ist.
- Die Bedeutung der Funktionsfelder hängt vom Befehlsformat ab.
- Die Subtraktion im Zweierkomplement nutzt die Addition mit invertiertem zweitem Operanden und Eingangsübertrag 1.
3Unterteile den Datenpfad in Pipelinestufen
Ein langer Einzyklustakt muss für einen Ladebefehl ausreichen, selbst wenn der aktuelle Befehl weniger Arbeit benötigt. Pipelining teilt diese Arbeit in Stufen auf und überlappt die Befehlsausführung. Vergleiche die entstehende Taktperiode, den Durchsatz und die Latenz und verfolge dann die Daten und Steuersignale, die zwischen den Stufen gespeichert werden. Pipelinediagramme machen die Überlappung sichtbar und ermöglichen es, das Füllen, den laufenden Betrieb und den Abschluss einer kurzen Befehlsfolge direkt zu zählen.
3.1 Berechne Taktperiode, Latenz und Durchsatz
Ein Einzyklusprozessor muss seinen langsamsten Befehl vor der nächsten Flanke abschließen. Schnellere Befehle warten trotzdem denselben festen Takt ab. Pipelining ändert, wie viel Arbeit jede Taktperiode enthalten muss.
Bestimme die Grenze des Einzyklusentwurfs
Verwende diese Bauteilverzögerungen und vernachlässige Multiplexer und kleine Addierer: Befehl holen 250 ps, Register lesen 150 ps, ALU 200 ps, Datenspeicher 250 ps und Register schreiben 150 ps.
| Befehl | Pfadverzögerung |
|---|---|
| R-Typ | 250 + 150 + 200 + 150 = 750 ps |
ld | 250 + 150 + 200 + 250 + 150 = 1000 ps |
sd | 250 + 150 + 200 + 250 = 850 ps |
beq | 250 + 150 + 200 = 600 ps |
Der Ladebefehl bildet den kritischen Pfad und legt die Periode auf 1000 ps oder 1 ns fest. Das entspricht einem Takt von 1 GHz. Ein Mix aus 25 % Ladebefehlen, 10 % Speicherbefehlen, 50 % R-Typ-Befehlen und 15 % bedingten Sprüngen hat eine gewichtete Pfadverzögerung von 800 ps. Dennoch erhält jeder Befehl 1000 ps, also das 1,25-Fache dieses Durchschnitts. Eine durchschnittliche Verzögerung kann keinen Takt festlegen, der auch für den längsten Befehl ausreichen muss.
Überlappe fünf Stufen
Die Pipeline teilt die Ausführung in IF (Befehl holen), ID (dekodieren und Register lesen), EX (ausführen oder eine Adresse berechnen), MEM (auf den Datenspeicher zugreifen) und WB (ein Register schreiben). Verschiedene Befehle belegen gleichzeitig verschiedene Stufen.
Der Durchsatz zählt abgeschlossene Befehle pro Zeiteinheit. Die Latenz misst die Zeit, die ein Befehl vom Eintritt bis zum Abschluss benötigt. Ein Fließband kann pro Zeitabschnitt ein Stück fertigstellen, selbst wenn jedes Stück mehrere Abschnitte für den Durchlauf benötigt. Dieselbe Unterscheidung gilt hier.
Die langsamste Stufe benötigt 250 ps. Bei 20 ps Pipelineregister-Overhead beträgt die Taktperiode 270 ps, etwa 3,70 GHz. Ein Befehl durchläuft fünf Perioden und benötigt 1350 ps. Das übersteigt seine Einzykluslatenz, aber eine gefüllte Pipeline kann alle 270 ps einen Befehl abschließen.
Berücksichtige Füll- und Abschlusszeit
Ohne Pipeline-Stillstände führt eine k-stufige Pipeline n Befehle in k + n − 1 Zyklen aus. Für fünf Stufen sind das n + 4. Vier Befehle benötigen acht Zyklen und damit 2160 ps, verglichen mit 4000 ps im Einzyklusprozessor. Der Speedup beträgt etwa 1,85.
Für 1.000.000 Befehle benötigt die Pipeline 1.000.004 Zyklen, ungefähr 270,0 μs. Der Einzyklusentwurf benötigt 1000 μs. Der Speedup nähert sich dem Verhältnis 1000/270, etwa 3,70, wenn die festen Kosten für das Füllen und Leeren klein werden.
Ein perfekter fünffacher Speedup würde fünf gleich langsame Stufen zu je 200 ps ohne Register-Overhead oder konfliktbedingte Verzögerungen voraussetzen. Bei ungleichen Stufen warten schnellere Stufen auf die langsamste. Mehr Stufen verursachen außerdem zusätzlichen Overhead und können die Kosten von Konflikten erhöhen.
Die feste Befehlslänge von 32 Bit in dieser Teilmenge vereinfacht das Holen. Gleichbleibende Registerfelder unterstützen ID, und die Beschränkung der Datenspeicherzugriffe auf Lade- und Speicherbefehle passt zur Adressberechnung in EX mit anschließendem MEM-Zugriff. Diese Eigenschaften der Befehlssatzarchitektur machen die Stufengrenzen praktikabel.
Wichtige Erkenntnisse
- Der langsamste vollständige Befehl legt die Taktperiode des Einzyklusprozessors fest.
- Die langsamste Stufe und der Register-Overhead legen die Taktperiode der Pipeline fest.
- Pipelining erhöht den Durchsatz; die Latenz eines einzelnen Befehls kann steigen.
- Eine konfliktfreie Folge von n Befehlen benötigt in einer fünfstufigen Pipeline n + 4 Zyklen.
- Ungleiche Stufen, Register-Overhead, kurze Befehlsfolgen und Konflikte verringern den Speedup.
3.2 Führe jeden Befehl durch Pipelineregister
Mehrere Befehle teilen sich den Datenpfad gleichzeitig, sodass jede Stufe die Werte ihres eigenen Befehls benötigt. Pipelineregister bewahren diese Werte und ihre Steuersignale an jeder Taktflanke.
Ordne den Inhalt den späteren Aufgaben zu
| Register | Weitergegebene Informationen |
|---|---|
| IF/ID | Befehl und sein PC-Wert |
| ID/EX | Quellwerte, Direktoperand, PC, rs1, rs2, rd, Funktionsbits, Steuersignale für EX/MEM/WB |
| EX/MEM | ALU-Ergebnis, Zero, Sprungziel, Speicherwert, rd, Steuersignale für MEM/WB |
| MEM/WB | Speicherdaten, ALU-Ergebnis, rd, Steuersignale für WB |
Jedes Register ist nach seinen benachbarten Stufen benannt. Es übernimmt die Ausgaben der ersten Stufe zur Verwendung in der zweiten. Nach WB gibt es kein zusätzliches Pipelineregister; WB schreibt den architektonischen Zustand. Der PC liefert den Zustand vor dem Holen.
Der obige Inhalt von EX/MEM unterstützt einen Entwurf, der die Sprunginformation in MEM verwendet. Ein Entwurf, der Sprünge in EX entscheidet, gibt diese Information früher an die Holstufe zurück. Die entscheidende Stufe bestimmt die Verzögerung durch den Steuerkonflikt.
Halte Zielregister und Daten zusammen
Ein Ladebefehl wird in ID dekodiert, schreibt rd aber erst drei Zyklen später in WB. Zu diesem Zeitpunkt enthält IF/ID einen jüngeren Befehl. Würde der Schreibport rd dieses jüngeren Befehls verwenden, gelangte der geladene Wert in das falsche Register. Die Zielregisternummer des Ladebefehls muss daher neben seinem Ergebnis durch ID/EX, EX/MEM und MEM/WB weitergegeben werden.
Ein Speicherbefehl führt entsprechend seinen rs2-Wert durch ID/EX und EX/MEM mit. Seine Adresse und seine Daten müssen denselben Speicherbefehl betreffen, wenn sie den Datenspeicher erreichen. Pipelineregister bewahren die Identität eines Befehls durch diese zusammengehörigen Werte, obwohl mehrere andere Befehle gleichzeitig aktiv sind.
Gib die Steuerung mit dem Befehl weiter
Die Steuersignale werden in ID erzeugt. EX nutzt ALUSrc und ALUOp; MEM nutzt Branch, MemRead und MemWrite; WB nutzt MemtoReg und RegWrite. Jede Stufe gibt die später benötigten Steuersignale zusammen mit den Daten weiter.
Wird der ALU-Steuercode in EX dekodiert, muss ID/EX neben ALUOp auch Bit 30 und funct3 mitführen. R-Typ-Operationen haben alle ALUOp 10, sodass dieser Wert allein add, sub, AND und OR nicht unterscheiden kann. Ein anderer gültiger Entwurf dekodiert die vollständige 4-Bit-Operation in ID und führt stattdessen diesen Code mit.
Halte den Stufenablauf einheitlich
Ein R-Typ-Befehl durchläuft MEM, ohne den Datenspeicher zu nutzen. Ein Speicherbefehl durchläuft WB, ohne ein Register zu schreiben. Wenn alle Befehle denselben fünfstufigen Ablauf einhalten, bleibt die Reihenfolge der Registerschreibzugriffe erhalten. Würde ein R-Typ-Befehl MEM überspringen, könnte er im selben Zyklus wie der unmittelbar vorherige Ladebefehl den einzigen Registerschreibport erreichen.
Der Registersatz bedient WB und ID in einem Zyklus, indem er in der ersten Hälfte schreibt und in der zweiten liest. ID kann dann einen Wert sehen, den ein älterer Befehl in diesem Zyklus geschrieben hat. Getrennte Befehls- und Datenspeicher ermöglichen den gleichzeitigen Betrieb von IF und MEM.
Die meisten Informationen bewegen sich in der Pipeline vorwärts. Das Zurückschreiben sendet ein Ergebnis an den Registersatz zurück, und die Sprungsteuerung sendet eine Entscheidung über den nächsten PC-Wert an die Holstufe zurück. Diese langen Rückwege erklären, warum spätere Befehle möglicherweise Unterstützung benötigen, bevor ein älterer Befehl abgeschlossen ist.
Wichtige Erkenntnisse
- Pipelineregister bewahren die Daten und noch benötigten Steuersignale jedes Befehls.
- rd wird neben dem zugehörigen Ergebnis bis nach WB weitergegeben.
- EX benötigt die Funktionsbits oder einen bereits dekodierten ALU-Steuercode.
- Alle Befehle behalten den fünfstufigen Ablauf bei, auch wenn eine Stufe keine Arbeit ausführt.
- Schreiben in der ersten und Lesen in der zweiten Zyklushälfte ermöglichen es WB, ID im selben Zyklus mit einem Wert zu versorgen.
- Getrennte Speicher ermöglichen das gleichzeitige Holen von Befehlen und den Zugriff auf Daten.
3.3 Lies Pipelinediagramme und zähle Zyklen
Ein Pipelinediagramm macht die Überlappung sichtbar. Die Zeilen zeigen Befehle in Programmreihenfolge, die Spalten zeigen Taktzyklen. Jede Zelle nennt die Stufe, die der betreffende Befehl während des jeweiligen Zyklus belegt.
Zeichne eine Treppe
Trage für fünf unabhängige Befehle IF für I1 in Zyklus 1 ein, danach ID, EX, MEM und WB in den Zyklen 2–5. Beginne I2 einen Zyklus später und wiederhole den Ablauf. Die Stufennamen bilden eine diagonale Treppe.
| Befehl | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|---|---|---|---|---|---|---|---|---|---|
| I1 | IF | ID | EX | MEM | WB | ||||
| I2 | IF | ID | EX | MEM | WB | ||||
| I3 | IF | ID | EX | MEM | WB | ||||
| I4 | IF | ID | EX | MEM | WB | ||||
| I5 | IF | ID | EX | MEM | WB |
In Zyklus 5 ist I1 in WB, I2 in MEM, I3 in EX, I4 in ID und I5 in IF. Liest du eine Spalte von oben nach unten, erhältst du eine Momentaufnahme eines Zyklus. Eine Zeile zeigt den Verlauf eines einzelnen Befehls.
Nummeriere die Stufen von IF = 1 bis WB = 5. Ohne Pipeline-Stillstände erreicht Befehl i die Stufe s in Zyklus i + s − 1. I3 erreicht MEM daher in Zyklus 6. Die letzte WB-Zelle gibt den Abschlusszyklus an: Fünf Befehle enden in Zyklus 9.
Ergänze Werte in einer Momentaufnahme
I1 sei ld x5, 16(x6) mit x6 = 1000 und dem Wert 42 im Speicher an Adresse 1016. I2 sei eine unabhängige Addition, I3 eine unabhängige Subtraktion und I4 eine unabhängige OR-Operation. In Zyklus 4 liest der Ladebefehl den Speicher an Adresse 1016, I2 nutzt die ALU, I3 liest Register und I4 wird geholt. In Zyklus 5 schreibt der Ladebefehl 42 in x5. Eine Spalte enthält Arbeit mehrerer Befehle, nicht mehrere Stufen des Ladebefehls.
Zeige einen Stillstand, ohne ältere Arbeit anzuhalten
Verwende nun ld x10, 0(x20) gefolgt von add x11, x10, x12 und danach einem unabhängigen Befehl. Auch mit Datenweiterleitung benötigt der unmittelbar verbrauchende Befehl einen Stillstandszyklus:
- Der Ladebefehl belegt IF 1, ID 2, EX 3, MEM 4, WB 5.
- Der add-Befehl belegt IF 2, ID 3, erneut ID 4, EX 5, MEM 6, WB 7.
- Der dritte Befehl belegt IF 3, erneut IF 4, ID 5, EX 6, MEM 7, WB 8.
Der add-Befehl wartet in ID, während eine Pipelineblase EX durchläuft. Der Ladebefehl läuft normal weiter; würde er angehalten, käme gerade der Wert später an, den add benötigt. Jeder jüngere Befehl wird zusammen mit add verzögert.
Zähle die Befehlsfolge einmal
Eine fünfstufige Pipeline benötigt ohne Stillstände n + 4 Zyklen. Jeder eingefügte Stillstandszyklus kommt hinzu. Wenn keine weiteren Verluste auftreten, ergibt das n + 4 + Stillstandszyklen. Das Beispiel mit drei Befehlen endet in Zyklus 8: drei Befehle, vier zusätzliche Stufenintervalle und ein Stillstandszyklus.
In den ersten vier Zyklen wird die Pipeline gefüllt, in den letzten vier geleert. Das sind zwei Sichtweisen auf denselben Ablauf mit n + 4 Zyklen, nicht zwei getrennte Zuschläge von je vier Zyklen. Bei einer langen Folge ist ihr fester Beitrag klein; bei einer kurzen Folge kann er den Speedup maßgeblich bestimmen.
Wichtige Erkenntnisse
- Zeilen verfolgen jeweils einen Befehl; Spalten zeigen gleichzeitig ausgeführte Arbeit.
- Ohne Pipeline-Stillstände belegt Befehl i die Stufe s in Zyklus i + s − 1.
- Bei einem Stillstand wird ID wiederholt und das Holen jüngerer Befehle angehalten, während ältere Befehle weiterlaufen.
- Bei einem fünfstufigen Ablauf ohne weitere Verluste beträgt die Gesamtzahl der Zyklen n + 4 + Stillstandszyklen.
4Erkenne und behebe Datenkonflikte
Bei überlappender Befehlsausführung kann ein Wert benötigt werden, bevor der erzeugende Befehl ihn in den Registersatz geschrieben hat. Bestimme für jeden Quelloperanden den tatsächlichen Erzeuger und verfolge dann die Weiterleitungspfade, die neue Ergebnisse an spätere Befehle liefern. Ladebefehle zeigen die zeitliche Grenze der Datenweiterleitung: Ihre Daten kommen für einen unmittelbar verbrauchenden Befehl zu spät. Verfolge den nötigen Pipeline-Stillstand und sieh, wie das Verschieben unabhängiger Arbeit die Verzögerung beseitigen kann, ohne das Programmergebnis zu ändern.
4.1 Finde Abhängigkeiten, die die Ausführung verzögern können
Ein Konflikt verhindert, dass der nächste Befehl in seinem geplanten Zyklus ausgeführt wird. Um ihn zu untersuchen, bestimme die benötigte Ressource oder den benötigten Wert, den Zyklus, in dem sie oder er gebraucht wird, und den Zyklus, in dem sie oder er verfügbar wird.
Unterscheide drei Konfliktarten
| Art | Konflikt | Beispiel |
|---|---|---|
| Strukturkonflikt | Gleichzeitiger Bedarf an einer Ressource | IF und MEM benötigen denselben Speicher mit einem Port |
| Datenkonflikt | Ein benötigter Wert liegt noch nicht vor | Eine Subtraktion benötigt das Ergebnis der vorherigen Addition |
| Steuerkonflikt | Die richtige nächste Adresse steht noch nicht fest | Das Holen geht weiter, bevor ein Sprung entschieden ist |
Getrennte Befehls- und Datenspeicher beseitigen den IF/MEM-Strukturkonflikt. Wird der Registersatz in der ersten Hälfte eines Zyklus beschrieben und in der zweiten gelesen, können auch WB und ID ihn gemeinsam nutzen. Durch diese Maßnahmen gibt es in diesem fünfstufigen Modell keinen Strukturkonflikt.
Bestimme den tatsächlichen Erzeuger
Eine echte Datenabhängigkeit (RAW) liegt vor, wenn ein späterer Befehl einen Wert liest, den ein früherer schreibt. Bei add x1, x2, x3 gefolgt von sub x4, x1, x5 erzeugt der add-Befehl x1 und der sub-Befehl verbraucht den Wert. Ohne weitere Maßnahmen liest sub x1 in ID während Zyklus 3, bevor add den Wert in WB während Zyklus 5 schreibt.
Eine Gegenabhängigkeit (WAR) verwendet ein Register erneut, nachdem ein älterer Befehl es gelesen hat. Bei einer Ausgabeabhängigkeit (WAW) haben zwei Befehle dasselbe Zielregister. Diese Namensabhängigkeiten verursachen im fünfstufigen Entwurf mit Ausführung in Programmreihenfolge keine Konflikte: Lesezugriffe erfolgen in ID und Schreibzugriffe in WB, jeweils in Programmreihenfolge. Sie sind wichtig, wenn entschieden wird, ob Software Befehle umordnen darf.
Verfolge eine Folge mit wiederholten Zielregistern
Betrachte:
ld x5, 0(x10)
add x6, x5, x7
sub x5, x8, x9
or x9, x6, x5
Die RAW-Abhängigkeiten sind Ladebefehl → add über x5, add → OR über x6 und Subtraktion → OR über x5. OR benötigt den neuen x5-Wert der Subtraktion, nicht den älteren geladenen Wert. Wer nur nach gleichen Registernamen sucht, kann diesen Wechsel des Erzeugers übersehen.
Die Subtraktion schreibt x5, nachdem add x5 gelesen hat: eine WAR-Abhängigkeit. Ladebefehl und Subtraktion haben außerdem eine WAW-Abhängigkeit bezüglich x5. OR schreibt x9, nachdem die Subtraktion es gelesen hat: eine weitere WAR-Abhängigkeit. Keine davon erzeugt in dieser Pipeline mit geordneter Ausführung einen WAR- oder WAW-Hardwarekonflikt.
Zähle Wartezyklen ohne Datenweiterleitung
Steht nur der Registersatz mit Schreiben vor Lesen zur Verfügung, benötigt ein unmittelbar verbrauchender Befehl zwei Stillstandszyklen. Er muss seinen ID-Lesezugriff von Zyklus 3 auf Zyklus 5 verschieben. Ein unabhängiger Befehl zwischen Erzeuger und Verbraucher verringert dies auf einen Stillstandszyklus. Mit zwei unabhängigen Befehlen erreicht der Verbraucher ID im WB-Zyklus des Erzeugers und benötigt keinen Stillstand.
Eine Abhängigkeit ist eine Eigenschaft des Programms; ob sie einen Stillstand verursacht, hängt vom zeitlichen Ablauf und den verfügbaren Pfaden ab. Eine zeitlich entfernte RAW-Abhängigkeit kann ohne Maßnahmen auskommen. Register x0 liefert nie ein ausstehendes Ergebnis, weil daraus immer null gelesen wird und Schreibzugriffe ignoriert werden.
Software kann nop-Befehle einfügen oder unabhängige Arbeit in Warteintervalle verschieben. Hardware kann Ergebnisse weiterleiten oder automatisch Stillstände einfügen. Beide Ansätze müssen sicherstellen, dass jeder verbrauchende Befehl den Wert erhält, den sein in Programmreihenfolge zugehöriger Erzeuger schreibt.
Wichtige Erkenntnisse
- Struktur-, Daten- und Steuerkonflikte betreffen unterschiedliche Arten von Konflikten.
- RAW bezeichnet einen Erzeuger, dessen Wert ein späterer Befehl liest.
- In diesem fünfstufigen Entwurf mit Ausführung in Programmreihenfolge verursachen nur RAW-Abhängigkeiten Datenkonflikte.
- Der nächstgelegene frühere Befehl, der ein Quellregister schreibt, liefert dessen benötigten Wert.
- Ohne Datenweiterleitung wartet ein unmittelbar verbrauchender Befehl zwei Zyklen; ein Befehl dazwischen verringert die Wartezeit auf einen Zyklus.
- WAR und WAW schränken weiterhin ein, wie Software Befehle zulässig umordnen kann.
4.2 Wähle durch Datenweiterleitung den neuesten verfügbaren Wert
Ein ALU-Ergebnis liegt bereits vor, bevor es in ein Register zurückgeschrieben wird. Die Datenweiterleitung, auch Bypassing genannt, leitet dieses Ergebnis direkt an den Eingang eines späteren Befehls und vermeidet so das Warten auf den Registersatz.
Wähle die Quelle für jeden Operanden
Zwei Multiplexer speisen die Ausführungspfade. ForwardA bedient rs1 und ForwardB bedient rs2. Jeder Operand wird unabhängig geprüft.
| Auswahlcode | Wertquelle |
|---|---|
| 00 | In ID/EX mitgeführter Registerwert |
| 10 | In EX/MEM mitgeführtes ALU-Ergebnis |
| 01 | In MEM/WB mitgeführter Rückschreibwert |
Der EX/MEM-Pfad erreicht den unmittelbar folgenden Befehl. Der MEM/WB-Pfad erreicht einen um zwei Positionen späteren Befehl und kann entweder ein ALU-Ergebnis oder geladene Daten übertragen. ForwardB speist außerdem den Pfad für die zu speichernden Daten, bevor ALUSrc zwischen diesem Wert und einem Direktoperanden wählt.
Prüfe Freigabe, Zielregister und Übereinstimmung
Für ForwardA = 10 muss der Befehl in EX/MEM RegWrite = 1 und ein von null verschiedenes rd haben, und rd muss gleich ID/EX.rs1 sein. Ersetze für die ForwardB-Prüfung rs1 durch rs2. Ein Speicherbefehl oder bedingter Sprung darf nicht als Erzeuger behandelt werden, nur weil seine Befehlsbits zufällig einer Zielregisternummer ähneln. Auch Schreibzugriffe auf x0 dürfen nicht zu weitergeleiteten Werten werden.
Für ForwardA = 01 führe die entsprechenden Prüfungen auf RegWrite, ein von null verschiedenes rd und übereinstimmende Registernummern für MEM/WB durch. Nutze dieses ältere Ergebnis nur, wenn EX/MEM den benötigten Operanden nicht bereits liefert. ForwardB folgt unabhängig derselben Prioritätsregel.
Verfolge ein Ergebnis zu späteren Verbrauchern
Beginne mit add x1, x2, x3, wobei x2 = 10 und x3 = 5 gilt. Der Befehl erzeugt am Ende von EX in Zyklus 3 den Wert 15.
- Der nächste Befehl,
sub x4, x1, x5, erreicht EX in Zyklus 4. Bei x5 = 3 liefert ForwardA = 10 den Wert 15 und die Subtraktion ergibt 12. and x6, x7, x1erreicht EX in Zyklus 5. ForwardB = 01 übernimmt x1 aus MEM/WB.or x8, x1, x9liest Register in ID während Zyklus 5, nach dem Schreibzugriff von add in der ersten Zyklushälfte. In EX benötigt der Befehl keine Datenweiterleitung.
Für diese Abhängigkeiten von ALU-Ergebnissen ist kein Pipeline-Stillstand nötig. Der verbrauchende Befehl erhält den Wert, wenn er die ALU nutzt, selbst wenn sein früherer ID-Lesezugriff einen veralteten Wert geliefert hat.
Löse zwei übereinstimmende Schreibzugriffe auf
Bei drei aufeinanderfolgenden Befehlen add x1, x1, x2, add x1, x1, x3 und add x1, x1, x4 stimmen sowohl EX/MEM als auch MEM/WB mit rs1 des dritten Befehls überein. EX/MEM enthält das Ergebnis des zweiten add-Befehls, den neuesten x1-Wert. MEM/WB enthält das Ergebnis des ersten add-Befehls und muss zurückstehen.
Dieselben Pfade ermöglichen es add x5, x6, x7, den Wert ohne Pipeline-Stillstand an sd x5, 0(x8) zu liefern. Der weitergeleitete x5-Wert erreicht den Schreibdatenpfad des Speichers, während die ALU des Speicherbefehls den Offset als Direktoperanden nutzt.
Datenweiterleitung kann keine Daten liefern, bevor sie vorliegen. EX/MEM enthält bei einem Ladebefehl dessen Adresse, nicht den geladenen Wert. Der unmittelbar verbrauchende Befehl muss warten, bis der Ladebefehl MEM abgeschlossen hat; würde die Adresse weitergeleitet, würde unbemerkt mit der falschen Größe gerechnet.
Wichtige Erkenntnisse
- Datenweiterleitung liefert ein Ergebnis vor dem Zurückschreiben in den Registersatz direkt an einen späteren Befehl.
- 00 wählt ID/EX, 10 wählt EX/MEM und 01 wählt MEM/WB.
- Jede Übereinstimmung für die Datenweiterleitung setzt RegWrite, ein von null verschiedenes rd und eine übereinstimmende Quellregisternummer voraus.
- Für denselben Operanden hat EX/MEM Vorrang vor MEM/WB.
- ForwardB kann sowohl Speicherdaten als auch einen ALU-Registeroperanden liefern.
- Ein unmittelbar auf einen Ladebefehl folgender Verbraucher benötigt weiterhin einen Stillstandszyklus, weil die Daten noch nicht vorliegen.
4.3 Füge eine Pipelineblase ein oder fülle die Lücke mit nützlicher Arbeit
Ein Ladebefehl erzeugt Daten am Ende von MEM. Der unmittelbar folgende Befehl würde diese Daten im selben Zyklus zu Beginn von EX benötigen. Ein Stillstandszyklus verschiebt die EX-Stufe des verbrauchenden Befehls in den nächsten Zyklus, wenn MEM/WB den Wert liefern kann.
Erkenne den fehlenden Wert in ID
Die Konflikterkennungseinheit untersucht den Befehl in EX und den Befehl, der gerade dekodiert wird. Der grundlegende Test prüft ID/EX.MemRead = 1 und eine Übereinstimmung zwischen ID/EX.rd und einem der beiden Quellnummernfelder in IF/ID. Ein verfeinerter Test schließt rd = x0 aus und prüft, welche Quellfelder der dekodierte Befehl tatsächlich liest.
Diese letzte Prüfung vermeidet einen unnötigen Stillstand bei einem I-Typ-Befehl, dessen Direktoperandenbits die übliche rs2-Position belegen. Der Vergleich der bloßen Feldpositionen ist sicher, kann aber einen Befehl verzögern, der das Register gar nicht liest.
Halte jüngere Arbeit an und führe den Ladebefehl weiter
Der Pipeline-Stillstand führt drei aufeinander abgestimmte Aktionen aus:
- Setze die nach ID/EX eingehenden Steuersignale auf null und füge so eine Pipelineblase ein.
- Setze PCWrite = 0, damit die Adresse zum Holen unverändert bleibt.
- Setze IF/IDWrite = 0, damit der in ID wartende Befehl erhalten bleibt.
Der Ladebefehl und ältere Befehle laufen weiter. Die Pipelineblase durchläuft spätere Stufen, ohne Register oder Speicher zu beschreiben. Würde ID/EX angehalten, während der Ladebefehl noch darin steht, würde der Ladebefehl wiederholt, statt eine leere Operation einzufügen.
Bei ld x10, 0(x20) gefolgt von add x11, x10, x12 ist der Ladebefehl in Zyklus 3 in EX und der add-Befehl in ID. In Zyklus 4 ist der Ladebefehl in MEM, die Pipelineblase in EX und der add-Befehl weiterhin in ID. In Zyklus 5 ist der Ladebefehl in WB und add erreicht EX mit ForwardA = 01.
Plane unabhängige Befehle ein
Betrachte:
ld x10, 0(x20)
ld x11, 8(x20)
add x12, x10, x11
sd x12, 24(x20)
ld x13, 16(x20)
add x14, x10, x13
sd x14, 32(x20)
Die Verwendungen von x11 und x13 folgen unmittelbar auf ihre Ladebefehle. Auch mit Datenweiterleitung verursachen sie zwei Stillstandszyklen, was 7 + 4 + 2 = 13 Zyklen ergibt. Verschiebe ld x13, 16(x20) an die dritte Stelle vor den ersten add-Befehl. Dadurch wird der Ladebefehl für x11 von seinem Verbraucher getrennt und der Ladebefehl für x13 ausreichend weit vor seinen Verbraucher gesetzt. Die Folge benötigt nun 7 + 4 = 11 Zyklen.
Die Verschiebung ist zulässig, weil der Ladebefehl x20 liest, das die übersprungenen Befehle nicht ändern. Sein Zielregister x13 beeinflusst diese Befehle nicht. Seine Adresse x20 + 16 unterscheidet sich von x20 + 24 des übersprungenen Speicherbefehls. Ein Ladebefehl darf nicht über einen Speicherbefehl hinweg verschoben werden, der möglicherweise die Bytes schreibt, die er liest. Die Umordnung muss RAW-, WAR-, WAW- und Speicherabhängigkeiten erhalten.
Kombiniere Stillstände und Datenweiterleitung
Bei ld x5, 0(x10), add x6, x5, x7, sub x5, x8, x9 und or x9, x6, x5 verursacht nur das unmittelbare Load-Use-Paar einen Stillstand. Wenn OR EX erreicht, liefert ForwardA = 01 den x6-Wert von add und ForwardB = 10 den x5-Wert von sub. Insgesamt sind es 4 + 4 + 1 = 9 Zyklen.
Wichtige Erkenntnisse
- Ein Load-Use-Paar benötigt mit Datenweiterleitung einen Stillstandszyklus.
- Ein Stillstand setzt die eingehenden ID/EX-Steuersignale auf null und hält PC und IF/ID fest.
- Der Ladebefehl läuft durch MEM weiter, während der verbrauchende Befehl in ID wartet.
- Durch das Einplanen unabhängiger Arbeit können Ladebefehle von ihren Verbrauchern getrennt werden.
- Eine zulässige Umordnung erhält Register- und Speicherabhängigkeiten.
- Wähle nach einem Stillstand jeden weitergeleiteten Operanden von seinem eigenen tatsächlichen Erzeuger.
- Für diese fünfstufigen Folgen gilt: Zyklen = Befehle + 4 + Stillstandszyklen.
5Behandle Steuerkonflikte und sage Sprünge voraus
Bei einem bedingten Sprung hängt die nächste Befehlsadresse von Arbeit ab, die noch in der Pipeline stattfindet. Verfolge, was geschieht, wenn die Holstufe wartet, die nächste Adresse vorhersagt oder eine Fehlvorhersage korrigiert. Verfolge verlaufsbasierte Prädiktoren und unterscheide ihre Richtungsvorhersagen von gespeicherten Sprungzielen. Kombiniere schließlich Load-Use-Verzögerungen und Sprungverzögerungen mit der Taktperiode, um Ausführungszeiten zu vergleichen, einschließlich der Zielkonflikte durch tiefere Pipelines.
5.1 Reagiere auf Sprünge und Ausnahmen
Die Holstufe benötigt in jedem Zyklus eine neue Adresse. Ein bedingter Sprung liefert die richtige Auswahl erst nach seinem Vergleich und der Zielberechnung. Diese Lücke erzeugt einen Steuerkonflikt.
Setze Entscheidungsstufe und Verzögerung in Beziehung
In einer fünfstufigen Pipeline, bei der nach der entscheidenden Stufe umgelenkt wird, geht bei einer Fehlvorhersage ein Holplatz verloren, wenn das Ergebnis am Ende von ID bekannt ist. Eine Entscheidung am Ende von EX kostet zwei, am Ende von MEM drei Plätze. Jüngere Befehle sind während dieser Plätze bereits in die Pipeline eingetreten.
Eine Strategie hält das Holen an, bis jeder Sprung entschieden ist. Sie ist einfach, aber genommene und nicht genommene Sprünge verursachen beide die volle Wartezeit. Die Vorhersage „Sprung nicht genommen“ fährt stattdessen bei PC + 4 fort. Eine richtige Vorhersage erfordert keine Korrektur. Ein genommener Sprung lenkt das Holen um und verwirft die jüngeren Befehle des sequenziellen Pfads.
Verfolge einen genommenen Sprung
Hole beq x1, x2, 16 an Adresse 100 in Zyklus 1 und entscheide den Sprung am Ende von EX in Zyklus 3. Die Vorhersage „nicht genommen“ holt die Adressen 104 und 108 in den Zyklen 2 und 3. Wird der Sprung genommen, liegen beide Befehle auf dem falschen Pfad. Nach einer Verzögerung von zwei Zyklen beginnt das Holen in Zyklus 4 bei 116.
Ein Pipeline-Flush verhindert, dass diese jüngeren Einträge den architektonischen Zustand ändern oder Ausnahmen auslösen. Die Implementierung kann Einträge für ungültig erklären oder ihre Steuersignale und Ausnahmeeffekte unterdrücken. Ein Speicherbefehl auf dem falschen Pfad darf niemals einen wirksamen Schreibzugriff auf den Speicher ausführen.
Eine Pipelineblase ist nicht dasselbe wie ein RISC-V-Befehl, dessen Bits alle null sind. Die Kodierung aus lauter Nullen ist ungültig. Wird eine echte Befehlskodierung eingefügt, ist der kanonische nop addi x0, x0, 0, kodiert als 0x00000013. Ein verworfener Pipelineeintrag steht dagegen für keinen ausgeführten Befehl.
Entscheide früher, aber beschaffe Operanden früher
Werden der Vergleicher und der Sprungzieladdierer nach ID verlegt, sinkt die Umlenkungsverzögerung auf einen Zyklus. Der Vergleich benötigt seine Quellwerte nun in ID, sodass die übliche Datenweiterleitung nach EX allein nicht ausreicht. Mit geeigneter Datenweiterleitung nach ID wartet ein Sprung unmittelbar nach seinem erzeugenden ALU-Befehl einen Zyklus. Unmittelbar nach einem erzeugenden Ladebefehl wartet er zwei Zyklen. Die frühere Entscheidung tauscht weniger verlorene Holplätze gegen höhere Anforderungen an die Bereitstellung der Operanden.
Die statische Sprungvorhersage legt eine Regel im Voraus fest. Übliche Regeln sind immer nicht genommen, immer genommen und rückwärts genommen/vorwärts nicht genommen. Ein Rückwärtssprung am Ende einer Schleife wiederholt oft die Schleife, sodass seine Richtung ein nützlicher Hinweis ist.
RISC-V hat keinen Branch Delay Slot. Wird ein Sprung genommen, wird sein sequenzieller Nachfolger nicht allein deshalb ausgeführt, weil er geholt wurde. Einige ältere MIPS-Entwürfe führten diesen Nachfolger als definierten Befehl im Delay Slot aus; das ist eine andere Regel der Befehlssatzarchitektur.
Bewahre eine präzise Ausnahmegrenze
Ein ungültiger Befehl oder ecall überträgt die Steuerung an eine Behandlungsroutine. Ältere Befehle werden abgeschlossen; der fehlerauslösende Befehl und jüngere Befehle übernehmen ihre normalen Auswirkungen nicht in den architektonischen Zustand. Der Prozessor speichert den PC-Wert des auslösenden Befehls und die Ursache, etwa in den Registern sepc/scause im Supervisormodus oder mepc/mcause im Maschinenmodus, und holt dann Befehle von der Behandlungsroutine. Diese präzise Ausnahme zeigt den Zustand als Grenze zwischen abgeschlossenen älteren Befehlen und nicht abgeschlossener späterer Arbeit.
Wichtige Erkenntnisse
- Je später ein Sprung entschieden wird, desto mehr jüngere Befehle müssen verworfen werden.
- Die Vorhersage „nicht genommen“ verursacht nur bei einer Fehlvorhersage eine Korrekturverzögerung.
- Ein Pipeline-Flush unterdrückt Zustandsänderungen und Ausnahmen auf dem falschen Pfad.
- Befehlsbits aus lauter Nullen sind ungültig; der kanonische nop ist 0x00000013.
- Eine frühe Entscheidung in ID benötigt auch frühere Operanden und geeignete Datenweiterleitung.
- RISC-V hat keinen architektonischen Branch Delay Slot.
- Präzise Ausnahmen bewahren abgeschlossene ältere Arbeit und verwerfen die Auswirkungen des auslösenden und jüngerer Befehle.
5.2 Verfolge verlaufsbasierte Sprungvorhersagen
Die dynamische Sprungvorhersage lernt aus Ergebnissen, die während der Programmausführung beobachtet werden. Eine Sprungverlaufstabelle (BHT) speichert kleine Zustandseinträge, die anhand von Bits einer Sprungadresse ausgewählt werden. Sage zuerst voraus, vergleiche später mit dem tatsächlichen Ergebnis und aktualisiere dann den Eintrag.
Sieh, warum ein Bit bei einer Schleife zweimal falschliegt
Ein 1-Bit-Prädiktor speichert das vorherige Ergebnis. Wurde der letzte Sprung genommen, sagt er für das nächste Mal „genommen“ voraus; andernfalls sagt er „nicht genommen“ voraus. Bei einer wiederholt aufgerufenen Schleife, deren Sprung neunmal genommen und dann einmal nicht genommen wird, bleibt das Bit beim Verlassen auf „nicht genommen“ stehen.
Beim nächsten Aufruf wird der erste genommene Sprung falsch vorhergesagt. Die dazwischenliegenden genommenen Sprünge stellen das Bit auf „genommen“, sodass auch das abschließende Verlassen mit „nicht genommen“ falsch vorhergesagt wird. Im eingeschwungenen Zustand sind das zwei Fehler bei zehn Ergebnissen oder 80 % Genauigkeit.
Ergänze ein zweites Bit für Beständigkeit
Ein 2-Bit-Sättigungszähler hat die Zustände 0 bis 3. Die Zustände 0 und 1 sagen „nicht genommen“ voraus; 2 und 3 sagen „genommen“ voraus. Ein genommenes Ergebnis erhöht den Zähler um eins, ein nicht genommenes verringert ihn um eins. Bei 0 und 3 bleiben die Werte stehen.
| Zustand | Name | Vorhersage |
|---|---|---|
| 0 | Stark nicht genommen | Nicht genommen |
| 1 | Schwach nicht genommen | Nicht genommen |
| 2 | Schwach genommen | Genommen |
| 3 | Stark genommen | Genommen |
Aus Zustand 3 führt ein einmaliges Verlassen mit „nicht genommen“ in Zustand 2, der weiterhin „genommen“ vorhersagt. Der nächste Schleifeneintritt wird daher richtig vorhergesagt. Dieselbe Schleife mit zehn Ergebnissen hat im eingeschwungenen Zustand einen Fehler pro Aufruf oder 90 % Genauigkeit. Ausgehend von einem starken Zustand sind zwei aufeinanderfolgende entgegengesetzte Ergebnisse nötig, um die Vorhersage umzukehren.
Verfolge erst die Vorhersage, dann die Aktualisierung
Beginne in Zustand 1 und beobachte genommen, genommen, nicht genommen, genommen:
- Zustand 1 sagt „nicht genommen“ voraus: falsch. Erhöhe auf 2.
- Zustand 2 sagt „genommen“ voraus: richtig. Erhöhe auf 3.
- Zustand 3 sagt „genommen“ voraus: falsch. Verringere auf 2.
- Zustand 2 sagt „genommen“ voraus: richtig. Erhöhe auf 3.
Es gibt zwei Fehler und der Endzustand ist 3. Würde vor der Vorhersage aktualisiert, hätte der Prädiktor fälschlich Zugriff auf das Ergebnis, das er vorhersagen soll.
Unterscheide Richtung, Ziel und gegenseitige Störung
Zwei Sprungadressen können denselben BHT-Eintrag indizieren. Durch dieses Aliasing können sich ihre Ergebnisse gegenseitig stören. Eine Fehlvorhersage kostet Zyklen, aber bei der Korrektur wird das tatsächliche Ergebnis geprüft und die Korrektheit gewahrt.
Ein Sprungzielpuffer (BTB) liefert eine Adresse, nicht nur ein Richtungsbit. Wird er während IF mit dem PC abgefragt, kann er vor der Dekodierung das vorhergesagte Ziel eines genommenen Sprungs für den nächsten Holzyklus liefern. Die Richtungsvorhersage entscheidet, ob dieses Ziel verwendet wird.
Ein einfacher Verlauf hat Grenzen. Bei einem streng zwischen genommen und nicht genommen wechselnden Muster liegt ein 1-Bit-Prädiktor durchgehend falsch, nachdem er sich auf das Muster eingestellt hat. Ein 2-Bit-Zähler liegt höchstens in der Hälfte der Fälle richtig; beginnt er vor einem genommenen Ergebnis in Zustand 1, liegt er jedes Mal falsch. Korrelierende Prädiktoren berücksichtigen zusätzlich den jüngsten Sprungverlauf, Turnierprädiktoren wählen zwischen Prädiktoren, und ein Rückadressstapel sagt Ziele von Prozedurrücksprüngen voraus. Tiefere Pipelines machen die Korrektur teurer, weil sich vor der Entscheidung mehr jüngere Arbeit ansammelt.
Wichtige Erkenntnisse
- Ein 1-Bit-Prädiktor wiederholt das letzte Ergebnis.
- Ein 2-Bit-Zähler sagt in den Zuständen 2 und 3 „genommen“ voraus und bleibt bei 0 und 3 stehen.
- Die Vorhersage nutzt den alten Zustand; die Aktualisierung folgt dem tatsächlichen Ergebnis.
- Zwei Bits vermeiden den Fehler beim Schleifeneintritt, der durch ein einzelnes Verlassen entsteht.
- Durch BHT-Aliasing können verschiedene Sprünge denselben Verlaufseintrag stören.
- Ein BTB liefert ein vorhergesagtes Ziel; die Richtungsvorhersage entscheidet, ob es genutzt wird.
5.3 Berechne aus Konfliktraten die Ausführungszeit
Die Geschwindigkeit einer Pipeline hängt sowohl von der Taktperiode als auch von den Zyklen ab, die durch Warten oder Korrekturen anfallen. Der effektive CPI-Wert misst diese zusätzlichen Zyklen im Durchschnitt über die Befehlsfolge.
Gewichte jede Verzögerung nach den betroffenen Befehlen
Beginne für eine lange Folge mit Einfachausgabe beim idealen CPI-Wert 1. Addiere jede einzelne, nicht überlappende Ursache verlorener Zyklen als Anteil betroffener Befehle mal verlorene Zyklen pro Ereignis. Bei einer bedingten Rate brauchst du auch den Anteil der übergeordneten Gruppe.
Angenommen, 25 % der Befehle sind Ladebefehle, und auf 40 % dieser Ladebefehle folgt ein unmittelbarer Verbraucher. Jedes solche Paar verursacht einen Stillstandszyklus, sodass der Load-Use-Beitrag 0,25 × 0,40 × 1 = 0,10 Zyklen pro Befehl beträgt. Angenommen, 15 % sind bedingte Sprünge, 10 % davon werden falsch vorhergesagt und die Korrektur kostet zwei Zyklen. Der Sprungbeitrag beträgt 0,15 × 0,10 × 2 = 0,03.
Die Addition der unabhängigen Beiträge ergibt CPI-Wert = 1 + 0,10 + 0,03 = 1,13. Würde jedem Ladebefehl ein Stillstandszyklus angelastet, ergäbe das 0,25 statt 0,10. Würde die Sprungfehlerrate von 10 % auf jeden Befehl angewandt, würde ebenfalls zu viel gezählt.
Berücksichtige Taktperiode und Befehlsanzahl
Die Ausführungszeit entspricht Befehlsanzahl × CPI-Wert × Taktperiode. Ein Takt von 4 GHz hat eine Periode von 0,25 ns. Für 10⁹ Befehle bei einem CPI-Wert von 1,13 benötigt die Ausführung 10⁹ × 1,13 × 0,25 ns = 0,2825 s. Die durchschnittliche Zeit pro Befehl beträgt 0,2825 ns.
Zähle bei einer kurzen Folge die Zyklen für Füllen, Leeren und Konflikte ausdrücklich. Der ideale Basis-CPI-Wert von 1 beschreibt den stetigen Durchsatz; bei einer fünfstufigen Pipeline, die nur wenige Befehle ausführt, kommt auch der Beitrag von vier Zyklen für das Füllen und den Abschluss hinzu.
Vergleiche Sprungstrategien unter gleichen Bedingungen
Behalte die Load-Use-Kosten von 0,10, den Sprunganteil von 0,15 und die Verzögerung von zwei Zyklen bei:
| Sprungstrategie | Sprungkosten | Effektiver CPI-Wert |
|---|---|---|
| Bei jedem Sprung warten | 0,15 × 2 = 0,30 | 1,40 |
| Nicht genommen vorhersagen, 60 % genommen | 0,15 × 0,60 × 2 = 0,18 | 1,28 |
| Dynamisch, 90 % Genauigkeit | 0,15 × 0,10 × 2 = 0,03 | 1,13 |
Bei gleicher Taktperiode und Befehlsanzahl ist die dynamische Vorhersage etwa 1,24-mal so schnell wie das Warten, denn 1,40/1,13 ≈ 1,24.
Vergleiche bei unterschiedlichen Prozessoren CPI-Wert × Periode. Ein Einzyklusentwurf mit 1000 ps benötigt 1000 ps pro Befehl. Eine Pipeline mit 270 ps und einem CPI-Wert von 1,13 benötigt 305,1 ps pro Befehl, ein Speedup von etwa 3,28. Ein Vergleich allein anhand des CPI-Werts würde den Einzyklus-CPI-Wert von 1 bevorzugen und zum falschen Schluss führen.
Verstehe den nächsten Zielkonflikt beim Entwurf
Mehr Pipelinestufen können die kombinatorische Arbeit pro Zyklus verkürzen. Sie verursachen aber auch Register-Overhead und können die Verzögerungen durch Load-Use-Konflikte und Fehlvorhersagen erhöhen. Die Taktfrequenz allein kann nicht entscheiden, ob der tiefere Entwurf gewinnt.
Mehrfachausgabe startet mehrere Befehle pro Zyklus und ermöglicht einen CPI-Wert unter 1 und mehr als 1 Befehl pro Taktzyklus (IPC). Statische Ausgabegruppen wählt der Compiler; bei dynamischer Ausgabe, der superskalaren Ausführung, entscheidet die Hardware und nutzt häufig Spekulation und Ausführung außerhalb der Programmreihenfolge. Datenabhängigkeiten und Sprungvorhersage begrenzen weiterhin die nutzbare Überlappung.
Wichtige Erkenntnisse
- Mittle die Kosten jedes Konflikts über alle Befehle und berücksichtige bei bedingten Raten den Anteil der übergeordneten Gruppe.
- Addiere bei langen Befehlsfolgen mit Einfachausgabe die einzelnen Beiträge verlorener Zyklen zum idealen CPI-Wert 1.
- Die Ausführungszeit ist Befehlsanzahl × CPI-Wert × Taktperiode.
- Vergleiche unterschiedliche Prozessoren anhand von CPI-Wert × Periode, nicht allein anhand des CPI-Werts.
- Tiefere Pipelines tauschen kürzere Stufen gegen mehr Overhead und höhere Konfliktkosten.
- Mehrfachausgabe kann einen IPC-Wert über 1 und einen CPI-Wert unter 1 erreichen.
Prozessor-Datenpfad und Pipelining: Beispiele
1Verfolge einen Befehl vom Holen bis zum gespeicherten Ergebnis
14 Schritte
- 1EinführungWandle Befehlsbits in gespeicherte Werte um
Ein Befehl bezeichnet eine Aufgabe, etwa das Addieren von Registerwerten oder das Laden von Daten. Der Prozessor benötigt Hardware, die diese Aufgabe ausführt, und Steuersignale, die die richtigen Wege auswählen.
Verfolge den Einzyklus-Datenpfad von seinen Speicherelementen bis zu seinen Ausgaben. Verfolge dann eine kurze Befehlsfolge und bestimme genau, was sich an jeder abschließenden Taktflanke ändert. Jeder Befehl in dieser Teilmenge belegt 4 Bytes.
- 2ErklärungBeginne mit der gespeicherten Befehlsadresse
Der PC enthält die aktuelle Befehlsadresse. Der Befehlsspeicher gibt den Befehl an dieser Adresse zurück, und ein separater Addierer berechnet gleichzeitig PC + 4.
Der PC ist ein Speicherelement: Er behält seinen Wert während des Zyklus. Der Addierer arbeitet kombinatorisch: Seine Ausgabe folgt den Eingaben. An der abschließenden Taktflanke übernimmt der PC die nächste Adresse, die sein Eingangsmultiplexer auswählt.
- 3ErklärungLies die Operanden und bilde den Direktoperanden
Der Registersatz liest rs1 und rs2 über zwei Ports. Sein Schreibport ändert rd nur, wenn RegWrite das Schreiben an der Taktflanke freigibt; aus x0 wird immer null gelesen.
ImmGen setzt einen Direktoperanden zusammen und erweitert ihn mit Vorzeichen auf 64 Bit. Das Kopieren des Vorzeichenbits hält einen negativen Offset negativ. Für den 12-Bit-Wert
1111 1111 1000ist das Ergebnis −8, nicht der nullerweiterte Wert 4088. - 4KernaussageUnterscheide ein berechnetes von einem gespeicherten Ergebnis
Die ALU addiert, subtrahiert oder führt AND beziehungsweise OR aus, abhängig von ihrem Steuereingang. Ihr Zero-Flag meldet, ob das Ergebnis null ist. Multiplexer wählen zwischen möglichen Eingaben, und Schreibfreigaben bestimmen, welche ausgewählten Werte als Zustand gespeichert werden.
Eine Einheit kann eine ungenutzte Ausgabe berechnen, ohne das Programm zu verändern. Bei einer Schreibfreigabe für den Speicher ist das anders: Wird sie aktiviert, kann ein Wert gespeichert werden, auch wenn dieser Schreibzugriff nie beabsichtigt war.
- 5HerausforderungWelcher Baustein merkt sich den Wert?
Ein Sprungzieladdierer berechnet 740, während der PC noch 720 enthält. Welche Einheit behält vor der aktiven Flanke die aktuelle Befehlsadresse, und ändert das berechnete Ziel diese Adresse selbst?
---reveal---
Der PC behält 720. Der Addierer berechnet nur ein mögliches Ziel. Der PC ändert sich, wenn der ausgewählte nächste Wert an der Flanke übernommen wird; ein möglicher Wert an einem nicht ausgewählten Eingang überschreibt ihn nicht.
- 6ErklärungLeite arithmetische und Speicheroperationen durch den Datenpfad
Eine R-Typ-Operation liest zwei Registerwerte, sendet sie durch die ALU und gibt das Ergebnis an rd zurück. Ein Ladebefehl benötigt dagegen eine Adresse aus Basis plus Offset und anschließend den Speicherwert an dieser Adresse.
Ein Speicherbefehl berechnet eine Adresse auf dieselbe Weise, aber rs2 liefert die zu schreibenden Daten. Der Datenpfad zum Speicher muss verfügbar bleiben, während ALUSrc einen Direktoperanden für den zweiten ALU-Eingang auswählt.
- 7ErklärungWähle die gemeinsamen Verbindungen
Drei Auswahlschalter führen die Pfade zusammen:
- ALUSrc wählt rs2 oder den Direktoperanden für die ALU.
- MemtoReg wählt das ALU-Ergebnis oder Speicherdaten für rd.
- PCSrc wählt PC + 4 oder das Sprungziel.
Ein Ladebefehl setzt ALUSrc auf 1 und MemtoReg auf 1. Ein Speicherbefehl nutzt ebenfalls den Adresspfad mit Direktoperand, deaktiviert aber das Zurückschreiben in den Registersatz und gibt das Schreiben in den Speicher frei.
- 8TippBerechne ein Sprungziel einmal
Bei
beqprüft eine Subtraktion auf Gleichheit, während ein separater Addierer den PC-Wert des Sprungs + vorzeichenbehafteten Byteoffset bildet. Diese Berechnungen können parallel ablaufen.Die Kodierung im B-Format lässt das niederwertige Nullbit des Offsets aus. ImmGen kann den vollständigen Byteoffset rekonstruieren, oder eine externe Verschiebung kann dieses Bit ergänzen. Liegt der vollständige Byteoffset bereits vor, würde eine erneute Verschiebung den Versatz verdoppeln.
- 9HerausforderungUnterscheide Speicheradresse und zu speichernde Daten
Bei
sd x11, 32(x18)enthält x18 den Wert 2400 und x11 den Wert 55. Wie lauten das ALU-Ergebnis und die Schreibdaten für den Speicher?---reveal---
Die ALU berechnet aus 2400 + 32 die Adresse 2432. Die Schreibdaten für den Speicher sind 55 und stammen aus x11. Würde 55 anstelle des Offsets an die ALU gesendet, entstünde eine andere Adresse ohne Bezug zur Aufgabe; die Auswahl des Direktoperanden muss den Pfad für die Speicherdaten erhalten.
- 10BeispielVerfolge eine Addition an der Taktflanke
Bei PC 400 liest
add x5, x6, x7die Werte x6 = 25 und x7 = −9. ALUSrc wählt den zweiten Registerwert, die ALU addiert, und MemtoReg wählt das Ergebnis 16.An der Flanke speichert RegWrite 16 in x5, und der PC wird zu 404. Der Datenspeicher wird weder gelesen noch beschrieben.
- 11BeispielVerfolge einen Ladebefehl und danach einen Speicherbefehl
Bei PC 404 nutzt
ld x5, 16(x6)den Wert x6 = 1000 und liest Adresse 1016, deren Doppelwort 42 enthält. Die ALU gibt 1016 aus; der Speicher gibt 42 aus, was MemtoReg für x5 auswählt. Der PC wird auf 408 erhöht.Der nächste Befehl
sd x5, 24(x6)berechnet die Adresse 1024 und schreibt den aktualisierten x5-Wert 42. Er erhöht den PC auf 412, ohne ein Register zu schreiben. - 12BeispielBestimme die nächste Befehlsadresse
Bei PC 412 liest
beq x8, x9, 12zweimal den Wert 7. Die Subtraktion ergibt null und der Zieladdierer 424. Branch AND Zero wählt 424 als nächsten PC-Wert.Wäre x9 gleich 8, ergäbe die Subtraktion −1 und der PC würde auf 416 erhöht. In keinem der beiden Fälle wird ein Allzweckregister oder der Datenspeicher beschrieben. Der Vergleich steuert, welche der möglichen Adressen gespeichert wird.
- 13HerausforderungUntersuche den falschen Zielwert
Ein korrekt ausgeführtes
ld x10, 8(x20)mit x20 = 3200 liest das Doppelwort 91 an Adresse 3208. Ein fehlerhafter Rückschreibmultiplexer führt stattdessen zu x10 = 3208. Was hat der Multiplexer ausgewählt und was sollte er auswählen?---reveal---
Er hat das ALU-Ergebnis ausgewählt, die Adresse 3208. Er sollte die Datenspeicherausgabe 91 auswählen. Die Adressberechnung kann korrekt sein, während der Endzustand falsch ist, weil beim Zurückschreiben die falsche Quelle gewählt wurde.
- 14ZusammenfassungOrdne jedem Schreibzugriff auf ein Speicherelement seinen Weg zu
Unterscheide für einen vollständigen Einzyklusablauf das arithmetische Ergebnis, die effektive Adresse, die Speicherdaten und den nächsten PC-Wert. Lade- und arithmetische Befehle schreiben rd über unterschiedliche Multiplexereingänge; Speicherbefehle nutzen einen separaten Datenpfad; bedingte Sprünge wählen nur die nächste Befehlsadresse.
Für alle gilt dieselbe Taktgrenze: Kombinatorische Arbeit erzeugt während des Zyklus mögliche Werte, und freigegebene Schreibzugriffe auf Speicherelemente übernehmen am Ende die ausgewählten Werte.
2Leite die Steuerung aus den Aufgaben eines Befehls ab
11 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungLass den gemeinsamen Datenpfad den Befehl ausführen
- 2BeispielLeite die Zeile eines Ladebefehls aus seinem Datenweg ab
- 3ErklärungSchütze den Zustand durch eindeutige Schreibfreigaben
- 4KernaussageLass die Daten die Sprungentscheidung abschließen
- 5HerausforderungWähle die folgenlose unbestimmte Einstellung
- 6ErklärungWähle mit ALUOp eine Operationsklasse
- 7BeispielVerfolge die Funktionsbits der Subtraktion
- 8VerbindungVerwende den Addierer für die Subtraktion erneut
- 9HerausforderungOrdne die Bits eines Ladebefehls richtig zu
- 10HerausforderungErweitere die Steuerung ohne zusätzlichen Adresspfad
- 11ZusammenfassungVerbinde Freigaben mit der Dekodierung
3Beobachte die Überlappung unabhängiger Befehle
15 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungUnterscheide einen Befehl von der Befehlsfolge
- 2BeispielFinde den langsamsten vollständigen Befehl
- 3BeispielLege den Pipelinetakt anhand der langsamsten Stufe fest
- 4AnalogieVergleiche Durchsatz und Latenz
- 5HerausforderungBerechne eine kurze Folge
- 6ErklärungFühre den Befehl mit, nicht nur sein Ergebnis
- 7BeispielHalte das Zielregister beim Ladebefehl
- 8ErklärungFühre die Steuersignale bis zu ihrer Stufe mit
- 9HerausforderungWarum den ungenutzten MEM-Platz beibehalten?
- 10BeispielZeichne eine Treppe aus Stufen
- 11TippBestimme eine Stufe, ohne jede Zelle zu zeichnen
- 12BeispielFüge eine Wartezeit ein, ohne ältere Arbeit zu wiederholen
- 13HerausforderungLies den verzögerten Abschluss ab
- 14HerausforderungVerbinde Speicherung mit einer Zyklusaufnahme
- 15ZusammenfassungLies die Rechenleistung aus dem Ablauf ab
4Verfolge den neuesten Wert durch eine angehaltene Pipeline
17 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungFinde heraus, wo der benötigte Wert vorliegt
- 2ErklärungUnterscheide Konflikte nach ihrer Ursache
- 3BeispielBestimme den Erzeuger für jeden Lesezugriff
- 4HerausforderungErzeugt die Wiederverwendung eines Registers einen Hardwarekonflikt?
- 5ErklärungLiefere ein ALU-Ergebnis vor dem Zurückschreiben
- 6TippPrüfe jede Übereinstimmung für die Datenweiterleitung
- 7BeispielLöse zwei übereinstimmende Schreibzugriffe auf
- 8HerausforderungLeite zwei Operanden unabhängig weiter
- 9VerbindungErhalte den separaten Pfad für Speicherdaten
- 10ErklärungErkenne die zeitliche Grenze der Datenweiterleitung
- 11ErklärungHalte den Verbraucher an und füge eine Pipelineblase ein
- 12BeispielVerfolge die Wartezeit über drei Zyklen
- 13TippLass die Konflikterkennung die tatsächlichen Quellen prüfen
- 14BeispielVerschiebe nützliche Arbeit in die Lücke
- 15HerausforderungPrüfe die Verschiebung, bevor du den Gewinn zählst
- 16HerausforderungKombiniere die Pipelineblase mit späterer Datenweiterleitung
- 17ZusammenfassungWähle die Unterstützung nach dem Zeitpunkt der Erzeugung
5Stelle die Befehlsfolge wieder her und miss die Kosten
19 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungHalte nützliche Arbeit auf dem richtigen Pfad
- 2ErklärungZähle die Holplätze jüngerer Befehle
- 3BeispielVerfolge einen genommenen Sprung bei der Vorhersage „nicht genommen“
- 4TippVerwirf Arbeit, ohne einen ungültigen Befehl auszuführen
- 5ErklärungWäge frühere Sprungentscheidungen gegen frühere Operanden ab
- 6HerausforderungSchütze den Zustand nach einer Fehlvorhersage
- 7VerbindungBewahre die Ausnahmegrenze
- 8ErklärungSage die Richtung anhand des Verlaufs voraus
- 9ErklärungLass zwei Bits die Vorhersage beibehalten
- 10BeispielVerfolge die Vorhersage vor der Aktualisierung
- 11HerausforderungPrüfe ein Paar entgegengesetzter Ergebnisse
- 12ErklärungUnterscheide Richtung und Ziel
- 13KernaussageErkenne gegenseitige Störungen und Grenzen bei Mustern
- 14BeispielRechne bedingte Raten in Kosten pro Befehl um
- 15BeispielBerücksichtige die Dauer eines Zyklus
- 16BeispielVergleiche Vorhersagestrategien
- 17HerausforderungErmittle den fehlenden Sprunganteil
- 18HerausforderungBeurteile eine tiefere Pipeline
- 19ZusammenfassungMiss die nutzbare Überlappung nach den Korrekturkosten
Prozessor-Datenpfad und Pipelining: Übungsaufgaben
Set 1: Lies den fünfstufigen Ablauf10 Übungsfragen
Frage 1 von 10
Antwort zeigenAntwort ausblenden
Frage 2 von 10
Antwort zeigenAntwort ausblenden
Frage 3 von 10
Antwort zeigenAntwort ausblenden
Frage 4 von 10
Antwort zeigenAntwort ausblenden
Frage 5 von 10
Antwort zeigenAntwort ausblenden
Frage 6 von 10
Antwort zeigenAntwort ausblenden
Frage 7 von 10
add x13, x2, x3; or x20, x4, x5; sub x14, x13, x6 aus. Der mittlere Befehl ist unabhängig. Wie viele Stillstandszyklen und wie viele Zyklen insgesamt werden benötigt?Antwort zeigenAntwort ausblenden
Frage 8 von 10
Antwort zeigenAntwort ausblenden
Frage 9 von 10
Antwort zeigenAntwort ausblenden
Frage 10 von 10
ld x21, 0(x25); add x22, x21, x3; or x24, x6, x7; sub x23, x22, x4 aus. OR ist unabhängig, und Sprung- und Strukturkonflikte treten nicht auf. In welchem Zyklus tritt die letzte Subtraktion in EX ein?Antwort zeigenAntwort ausblenden
Set 2: Verfolge Werte und Steuersignale10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
sd x14, 40(x9) der Wert, der in den Speicher geschrieben wird?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
ld x12, -16(x8) mit x8 = 2080 und dem Doppelwortwert −6 an Adresse 2064 ausgeführt. Welche Werte haben x12 und der PC nach dem Abschluss?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
beq x16, x17, -24 an Adresse 880 vergleicht zwei Register, die beide 11 enthalten. Welche Adresse wird als Nächstes geholt?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
beq ein Don't-Care-Wert sein?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
000 und Bit 30 = 1. Welches ALUOp und welchen ALU-Steuercode erzeugt dieser Entwurf?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
1111 1111 0000. Welchen vorzeichenbehafteten Wert muss ImmGen dem 64-Bit-Datenpfad liefern?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
ld x15, 32(x18) gilt x18 = 3000 und der Speicher an Adresse 3032 enthält 77. Ein Steuerfehler ändert nur MemtoReg von 1 auf 0. Der nächste Befehl ist sd x15, 48(x18). Welchen Wert schreibt dieser Speicherbefehl und wohin?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Set 3: Wähle Operanden und plane Befehle um Ladebefehle herum10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
sub x11, x2, x3 mit dem späteren Befehl and x12, x11, x4?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
add x18, x0, x7 gefolgt. Das frühere ALU-Ergebnis ist nicht null. Welchen Wert sollte der add-Befehl für seinen ersten Operanden verwenden?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
add x9, x1, x2; add x9, x9, x3; sub x11, x9, x4 aus. Dabei gelten x1 = 6, x2 = 7, x3 = 9 und x4 = 5. Welchen Wert erzeugt die Subtraktion und welches Pipelineregister liefert ihren x9-Wert?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
add x16, x5, x6 folgt unmittelbar sd x16, 56(x20). Die Pipeline leitet Speicherdaten vor der ALUSrc-Auswahl weiter. Wie erhält der Speicherbefehl seine Daten?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
ld x6, 0(x20); add x7, x6, x8; ld x9, 16(x20); sub x10, x9, x11. Kein anderer Befehl ändert x20, x8 oder x11, und beide Lesezugriffe sind zulässig. Welche Reihenfolge beseitigt beide Load-Use-Stillstände und erhält die Ergebnisse?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
ld x5, 0(x20); add x6, x5, x7; sd x6, 8(x20); ld x8, 8(x20). Warum ist es unzulässig, den letzten Ladebefehl an die zweite Stelle zu verschieben, selbst wenn er die Load-Use-Lücke füllt?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
add x5, x6, x7; sub x6, x8, x9 das Vertauschen der Befehle ein?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
ld x12, 0(x26); add x13, x12, x2; ld x14, 8(x26); sub x15, x14, x13; sd x15, 24(x26) aus. Speicherdaten werden vor ALUSrc weitergeleitet, und es gibt keine weiteren Konflikte. Wie viele Zyklen werden bis einschließlich des letzten WB-Platzes benötigt?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Set 4: Stelle das Holen wieder her und verfolge den Sprungverlauf10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
ld x18, 0(x22) unmittelbar ein bedingter Sprung, der x18 vergleicht. Der Sprung wird in ID entschieden. Wie viele Zyklen muss der Vergleich gegenüber einem Ablauf ohne Operandenwartezeit warten und warum?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Set 5: Kombiniere Pipelinezeiten und Konfliktkosten10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Hängst du bei deiner eigenen Aufgabe fest? Hausaufgabenhilfe
Schlüsselbegriffe
A
Aliasing
ALU-Steuercode
0110 wählt die Subtraktion, während der verwandte Code 0010 die Addition wählt.ALUOp
ALUSrc
Ausführungszeit
Ausgabeabhängigkeit
B
Befehlsplanung
Befehlszähler
D
Datenkonflikt
Datenpfad
Datenweiterleitung
Direktoperandengenerator
Don't-Care-Wert
beq ein Don't-Care-Wert sein, weil kein Register geschrieben wird.Doppelwort
ld und sd übertragen wird.Durchsatz
Dynamische Sprungvorhersage
E
Echte Datenabhängigkeit
Effektive Adresse
ld x4, 24(x8) mit x8 = 2000 ist die effektive Adresse 2024.Effektiver CPI-Wert
EX/MEM
F
Festverdrahtetes Steuerwerk
ForwardA
ForwardB
Füllen der Pipeline
Funktionsfeld
000 wählt Befehlsbit 30, welche arithmetische Operation ausgeführt wird.G
Gegenabhängigkeit
I
ID/EX
IF/ID
IPC
K
Kombinatorisches Schaltungselement
Konflikterkennungseinheit
Korrelierender Prädiktor
Kritischer Pfad
L
Latenz
Leeren der Pipeline
Load-Use-Konflikt
M
Mehrfachausgabe
MEM/WB
MemRead
MemtoReg
MemWrite
Multiplexer
P
PCSrc
Pipeline-Flush
Pipeline-Stillstand
Pipeline-Zeitdiagramm
Pipelineblase
Pipelineregister
Pipelineregister-Overhead
Pipelining
Präzise Ausnahme
R
Registersatz
RegWrite
Rückadressstapel
S
Sättigungszähler
Speicherabhängigkeit
Speicherelement
Sprungverlaufstabelle
Sprungverzögerung
Sprungziel
Sprungzielpuffer
Statische Sprungvorhersage
Steuerkonflikt
Strukturkonflikt
Superskalarer Prozessor
T
Taktflanke
Turnierprädiktor
V
Vorzeichenerweiterung
W
Weiterleitungseinheit
Z
Zero-Flag
Zurückschreiben
Zweistufige Dekodierung
- 1Abstraktion und Rechenleistung
- 2Befehlssätze und Assemblersprache
- 3Rechnerarithmetik
- 4Prozessor-Datenpfad und Pipelining
- 5Speicherhierarchie und Caches
- 6Mehrkernprozessoren
Über diese Einheit
Erstelle deine eigenen Lernmaterialien
Mach aus deinen Notizen, Folien und Dokumenten Lernleitfäden, Übungsfragen, Karteikarten und 6 weitere Tools.