( als PDF-Datei )
In numerischen Algorithmen oft benutzte Unterprogramme sind die Vektoroperationen:
s = scapr(n,X,Y)
s := ∑
xi yi
call vsaxpy(n,Z,X,alpha,Y)
zi := xi + α yi
mit einfacher Genauigkeit (REAL) aller Variablen
bzw. als DoublePrecision-Variante dscapr, vdaxpy.
Programmieren Sie diese 4 Unterprogramme und testen Sie diese zunächst an einfachen Beispielen,
indem Sie die Vektoren im Hauptprogramm mit konkreten Werten belegen (nicht alle Komponenten
eintippen!) - xi=fx(i,n), yi=fy(i,n).
Beachten Sie die Unterscheidung zwischen einfacher und doppelter Genauigkeit bei der
Vereinbarung der Variablen bzw. Vektoren und der Namen der aufzurufenden Funktionsunterprogramme
im Hauptprogramm.
Um die Rechenleistung zu messen, ruft man jeweils das Unterprogramm in einer
Programmschleife (M-mal) auf. Dabei werden die Anzahl M und die
Vektorlänge n ,,hinreichend'' groß
gewählt, damit die Anzahl 2·n·M der Gleitkommaoperationen
(flops) wenigstens eine Sekunde Rechenzeit benötigt. (Zeitmessung erfolgt außerhalb dieser Schleife,
also für alle M Aufrufe des jeweiligen Unterprogramms zusammen)
Man darf etwa 50... 2000 Mflops (Mio. Gleitkomma-Operationen pro Sekunde) erwarten, d.h. man sollte M
in Abhängigkeit von n so wählen, dass 2·n·M
ca. 100 Mio ist, um etwa 1 sec Rechenzeit zu erreichen (ggf. ist diese Zahl anzupassen).
Erläuterungen zur Zeitmessung in Fortran gibt es für Secnds (F77).
Entsprechende Fortran90-Routinen zur Zeitmessung können ebenfalls genutzt werden,
siehe Date_and_Time.
Man stelle fest, ob signifikante Rechenzeit-Unterschiede zwischen einfach- und doppeltgenauer Rechnung bestehen.
Das Programm soll später dazu verwendet werden, eine Tabelle für die Rechenleistung (in Mflops) in Abhängigkeit von der Vektorlänge auszugeben.
Solche Vektoroperationen können eventuell noch
beschleunigt werden, und zwar durch unrolled loops, d.h.
die innere Schleife der Unterprogramme läuft nicht mit Schrittweite 1, sondern
mit einer Schrittweite
Δi > 1:
|
Analog kann man in jedem Schleifendurchlauf bei vsaxpy mehrere Komponenten zi, zi+1, …, zi+Δi-1 berechnen, um die Anzahl der Schleifendurchläufe zu verringern.
Vergleichen Sie die Rechenzeiten für verschiedene Werte von Δi (z.B. Δi = 3,4,5,6,7).
|