RISC-Pipelines im Detail

Read-after-Write-Hazard

Eine Analyse der möglichen Ursachen für diese Form von Daten-Hazards ergibt für die RISC-Architekturen den so genannten Read-after-Write-Hazard (RAW). Er tritt in dem ursprünglichen Assembler-Programm nicht auf, da hier von einer zeitlich sequenziellen Folge ausgegangen wird. Durch das Pipelining macht er sich im realen Programmablauf aber massiv bemerkbar. Dieser RAW-Hazard tritt auch bei der superskalaren CPU als einziger nicht behebbarer Hazard in Erscheinung.

Bei Pipelining-CPUs (RISC) existieren außer dem Einbau von Wartezyklen in der Pipeline zwei weitere Varianten zur Vermeidung des Leistungsverlusts:

  • Der Assembler-Programmierer oder der Compiler verhindert durch eine Analyse des Codes, dass es überhaupt zu Read-after-Write-Hazards mit ihren Verzögerungen kommt. Dies ist durch eine geschickte Umsortierung der Befehle fast immer möglich.

  • In die CPU wird zusätzliche Hardware integriert, die die Auswirkungen minimiert. In diesem Fall kann man auf ein Anhalten der Pipeline verzichten.

Durch eine zusätzliche Data Forwarding Unit, die neben den bisher vorhandenen Einheiten innerhalb der Mikroarchitektur eingefügt wird, lassen sich die Auswirkungen eines RAW-Hazards mildern oder sogar ganz beseitigen. Damit muss die Execute-Pipeline-Stufe nicht auf das Schreiben in ein Register warten, sondern kann das am Ausgang der ALU vorhandene Ergebnis direkt nutzen.

Das Bild zeigt das für die vierstufige Pipeline der MPM3-Modell-CPU. In diesem Fall lässt sich der negative Einfluss von Datenabhängigkeiten im Programm nahezu gänzlich vermeiden, was für Prozessoren mit hoher Anzahl von Pipeline-Stufen nicht mehr gilt. Die einzige unvermeidbare Ausnahme sind Registerinhalte, die ein Sprungbefehl (Jump registerindirekt) benötigt. Da der Sprung in der Fetch-Unit zu einem neuen Program-Counter-Wert führt, erreicht der Datenwert diese Einheit zwei Takte zu spät, falls der vorangegangene Befehl den Wert noch berechnet.

Der Aufwand für das Data Forwarding erscheint relativ gering. In der Praxis nimmt das jedoch einen erheblichen Anteil des Mikroprozessorkerns in Anspruch, da der Kern in einem komplexen Regelwerk detektieren muss, ob er die Register-inhalte oder einen Wert aus dem Forwarding nutzen kann. Dennoch wird dieses Verfahren bei allen gängigen Prozessoren eingesetzt, weil die Performance-Verbesserung erheblich ist.