Um uns einige Effekte der Vektorisierung anzusehen, übersetzen wir linalg
neu mit der Option -O2, starten den Debugger und gehen bis zum Beginn der
Routine SETVEC mit
set step expression
break routine SETVEC
run .
Wir wollen nun das Array X überwachen und starten dazu vom Source-Fenster
aus ein ''Examine''-Fenster. Über dessen Menüs stellen wir die Adresse auf
''X'' und das Format auf ''longword, float'' und schalten die
''Auto-Update''-Funktion ein, damit Änderungen automatisch angezeigt werden.
Um den ersten Wert des X-Arrays zu setzen, gehen wir mit
next block 2
voran. Dies sollte zunächst den DO-Header überspringen und dann eine
Zuweisung ausführen. Tatsächlich aber ist sofort das ganze X-Array (100
Werte) mit Zufallszahlen gefüllt. Das liegt daran, daß die Zuweisung der
Arrays im Assembler durch einen einzigen Vektorbefehl ersetzt wird, der
max. 128 Elemente auf einmal übertragen kann.
Daß die Routine aber doch noch etwas länger ist als ein paar
Assemblerbefehle, wird deutlich, wenn wir uns mit ''info expression I''
ansehen, was aus I geworden ist:
Variable's storage is not available, line: 1 col: 18, I.
object type: Fortran identifier
location: <none>
size: 4 bytes
type: INTEGER*4
value: <unknown>
used to create 7 synthesized variable(s):
1. <OSTR> ?i0 = I
2. <TRIP> ?i1 = (-1*N)+(I-1)
3. <TRIP> ?i2 = N+((I-1)*-1)
4. <ISTR> ?i3 = ?i0+((I-1)%128)
5. <INDV> ?i4 = loc(Y)+((?i0-1)*8)
6. <INDV> ?i5 = loc(X)+((?i0-1)*8)
7. <INDV> ?i6 = ?i2
Wie zu erwarten, ist die Variable I selbst im Programm nicht mehr
vorhanden, sondern durch einige synthetische Variable ersetzt, darunter die
üblichen Pointer in die Arrays hinein (?i5, ?i6). Erstaunlich sind
allerdings die anderen Variablen, insbesondere ?i3, die über eine
Modulo-Operation (Operator %) aus I erzeugt wird. Dies sind die
Auswirkungen des sogenannten ''strip mining'', eines Verfahrens, um die
Arraylänge und die maximale Vektorlänge der Hardware in Einklang zu
bringen: Die eine Schleife über I wird in zwei Schleifen zerlegt, von
denen die innere über 128 Elemente geht und die äußere in 128-Blöcken
weitergeht. Das ''strip mining'' wird noch ausführlich im Abschnitt
4.2.1
besprochen.
Peter Junglas 18.10.1993