Information Technology Reference
In-Depth Information
punkt der Ladeoperation vorzuverlegen, lässt sich die Speicherlatenzzeit jedoch
durch Ausführung paralleler Operationen verdecken. Weil hierbei die Ladeoperation
vor die bedingte Sprungoperation in Zeile 3 geschoben werden muss, ist dies jedoch
nur spekulativ möglich 1 .
1:
sub
r1 = r2, r3;;
1:
ld8.s
r31 = [r5]
2:
sub
r1 = r2, r3;;
2:
cmp.eq
p1, p0 = r1, 0
3: (p1)
br.cond
anywhere;;
3:
cmp.eq
p1, p0 = r1, 0
4:
(p1)
br.cond
anywhere;;
4:
ld8
r4 = [r5];;
5:
chk.s
r31, recovery
5:
add
r4 = r4 , 1;;
6:
add
r4 = r31 , 1;;
a
b
Bild 3.19. Kontrollflussspekulation beim IA-64. a Ursprüngliches Programm. b Programm nach
Modifikation: Die Ladeoperation wird vor dem Sprung ausgeführt und später durch die Check-
Operation (chk) überprüft
Das entsprechend abgeänderte Programm ist in Bild 3.19b aufgelistet. Die Ausfüh-
rung der jetzt in Zeile 1 stehenden Ladeoperation erfolgt parallel zur Subtraktion.
Dabei wird statt r4 das temporäre Register r31 geladen, um so sicherzustellen, dass
beim möglichen Verzweigen zur Sprungmarke anywhere in Zeile 4 (falls r1 gleich 0
ist) der korrekte Inhalt von r4 weiterhin verfügbar bleibt. Natürlich muss der Inhalt
von r31, falls die bedingte Sprungoperation nicht verzweigt, regulär nach r4 kopiert
werden. Dies lässt sich jedoch vermeiden, indem man statt r4 in dem entsprechen-
den Programmzweig fortan r31 als Operand verwendet. Die Addition in Zeile 6 ist
aus diesem Grund entsprechend abgeändert.
Ein Problem der spekulativen Ausführung von Ladebefehlen wurde bisher noch
nicht erwähnt: Es kann dabei nämlich zu Ausnahmeanforderungen kommen, die nur
bearbeitet werden dürfen, wenn feststeht, dass die Ladeoperation definitiv ausge-
führt wird, wenn also in Bild 3.19b der Sprungbefehl nicht verzweigt. Durch das der
Ladeoperation angeheftete Attribut „.s“ wird aus diesem Grund dafür gesorgt, dass
Ausnahmeanforderungen nicht unmittelbar bearbeitet, sondern deren Auftreten
zunächst nur in einem dem Zielregister zugeordneten Bit protokolliert werden (dem
sog. Not-a-Thing- , NaT-Bit ).
Die Auswertung des Bits geschieht durch die Check-Operation (chk), und zwar an
der Stelle im Programm, an der ursprünglich die Ladeoperation codiert war (weil
kein weiteres Ergebnis erzeugt wird, lässt sie sich im Gegensatz zur ursprünglichen
Ladeoperation parallel zur nachfolgenden Addition bearbeiten). Falls das NaT-Bit
des Registers r31 gelöscht, also keine Ausnahmesituation eingetreten ist, werden
von der Check-Operation weitere Aktionen nicht veranlasst. Falls jedoch das NaT-
Bit gesetzt ist, wird zur Sprungmarke recovery verzweigt. Dort kann z.B. die Ladeo-
peration ohne das Attribut „.s“ wiederholt ausgeführt und so dafür gesorgt werden,
dass die nun auftretende Ausnahmeanforderung wie gewohnt bearbeitet wird.
1. Die Funktionsweise des Vergleichsbefehls cmp.eq und des bedingten Sprungbefehls br.cond
wird im nächsten Abschnitt erläutert. Für den Moment reicht es aus zu wissen, dass hier zur
Sprungmarke anywhere verzweigt wird, wenn r1 gleich 0 ist.
Search WWH ::




Custom Search