Vektorlänge

Um die Geschwindigkeit eines Vektorrechners auszunutzen, muß man natürlich die Vektoreinheiten gut ausnutzen. Da mit jeder Vektoroperation eine Startzeit verknüpft ist, die unabhängig von der Vektorlänge ist, heißt das insbesondere, daß man kurze Vektorlängen möglichst vermeiden bzw. für möglichst lange Vektoren sorgen muß.
Eine Methode, dies zu erreichen, die manchmal sehr gut funktioniert, ist das Umschreiben von Array- auf Vektor-Operationen. Dies läßt sich in unserem Beispiel vor allem an den Routinen getmat und setmat ausprobieren: Beide Routinen beziehen sich nicht auf die Array-Struktur der Argumente, sondern greifen einfach auf alle Elemente zu. Daher können die übergebenen Arrays als riesige Vektoren aufgefaßt und entsprechend indiziert werden. Allerdings muß man jetzt die ''physikalischen'' Arraygrößen (NMAX) verwenden, was die Zahl der Operationen entsprechend vergrößert (hier von 100x100 auf 101x101).

Routine CPU-Zeit CPU-Zeit . 
  (NMAX=100) (NMAX=101) . 
  . 
getmat 0 .027 0 .028
setmat 0 .880m 0 .879m


Die Ausbeute ist mager, weil bei 100x100-Matrizen die Vektoren schon die Länge 100 haben, verglichen mit der Maximallänge der Vektoreinheit von 128 also schon fast optimal. Außerdem vektorisiert die Schleife in getmat wegen der Aufrufe von drand sowieso nicht. Bei kleineren Matrizen lassen sich aber z.T. recht erhebliche Beschleunigungen erzielen.

previous    contents     next

Peter Junglas 18.10.1993