Vektorisierung

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.

previous    contents     next

Peter Junglas 18.10.1993