M. Pester - LV im SS 2017

Rechenleistung bei Vektoroperationen

( als PDF-Datei )

  1. 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.

  2. 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.

  3. 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:

    m
    =
    mod (n,Δi)
    S
    =
    m

    i=1 
    xi·yi
    S
    =
    S +
    n


    i=m+1
    (step Δi)
     
    ( (xi·yi) + (xi +1·yi +1) + … + (xi+Δi -1·yi+Δ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).

  4. Berechnung der Euklidischen Norm eines Vektors als Funktionsunterprogramm
    Xnorm = ENorm(n,X)               √

    n

    i=1 
    xi2
     
    .



    File translated from TEX by TTH, version 3.00.