==================== Ein erster Benchmark [TOC] ==================== Am Beispiel der AXPY-Operation soll ein erster Benchmark durchgeführt werden. Die Zutaten für einen Benchmark sind - Eine Referenzimplementierung, d.h. eine Implementierung der wir vertrauen. - Eine Fehlerschranke, um zu testen, ob Abweichungen vom Referenzergebnis im zulässigen Bereich liegt: Seien $x, y \in \mathbb{M}^n$ und $\alpha \in \mathbb{M}^n$. Ferner sei $\|x\|_\infty \neq 0$. Ist $\hat{z}$ das Ergebnis der Referenzimplementierung von AXPY und $z$ das zu testende Ergebnis, dann muss gelten ---- LATEX -------------------------------------------------------------------------------- \frac{\|z - \hat{z}\|_\infty}{|\alpha| \cdot \|x\|_\infty \|y\|_\infty \cdot n} \quad\leq\quad \text{eps}. ------------------------------------------------------------------------------------------- Dabei bezeichnet $\text{eps}$ die Maschinengenauigkeit. - Der Benchmark wird für Werte $n_{\text{min}}, n_{\text{min}} + n_{\text{inc}}, \dots, n_{\text{max}}$ durchgeführt. Diese sollen durch Makros `N_MIN`, `N_INC` und `N_MAX` definiert werden. Beim Aufruf des Compilers soll es möglich sein die Deafult-Wert `N_MIN=10000`, `N_INC=1000` und `N_MIN=30000` zu überschreiben. - Der skalare Wert für $\alpha$ soll analog durch das Makro `ALPHA` gesetzt werden können. Als default-Wert soll $\alpha = 1$ verwendet werden. - Mit einem Timer für die *Wall-Time* (Zeit außerhalb des Computers) kann gestoppt werden wie lange die Implementierungen jeweils benötigen. Folgende Daten sollen dann ausgegeben werden: - *time elapsed* für beide Implementierungen. - *mflops* (mega flops) für beide Implementierungen. - *speedup factor* das ist der Quotient ---- LATEX ------------------------------------------------------------------------------- s = \frac{t_{\text{new}}}{t_{\text{ref}}} ------------------------------------------------------------------------------------------ - *error* das ist der obige Quotient. - Zum Testen sollen Vektoren mit zufälligen Werten benutzt werden. Wir benötigen also auch noch einen Zufallszahlengenerator. - Zu guter Letzt: Das Ergebnis soll durch schöne Plots visualisiert werden. Matrizen und Vektoren mit Zufallszahlen ======================================= Füllt die Matrix mit Zufallszahlen. Die Funktion `rand()` gibt Integer-Werte im Bereich `0,...,RAND_MAX-1` zurück. ---- CODE(type=c)--------------------------------------------------------------- void randGeMatrix(int m, int n, double *A, int incRowA, int incColA) { int i, j; for (j=0; j #include #include double walltime() { struct tms ts; static double ClockTick=0.0; if (ClockTick==0.0) { ClockTick = 1.0 / ((double) sysconf(_SC_CLK_TCK)); } return ((double) times(&ts)) * ClockTick; } -------------------------------------------------------------------------------- Fehlerschranke ============== ---- CODE(type=c)--------------------------------------------------------------- double err_daxpy(int n, double alpha, const double *x, int incX, const double *y, int incY, const double *z_, int incZ_, double *z, int incZ) { double normX = damax(n, x, incX); double normY = damax(n, y, incY); double normD; daxpy(n, -1.0, z_, incZ_, z, incZ); normD = damax(n, z, incZ); return normD/(fabs(alpha)*n*normX*normY); } -------------------------------------------------------------------------------- Das gesamte Benchmark-Programm ============================== :import: session04/example06/axpy_bench.c Benchmark durchführen ===================== ---- SHELL(path=session04/example06/,hostname=heim) ---------------------------- gcc -Wall -O1 -o axpy_bench axpy_bench.c ./axpy_bench > report.axpy cat report.axpy -------------------------------------------------------------------------------- Plot-Skript =========== :import: session04/example06/plot.axpy Resulate plotten ================ ---- SHELL(path=session04/example06/,hostname=heim) --------------------- gnuplot plot.axpy ------------------------------------------------------------------------- ---- IMAGE ----------------------- session04/example06/bench.axpy.svg ---------------------------------- :navigate: up -> doc:index back -> doc:session04/page08