Information Technology Reference
In-Depth Information
Falls ein verzweigender Sprungbefehl um genau einen Befehl verzögert bearbeitet
wird, kann im Umkehrschluss daraus leider nicht gefolgert werden, dass sich bei
Ausführung eines Sprungbefehls nur ein einzelner nachfolgender Befehl im Fließ-
band befindet. Tatsächlich führt man in modernen Prozessoren einen Sprungbefehl
selten bereits in der zweiten Fließbandstufe aus. Auch werden oft mehrere Befehle
parallel bearbeitet, so dass in jeder Fließbandstufe statt einem oft drei oder vier
Befehle verweilen können (siehe Abschnitt 3.2).
t 0
t 1
t 2
t 3
t 4
t 5
t 6
t 7
t
cmp
r1, r2
Fetch
bne
add
and
Ein Verzögerungsbefehl
bne
L1
Decode
bne
add
and
add
r3, r4, r5
Execute
add
and
￿￿￿￿￿￿￿￿￿￿￿￿￿￿
:
L1 :
and
r9, r10, r11
Write Back
￿￿￿￿￿￿￿￿￿￿￿￿￿￿
￿￿￿￿￿￿￿￿￿￿￿￿￿￿
add
and
a
b
Bild 2.26. Verzögerte Verzweigung mit einer Verzögerungsstufe durch look ahead resolution. a Pro-
gramm. b Zeitlicher Verlauf
Verzögerte Verzweigungen finden heute vor allem aus Kompatibilitätsgründen Ver-
wendung. Zum Beispiel ist im UltraSPARC IIIi von Sun [173] ein vierzehnstufiges
Fließband realisiert, in dem Sprungbefehle spekulativ (siehe Abschnitt 2.2.4) in der
vierten und definitiv in der achten Fließbandstufe zur Ausführung kommen. Der
Prozessor kann mit jedem Takt vier Befehle parallel verarbeiten, so dass sich zwi-
schen Sprungbefehl und Verzweigung wenigstens 12 (3 4) Verzögerungsstufenbe-
fehle ausführen lassen. Dies geschieht jedoch nicht, da der Prozessor kompatibel zu
dem Mitte der 80er Jahre entwickelten SPARC (z.B. der CY7C601 von Cypress
[133]) sein muss, der mit einem vierstufigen Fließband realisiert ist und Sprungbe-
fehle, wie oben beschrieben, tatsächlich in der zweiten Fließbandstufe ausführt.
Beispiel 2.3. Verzögerte Verzweigung . In Bild 2.27 sind als Beispiel für die Programmierung
eines Prozessors, der Sprungbefehle mit einer Verzögerungsstufe ausführt, zwei Befehlsfolgen für
den UltraSPARC IIIi dargestellt, mit denen sich jeweils die Länge einer nullterminierten Zeichen-
kette einschließlich der abschließenden Null zählen lässt. Als Vorgabe werden im Arbeitsregister
%l0 (ein lokales 32 Bit Arbeitsregister) die Adressen der Zeichenketten übergeben. Die Endergeb-
nisse befinden sich nach dem Programmlauf im Register %l1.
Die Befehlsfolge in Bild 2.27a löst das Problem ohne Optimierung: Zuerst wird der Zeichenzähler
mit Null initialisiert und in einer Schleife jeweils ein Zeichen gelesen (ldub, load unsigned byte),
der Zeichenzähler bzw. Index für den Ladebefehl inkrementiert (add) und schließlich geprüft, ob
das Zeichenkettenende erreicht wurde (cmp, compare). Die Schleife wird wiederholt, wenn letzte-
res nicht der Fall ist, sie terminiert, wenn letzteres der Fall ist (bne, branch not equal), wobei der auf
den Sprungbefehl folgende nop als Verzögerungsstufenbefehl grundsätzlich zur Ausführung
kommt.
In Bild 2.27b ist die optimierte Befehlsfolge dargestellt. Die Optimierung geschieht hier nach
einem Standardverfahren, das sich leicht in einem Übersetzer implementieren lässt. Dabei macht
man sich zu nutze, dass nach einem Schleifensprung unmittelbar der erste Befehl der Schleife folgt,
wenn hier von dem in seiner Wirkung neutralen nop-Befehl einmal abgesehen wird (in Bild 2.27a
ist dies ldub). Solange man die Schleife wiederholt, lässt sich der erste Befehl als Verzögerungsstu-
fenbefehl codieren (was im Bild durch den dicken Pfeil angedeutet ist). Allerding ist dabei zu
 
Search WWH ::




Custom Search