Mögliche Hebel zum Zweck der Leistungssteigerung
(Fortsetzung)
Pipelining
Eine weitere Eigenschaft, ohne die moderne Prozessoren nur einen Bruchteil ihrer
Leistung entfalten könnten, ist das sog. Pipelining. Es basiert auf dem
Prinzip der gegenseitigen Unabhängigkeit der einzelnen Abarbeitungsschritte
eines von-Neumann Prozessors. Dieser arbeitet die Zyklen des Instruction-Fetch,
Instruction-Decode, Instruction-Execute und Instruction-Retirement strikt seriell
ab, wohingegen ein moderner Prozessor diese drei Dinge theoretisch gleichzeitig
erledigen kann, selbstverständlich für drei unterschiedliche Instruktionen.
In der Praxis sieht
dies bei einem modernen Mikroprozessor folgendermaßen aus: Während
der aktuelle Befehl ausgeführt wird (Instruction Execute), wird gleichzeitig
die vorhergehende Instruktion in den L1 Data Cache geschrieben (Instruction
Retirement), die nachfolgende Instruktion decodiert (Instruction-Decode) und
die übernächste Instruktion bereits aus dem Programmfluss ausgelesen
(Instruction-Fetch). Somit müssen die Befehlseinheiten im Optimalfall niemals
auf Daten warten: Sobald sie mit der Berechnung einer Instruktion fertig sind,
steht bereits die nächste an.
Branch Prediction
Die letzte erwähnenswerte Optimierung moderner Prozessoren ist die Branch
Prediction, zu Deutsch: Sprungvorhersage.
Sprünge stellen für Mikroprozessoren mit Pipeline ein ernsthaftes
Problem dar und beschäftigen weltweit hunderte von Informatikern und Ingenieuren.
Bei Sprüngen im Programmfluss wird unterschieden zwischen "conditional
jump" und "unconditional jump", zu Deutsch "Bedingter Sprung"
und "Unbedingter Sprung". Letztere sind leichter zu erkennen als Erstere,
schließlich gibt es beim Bedingten Sprung eine Bedingung, deren Erfüllung
oder Nichterfüllung über den weiteren Programmfluss entscheidet.
Tritt solch ein unverhergesehener Sprung im Programmfluss auf, so muss bei einem
modernen Mikroprozessor die gesamte Pipeline gelöscht und neu gefüllt
werden, ein Vorgang den man "Pipeline-Flush" oder auch "Flushing
the Pipeline" nennt, zu Deutsch etwa "Ausspülen der Pipeline".
Je länger die Pipeline ist, desto länger dauert logischerweise dieser
Vorgang, daher kommt der Sprungvorhersage bei modernen und zukünftigen
Prozessoren mit 20- und mehr-stufigen Pipelines eine enorme Bedeutung zu, deren
Unterschätzung für einen Mikroprozessor den frühen Tod bedeuten
kann.
Eine Sprungvorhersage
(Eigentlich ist dies eine falsche Übersetzung, "branch prediction"
lautet korrekt übersetzt "Abzweigungsvorhersage" oder "Verzweigungsvorhersage")
versucht zu erraten, welche Richtung der Programmfluss bei einem bedingten Sprung
einlegen wird. Hierbei werden die verschiedenen Verzweigungsmöglichkeiten
des Programmflusses genauestens geprüft (der IBM Power4 nimmt hier gar
drei Prüfungen parallel vor) und nach Wahrscheinlichkeiten gewichtet. Die
Verzweigung mit der höchsten Wahrscheinlichkeit wird anschließend
als weiter Verlauf des Programms definiert und die Pipeline mit den entsprechenden
Instruktionen gefüllt.
Doch wie das Wort "Wahrscheinlichkeit" schon sagt, gibt es keine Garantie,
dass der Programmfluss die vorhergesagte Richtung auch wirklich einschlägt.
Somit wird es immer den Fall geben, dass aufgrund Versagens der Sprungvorhersage-Logik,
die Pipeline ausgespült und neu gefüllt werden muss.
Die perfekte Sprungvorhersage, mit 99% Treffsicherheit (oder gar mehr), hat
bisher noch niemand konstruieren können, Informatiker und Ingenieure rund
um den Globus beschäftigen sich mit dem Modell der "Sprungvorhersage".
In angesehenen wissenschaftlichen Magazinen wie dem Dr. Dobbs Journal oder dem
ACM Computing Survey erscheinen regelmäßig wissenschaftliche Publikationen,
die sich dem Thema annehmen und mögliche Lösungsansätze vorschlagen.
Diesen Artikel bookmarken oder senden an ...