Was ist eine Anweisungspipeline?

click fraud protection

Jeder Prozessorbefehl hat mehrere Stufen zu seiner Operation. Jede dieser Phasen benötigt einen einzigen CPU-Zyklus, um abgeschlossen zu werden. Diese Stufen sind Befehlsabruf, Befehlsdecodierung, Ausführung, Speicherzugriff und Rückschreiben. Diese erhalten jeweils die Anweisung, die ausgeführt werden muss, um die Operation von den zu bedienenden Werten zu trennen an, führe den Prozess aus, öffne das Register, in das das Ergebnis geschrieben werden soll, und schreibe das Ergebnis in das geöffnete registrieren.

Historische In-Order-Prozessoren

In frühen Computern verwendete die CPU keine Befehlspipeline. In diesen CPUs musste jede Einzelzyklusoperation für jeden Befehl ausgeführt werden. Dies bedeutete, dass es fünf Taktzyklen dauerte, bis der durchschnittliche Befehl vollständig verarbeitet war, bevor der nächste gestartet werden konnte. Einige Operationen müssen möglicherweise kein Ergebnis in ein Register schreiben, was bedeutet, dass die Speicherzugriffs- und Rückschreibphasen übersprungen werden können.

In einem subskalaren Prozessor ohne Pipeline wird jeder Teil jeder Anweisung der Reihe nach ausgeführt.

Es lauert jedoch ein Problem, wenn Sie eine vollständige Anweisung der Reihe nach ausführen, bevor Sie mit der nächsten Anweisung fortfahren können. Das Problem ist der Cache-Miss. Die CPU speichert Daten, die sie aktiv verarbeitet, in dem Register. Darauf kann mit einer Ein-Zyklus-Latenzzeit zugegriffen werden. Das Problem ist, dass das Register winzig ist, weil es in den Prozessorkern eingebaut ist. Die CPU muss zum größeren, aber langsameren L1-Cache wechseln, wenn die Daten nicht bereits geladen wurden. Wenn es nicht da ist, muss es wieder in den größeren und langsameren L2-Cache gehen. Der nächste Schritt ist der L3-Cache; Die letzte Option ist der System-RAM. Jede dieser Optionen benötigt mehr und mehr CPU-Zyklen zur Überprüfung.

Nun kann diese zusätzliche zusätzliche Latenzzeit ein großes Problem in einem System sein, das jede Anweisung der Reihe nach vollständig abschließen muss, bevor die nächste Anweisung gestartet wird. Was ein Prozessor mit 5 Zyklen pro Befehl war, kann plötzlich für Dutzende oder Hunderte von Taktzyklen an einem Befehl hängen bleiben. Währenddessen kann auf dem Computer nichts weiter passieren. Technisch kann dies etwas gemildert werden, indem man zwei unabhängige Kerne hat. Nichts hindert sie jedoch daran, dasselbe zu tun, möglicherweise gleichzeitig. Wenn Sie also die Multi-Core-Route hinuntergehen, wird dies nicht behoben.

Die klassische RISC-Pipeline

RISC steht für Reduced Instruction Set Computer. Es handelt sich um eine Art Prozessordesign, das die Leistung optimiert, indem es die Dekodierung jeder Anweisung erleichtert. Dies steht im Vergleich zu CISC oder Complex Instruction Set Computer, der komplexere Befehlssätze entwirft, sodass weniger Befehle erforderlich sind, um dieselben Aufgaben auszuführen.

Das klassische RISC-Design enthält eine Befehlspipeline. Anstatt irgendeine der fünf Anweisungsstufen in einem gegebenen Zyklus auszuführen, ermöglicht die Pipeline die Ausführung aller fünf Stufen. Natürlich können Sie nicht alle fünf Stufen einer Anweisung in einem Zyklus ausführen. Sie können jedoch fünf aufeinanderfolgende Anweisungen mit einem Versatz von jeweils einer Stufe aneinanderreihen. Auf diese Weise kann in jedem Taktzyklus ein neuer Befehl ausgeführt werden. Bietet eine potenzielle 5-fache Leistungssteigerung bei einem relativ geringen Anstieg der Kernkomplexität.

In einem Skalar-Pipeline-Prozessor kann jede Stufe einer Befehlsausführung einmal pro Taktzyklus durchgeführt werden. Dies ermöglicht einen maximalen Durchsatz von einem abgeschlossenen Befehl pro Zyklus.

Prozessoren ohne Pipeline können immer nur subskalar sein, da sie keine vollständige Anweisung pro Zyklus ausführen können. Mit dieser primären fünfstufigen Pipeline können Sie eine skalare CPU erstellen, die eine Anweisung für jeden Prozess ausführen kann. Indem Sie noch weitreichendere Pipelines erstellen, können Sie superskalare CPUs herstellen, die mehr als eine Anweisung pro Taktzyklus ausführen können. Natürlich gibt es immer noch mögliche Probleme.

Immer noch sequentiell

Nichts davon löst das Problem, viele Zyklen auf eine Antwort zu warten, wenn die verschiedenen Ebenen von Cache und RAM abgefragt werden müssen. Es führt auch ein neues Problem ein. Was ist, wenn sich eine Anweisung auf die Ausgabe der vorherigen Anweisung stützt? Diese Probleme werden selbstständig mit einem fortschrittlichen Dispatcher gelöst. Es plant die Ausführungsreihenfolge sorgfältig, sodass keine Anweisungen, die sich auf die Ausgabe eines anderen stützen, zu nahe beieinander liegen. Es handhabt auch Cache-Fehlschläge, indem es einen Befehl parkt und ihn in der Pipeline durch einen anderen ersetzt Anweisungen, die zur Ausführung bereit sind und deren Ergebnis nicht erforderlich ist, wobei die Anweisung fortgesetzt wird, wenn sie es ist bereit.

Diese Lösungen können auf Prozessoren ohne Pipeline funktionieren, sind jedoch für einen superskalaren Prozessor erforderlich, der mehr als eine Anweisung pro Takt ausführt. Ein Verzweigungsprädiktor ist ebenfalls sehr nützlich, da er versuchen kann, das Ergebnis einer Anweisung mit mehr als einem möglichen Ergebnis vorherzusagen und weiterhin davon ausgeht, dass es korrekt ist, sofern nicht das Gegenteil bewiesen wird.

Fazit

Eine Pipeline ermöglicht die Nutzung aller unterschiedlichen Fähigkeiten des Prozessors in jedem Zyklus. Dies geschieht durch gleichzeitiges Ausführen verschiedener Stufen verschiedener Anweisungen. Dies fügt dem CPU-Design nicht einmal viel Komplexität hinzu. Es ebnet auch den Weg, um zuzulassen, dass mehr als eine Anweisung eine einzelne Stufe pro Zyklus durchführt.