« »

Achtung, Hazard!

Zum Testen Ihrer RISC-V-Umsetzung verwenden Sie folgenden Assemblercode.

addi x11, x12, 5
add  x13, x11, x12
addi x14, x11, 15

Beim Ausführen fällt Ihnen allerdings auf, dass Sie zwar Pipelining (mit der bekannten fünfstufigen Pipeline), aber noch keine Hazard-Kontrolle eingebaut haben. Wer für ihr System programmiert, muss sich also selbst darum kümmern, potenzielle Hazards zu vermeiden.

Gehen Sie davon aus, dass das Register x11 mit 11 und das Register x12 mit 22 initialisiert worden ist. Nutzen Sie QtRVSim als Referenzarchitektur (fünfstufige Pipeline, keine Hazard-Behandlung, kein Cache).

Diese Aufgabe stammt aus Kapitel 4, Aufgaben 4.18 - 4.20 von "Computer Organization and Design. The Hardware/Software Interface. RISC-V Edition" (Patterson & Hennessy, 2018).

a)

Level 3: Anwenden

Welche finalen Werte haben die Register x13 und x14 unter der Annahme, dass Hazards nicht behandelt werden?

Lösung

Die erste Instruktion schreibt erst im fünften Taktzyklus (in Stufe WB = Write Back) das berechnete Ergebnis in das Zielregister x11. Da allerdings die beiden anderen Instruktionen bereits davor auf x11 zugreifen (in Stufe ID = Instruction Decode), verwenden diese noch den Initialwert von 11.

Im Ergebnis gilt darum x13 = 33 und x14 = 26.

addi x11, x12, 5
add  x13, x11, x12
addi x14, x11, 15
Zyklus/InstruktionZeile 1Zeile 2Zeile 3
1IF
2ID (x12, 5)IF
3EXID (x11, x12)IF
4MEMEXID (x11, 15)
5WB (x11)MEMEX
6WB (x13)MEM
7WB (x14)

b)

Level 1: Wissen

Sie erweitern ihren Assemblercode um die folgende Zeile:

add x15, x11, x11

Welchen Wert hat x15 nach dem erneuten Ausführen des Programms?

Lösung

Die erste Instruktion schreibt den Zielwert in das Register x11 (Stufe WB) im fünften Taktzyklus. Im selben Zyklus liest die vierte Instruktion die Werte der Input-Register (Stufe ID).

Da im selben Taktzyklus Write Back vor Instruction Decode ausgeführt wird, kann die Instruktion den beschriebenen Wert sofort wieder auslesen und das Ergebnis ist korrekt: x15 = 27 + 27 = 54

addi x11, x12, 5
add  x13, x11, x12
addi x14, x11, 15
add  x15, x11, x11
Zyklus/InstruktionZeile 1Zeile 2Zeile 3Zeile 4
1IF
2ID (x12, 5)IF
3EXID (x11, x12)IF
4MEMEXID (x11, 15)IF
5WB (x11)MEMEXID (x11, x11)
6WB (x13)MEMEX
7WB (x14)MEM
8WB (x15)

c)

Level 3: Anwenden

Aus der Vorlesung wissen Sie, dass Data Hazards unter anderem vermieden werden können, wenn die betroffenen Instruktionen durch eine oder mehrere nop-Instruktionen verzögert werden.

Um ihre RISC-V-Umsetzung ausgiebig zu testen, haben Sie aus dem vorherigen Code die vierte Instruktion ausgetauscht. Fügen Sie Ihrem Code (möglichst wenige) nop-Instruktionen hinzu, sodass alle Werte wie erwartet berechnet werden.

addi x11, x12, 5  
add x13, x11, x12
addi x14, x11, 15 
sub x15, x13, x12
Lösung

Wir verzögern die Instruktionen so, dass ein Register frühestens in demselben Taktzyklus ausgelesen werden kann, in dem es durch eine vorherige Instruktion beschrieben wird (siehe Teilaufgabe b).

Effektiv bedeutet das, dass zwischen einer Schreiboperation und einer Leseoperation mindestens zwei Instruktionen liegen müssen.

addi x11, x12, 5  
nop
nop
add x13, x11, x12
addi x14, x11, 15 
nop
add x15, x13, x12

d)

Level 1: Wissen

Zusatzaufgabe: Bestimmen Sie die im folgenden Assemblercode auftretenden Data Hazards. Geben Sie für jeden Hazard die beteiligten Zeilen und das betroffene Register an.

addi x1, x0, 1
addi x2, x0, 2
add  x3, x1, x2
sub  x2, x1, x3

Diese Aufgabe war Teil der Klausur im Sommersemester 2024 (Zweittermin).

Lösung
  • x1 wird in Zeile 3 gelesen, noch bevor es in Zeile 1 beschrieben wird.
  • x2 wird in Zeile 3 gelesen, noch bevor es in Zeile 2 beschrieben wird.
  • x3 wird in Zeile 4 gelesen, noch bevor es in Zeile 3 beschrieben wird.

Lernziele

In dieser Aufgabe …

  • simulieren die Studierenden praktisch die Auswirkungen von Hazards.
  • nutzen die Studierenden ihre Kenntnisse der Pipeline zur Platzierung von NOPs.