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.
Peter Junglas 18.10.1993