Mögliche Hebel zum Zweck der Leistungssteigerung
(Fortsetzung)
Superskalare
Arbeitsweise
Die von-Neumann
Architektur für Mikroprozessoren definiert einen Computer sehr genau. So
hat ein von-Neumann Prozessor strikt seriell und immer nach bestimmtem Schema
zu arbeiten. Wer mit der von-Neumann Architektur noch nicht vertraut ist, dem sei empfohlen, dem Link zu folgen, schließlich
stellt diese Architektur bis heute die Grundlage jeglicher Mikroprozessoren
dar.
Mit einem strikt
dieser Architektur folgenden Mikroprozessor würde man jedoch niemals eine
IPC > 1 erreichen können. Die Tatsache, dass heutige Prozessoren einen
IPC >> 1 haben, gründet schlicht und ergreifend auf der Tatsache,
dass die Ingenieure die von-Neumann Architektur nach eigenen Vorstellung etwas
verbogen haben und den Mikroprozessoren, beginnend mit dem Intel Pentium (586),
die superskalare Arbeitsweise beigebracht haben.
Ein superskalarer Mikroprozessor unterscheidet sich hauptsächlich im Leitwerk
von einem nicht-superskalaren Mikroprozessor. So teilt dieses einer Recheneinheit
nicht mehr lediglich eine Instruktion pro Takt zu, sondern gleich mehrere unterschiedliche
Instruktionen für mehrere unterschiedliche Recheneinheiten. Der Mikroprozessor
ist somit in der Lage, mehrere Instruktionen parallel abzuarbeiten, solange
diese oder ihr Ergebnis nicht voneinander abhängig sind. Somit kann ein
zweifach superskalarer Mikroprozessor bei gleichem Takt im Idealfall doppelt
so viele Instruktionen pro Sekunde abarbeiten, wie ein serieller Mikroprozessor.
Dieser Effekt wird erreicht, indem an unterschiedlichen Stellen der Mikroprozessor
optimiert wird. So muss beispielsweise der Decoder mehr als nur eine Instruktion
pro Taktzyklus decodieren können, es müssen mehrere voneinander unabhängige
Recheneinheiten vorhanden sein und auch die interne Bandbreite muss stimmen.
So versauern beispielsweise im Falle des Pentium 4 pro Taktzyklus sechs
Recheneinheiten, da der Trace-Cache lediglich einen Durchsatz von 3 µOps/Takt
erreicht.
Die erste Implementierung
superskalarer Arbeitsweise fand im 586 (Intel Pentium) statt, der grundsätzlich
nicht mehr ist, als ein superskalarer 80486 mit zweistufigem Decoder. Die sog.
U-V Struktur des Decoders wurde alsbald von der 4-1-1 Struktur
des Decoders des 686 (Intel Pentium Pro), der nun dreistufig arbeitet, abgelöst.
Out-of-order
Execution
Eine weitere Möglichkeit der Laufzeitoptimierung ist die sog. Out-of-Order
Execution (zu Deutsch: "Ausführung außerhalb der Reihenfolge").
Sie bietet einen enormen Zuwachs an Geschwindigkeit, denn plötzlich können
Instruktionen bereits ausgeführt werden auch wenn sie noch gar nicht an
der Reihe wären (Stichwort: Serieller Programmfluss der von-Neumann Architektur).
Um dies besser verständlich zu machen, ein kleines Beispiel:
Nehmen wir an, dass eine Instruktion Daten aus dem Speicher einlesen muss. Dies
führt dazu, dass der Prozessor für mehrere hundert bis tausend Taktzyklen
auf die Daten warten muss und quasi zum Nichtstun verdammt ist. Gibt es jedoch
in der Pipeline Instruktionen, die von der derzeit auf Daten aus dem Speicher
wartenden Instruktion weder abhängen noch mit ihr in Zusammenhang stehen,
kann der Prozessor die nötige Wartezeit mit der Ausführung dieser
Instruktionen überbrücken.
In Zusammenhang mit hohem ILP und TLP (siehe folgendes Kapitel) kann eine enorme
Verbesserung der Performance, ohne notwendige Eingriffe seitens des Programmierers
oder Compilers, erreicht werden.
Diesen Artikel bookmarken oder senden an ...