Doping für CPUs — Möglichkeiten der Leistungssteigerung
Mögliche Hebel zum Zweck der Leistungssteigerung (Pipelining)
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.