Pipelining ist eine Konstruktionsidee für Computer, mit der die Ausführung von Befehlen mit Ähnlichkeiten zu einem Fließband organisiert wird. Die Rechenleistung der heute verwendeten Prozessoren ist in wesentlichem Ausmaß durch Pipelining erst möglich. Diese Idee kommt daher in praktisch allen heutigen Prozessoren zur Anwendung.
Inhalt
Der Prozessor als Ort des Pipelinings
Der Prozessor wird auch als CPU oder Central Processing Unit bezeichnet und ist das Herzstück eines digitalen Computers. Die CPU arbeitet ein Programm ab, das aus vielen einzelnen Befehlen besteht. Der Prozessor lädt einen Befehl nach dem anderen aus dem Speicher und führt ihn aus. Die Befehle für Prozessoren sind viel einfacher als diejenigen einer höheren Programmiersprache. Trotzdem hat jeder Prozessor eine ganze Reihe von verschiedenen Befehlen in seinem Befehlssatz, den er ausführen kann. Beispiele sind Befehle zum Laden von Daten aus dem Speicher, zum Berechnen der Summe zweier im Prozessor bereits gespeicherten Zahlen oder zum Überprüfen einer Bedingung.
Für die Ausführung wird jeder dieser Befehle in mehrere Teile oder Stufen zerlegt. Ein einfacher Prozessor könnte diese Zerlegung wie folgt ausführen:
- Laden des Befehls
- Dekodieren des Befehls, also die Vorbereitung für die Ausführung
- Laden von Daten, die für die Ausführung gebraucht werden
- Ausführung des Befehls
- Ablegen des Ergebnisses der Ausführung in Register oder Speicher
Mit Register sind hier Speicherelemente direkt im Prozessor gemeint. Diese kann der Prozessor direkt ansteuern und so ihre Inhalte verwenden. Daten im Speicher kann der Prozessor erst dann verarbeiten, nachdem er sie in die Register geladen hat. Auch für diesen Ablauf gibt es in jedem Prozessor entsprechende Befehle. Ein Prozessor hat einen Taktgeber und mit jedem Zyklus dieses Taktgebers kommt einer dieser fünf Stufen eines Befehls zur Ausführung.
Ein Fließband als vorbereitende Überlegung zum Pipelining
Statt Befehlen für einen Computer betrachten wir ein Werkstück, das in fünf aufeinanderfolgenden Stufen hergestellt wird. Für jede Stufe teilen wir Leute ein und statten sie mit den notwendigen Werkzeugen aus. Wir formen aus diesen Leuten mit ihren Arbeitsschritten ein Fließband und unterteilen die Zeit in Taktzyklen.
Die Verarbeitung beginnt mit dem ersten Arbeitsschritt oder der ersten Stufe am ersten Werkstück. Im nächsten Taktzyklus wird der zweite Arbeitsschritt am ersten Werkstück durchgeführt. Was machen aber die Leute, die den ersten Arbeitsschritt ausführen? Im Prinzip könnten sie warten, bis das erste Werkstück fertig ist. Viel effizienter ist es aber, wenn sie sofort an einem zweiten Werkstück zu arbeiten beginnen. Wieder einen Taktzyklus später findet Arbeitsschritt drei am ersten Werkstück statt, Schritt zwei am zweiten und Schritt eins am dritten Werkstück. Nach fünf Taktzyklen sind alle im Betrieb beschäftigt und bleiben das auch, bis das letzte Werkstück ankommt.
Was ist Pipelining im Computer?
Pipelining bedeutet, dass die Stufen eines Befehls der Reihe nach wie am Fließband ausgeführt werden. Die Grundlage für diese Idee ist die Unterteilung dieser Ausführung in aufeinander folgende Schritte. Analog zum Fließband konstruieren wir Schaltungen, die je einen der Schritte oder Stufen ausführen können. Befehl eins wird also geladen und im nächsten Taktzyklus dekodiert. Während dieser Dekodierung kommt schon der zweite Befehl zum Laden dran. Die Stufe zwei des Prozessors ist schließlich nur mit dem ersten Schritt beschäftigt. Wieder einen Taktzyklus später lädt der Prozessor die Daten für den Befehl eins und führt damit die dritte Stufe aus. Er dekodiert Befehl zwei und lädt den dritten Befehl des Programms. Nach fünf Taktzyklen ist der Prozessor also in allen fünf Stufen ausgelastet. Die Befehle des Programms bewegen sich durch die Stufen des Prozessors wie die Werkstücke durch das Fließband.
Wie wählen wir die Zahl der Stufen, in die eine Ausführung eines Befehls unterteilt wird? Je mehr Stufen, umso kleiner ist jede einzelne und umso weniger Zeit erfordert ihre Ausführung. Mehr Stufen sind auf der einen Seite komplexer zu beherrschen, sie ermöglichen aber auch einen höheren Effizienzgewinn durch Pipelining. Eine Begrenzung der Stufenanzahl ergibt sich aus der maximalen Zahl von Taktzyklen pro Sekunde, die von den Eigenschaften der elektronischen Schaltung bestimmt wird. Lesen Sie hier mehr zur elektronischen Schaltung.
Probleme mit Pipelining
In einer Werkstatt ist es klar, dass die Arbeitsschritte an einem Werkstück nur in einer bestimmten Reihenfolge auszuführen sind. Im Gegensatz dazu ist nicht immer bekannt, in welcher Reihenfolge die Befehle eines Programms
zur Bearbeitung kommen. Insbesondere gibt es Verzweigungen, die den Programmablauf verändern. Im Programm kann beispielsweise eine Gruppe von Befehlen vorkommen, die solange zu wiederholen sind, bis eine bestimmte Bedingung erfüllt ist.
Jede Wiederholung bedeutet, dass die Ausführung des Programms wieder einige Befehle zurückspringt und die Ausführung dort weiterläuft. Die Bedingung wird aber erst in der Ausführung, also der vorletzten Stufe des entsprechenden Befehls überprüft und zu diesem Zeitpunkt sind schon die nächsten Befehle geladen und dekodiert worden. Dieser Aufwand ist dann umsonst und ist zu löschen. Das bedeutet aber, dass das Pipelining in einem solchen Fall weniger effizient ist als bei korrekter Vorhersage der Abfolge der Befehle.
In heutigen Prozessoren steht aufwendige Technik für diese Vorhersage bereit. Im Beispiel der immer wieder zu wiederholenden Gruppe von Befehlen erkennt diese Logik, dass eine solche Konstruktion von Programmierern dann gewählt wird, wenn mit zahlreichen Wiederholungen zu rechnen ist. Der Prozessor nimmt also diesen Fall an und wählt eine solche Wiederholung als wahrscheinlichen Ablauf. Das so gestaltete Pipelining ist solange korrekt, bis die Abbruchbedingung erfüllt ist. Das Pipelining ist also bis zur letzten Ausführung effizient. Nur beim letzten Durchlauf muss der Prozessor eine Reihe von bereits durchgeführten Schritten wieder löschen.