UlmBLAS (Level 1)
Wir wollen unsere eigen BLAS Implementierung erstellen. Das erste Ziel ist hierbei:
-
Erst einmal implementieren wir nur die 10 Level 1 Routinen und davon nur die double Varianten.
-
Unsere Implementierung muss die Netlib Test Suite bestehen. Wir benötigen also ein zur BLAS Referenz-Implementierung kompatibles Interface. Damit kann man dann automatisch auch BLAS Benchmarks benutzen.
Schritt: RefBLAS, Test Suite, Verzeichnisse
Wir beginnen mit der Organisation. Folgende Unterverzeichnisse wird es geben:
-
level1: Hier entsteht unsere eigene Implementierung. Jede BLAS Funktion bekommt eine eigene Datei (dasum.c, daxpy.c, ...). Am Anfang ist das natürlich leer.
-
refblas: Hier legen wir alle BLAS Funktionen der Referenz Implementierung von Netlib ab. Ein Makefile das all diese Source Files übersetzt und eine statische Bibliothek erzeugt müsst ihr schreiben.
-
test: Hier kommt die Test Suite rein. Diese besteht aus einer Anzahl von Fortran Source Files. Für uns ist zunächst nur dblat1.f relevant. Ein Makefile zum Testen der Level 1 Funktionen ist bereits enthalten. Schaut euch diese Makefile genau an. Dinge wie wildcard und patsubst sind sehr nützlich!
Aufgabe:
-
Den tarball step1.tgz speichern und entpacken:
-
Mit tar tfvz step1.tgz könnt ihr zunächst nur das Inhaltverzeichnis des tarball anschauen und
-
mit tar xfvz entpacken.
-
-
Ein makefile für refblas schreiben:
-
Am Ende soll ../librefblas.a erzeugt werden (also librefblas.a im Eltern-Verzeichnis ..).
-
Erst soll aus allen Fortran Files der Form *.f ein Object File erzeugt werden.
-
Die Object File werden dann mit dem ar Befehl in eine statische Bibliothek archiviert. Schaut euch an welche Optionen ihr benötigt.
-
Mit make in refblas die Bibliothek erzeugen.
-
-
Testen, ob die Test Suite durchläuft: In test erst mit make die Test Suite erzeugen, dann mit make check_ref die Referenz Implementierung testen.
Schritt: Stubs für UlmBLAS
Ein Lösungsvorschlag könnt ist in step2.tgz enthalten. Wenn alles geklappt hat, dann habt ihr in refblas ein Makefile der Art
FFLAGS += -fimplicit-none
SOURCE_FILES = $(wildcard *.f)
OBJECT_FILES = $(patsubst %.f,%.o,$(SOURCE_FILES))
REFBLAS = ../librefblas.a
all : $(REFBLAS)
$(REFBLAS) : $(OBJECT_FILES)
ar cru $(REFBLAS) $(OBJECT_FILES)
ranlib $(REFBLAS)
%.o : %.f
$(FC) $(FFLAGS) -c -o $@ $<
clean :
rm -f $(OBJECT_FILES)
rm -f $(REFBLAS)
Und ihr könnt folgendes machen:
$shell> cd refblas $shell> make make: Nothing to be done for `all'. $shell> cd ../test $shell> make make: Nothing to be done for `all'. $shell> make check_ref rm -f *.SUMM ./dblat1_ref Real BLAS Test Program Results Test of subprogram number 1 DDOT ----- PASS ----- Test of subprogram number 2 DAXPY ----- PASS ----- Test of subprogram number 3 DROTG ----- PASS ----- Test of subprogram number 4 DROT ----- PASS ----- Test of subprogram number 5 DCOPY ----- PASS ----- Test of subprogram number 6 DSWAP ----- PASS ----- Test of subprogram number 7 DNRM2 ----- PASS ----- Test of subprogram number 8 DASUM ----- PASS ----- Test of subprogram number 9 DSCAL ----- PASS ----- Test of subprogram number 10 IDAMAX ----- PASS -----
Dass die Referenz Implementierung Warnungen liefert ist nicht unsere Schuld.
Aufgabe:
-
Für jede BLAS Level 1 Funktion oder Routine soll jetzt ein C-Funktionsrumpf erzeugt werden.
-
Das sieht zum Beispiel für ddot so aus
ddot_(const int *_n,
const double *x,
const int *_incX,
const double *y,
const int *_incY)
{
}
-
Und für daxpy sieht es so aus
daxpy_(const int *n,
const double *alpha,
const double *x,
const double *incX,
double *y,
int *incY)
{
}
-
Schaut euch dazu das zugehörig Fortran Source File an
-
Überlegt euch, ob ein Pointer const sein kann oder nicht
-
Schreibt ein Makefile, das alle C-Files in level1 in Object Files übersetzt und eine statische Bibliothek libulmblas.a im obersten Verzeichnis erzeugt.
-
Im Ordner test sollte jetzt auch ein Target check_ulm hinzugefügt werden, das unsere BLAS Implementierung testet.
Schritt: Erste UlmBLAS Implementierung und Tests
Ein Lösungsvorschlag für die vorige Aufagbe ist in step3.tgz enthalten.
Jetzt wird es Zeit mit der UlmBLAS Implementierung zu beginnen. Für ddot könnte die so aussehen:
ddot_(const int *_n,
const double *x,
const int *_incX,
const double *y,
const int *_incY)
{
int n = *_n;
int incX = *_incX;
int incY = *_incY;
int i;
double result = 0.0;
if (incX<0) {
x -= incX*(n-1);
}
if (incY<0) {
y -= incY*(n-1);
}
for (i=0; i<n; ++i, x+=incX, y+=incY) {
result += (*x) * (*y);
}
return result;
}
Diese besteht auf den ersten Test (alle anderen test gehen natürlich noch schief):
$shell> cd level1 $shell> make make: Nothing to be done for `all'. $shell> cd ../refblas $shell> make make: Nothing to be done for `all'. $shell> cd ../test $shell> make make: Nothing to be done for `all'. $shell> make check_ulm rm -f *.SUMM ./dblat1_ulm Real BLAS Test Program Results Test of subprogram number 1 DDOT ----- PASS ----- Test of subprogram number 2 DAXPY FAIL CASE N INCX INCY MODE I COMP(I) TRUE(I) DIFFERENCE SIZE(I) 2 1 1 1 9999 1 0.50000000D+00 0.68000000D+00 -0.1800D+00 0.1170D+01 2 2 1 1 9999 1 0.50000000D+00 0.68000000D+00 -0.1800D+00 0.1170D+01 2 2 1 1 9999 2 -0.90000000D+00 -0.87000000D+00 -0.3000D-01 0.1170D+01 2 4 1 1 9999 1 0.50000000D+00 0.68000000D+00 -0.1800D+00 0.1170D+01 2 4 1 1 9999 2 -0.90000000D+00 -0.87000000D+00 -0.3000D-01 0.1170D+01 2 4 1 1 9999 3 0.30000000D+00 0.15000000D+00 0.1500D+00 0.1170D+01 2 4 1 1 9999 4 0.70000000D+00 0.94000000D+00 -0.2400D+00 0.1170D+01 2 1 2 -2 9999 1 0.50000000D+00 0.68000000D+00 -0.1800D+00 0.1170D+01 2 2 2 -2 9999 1 0.50000000D+00 0.35000000D+00 0.1500D+00 0.1170D+01 2 2 2 -2 9999 3 0.30000000D+00 0.48000000D+00 -0.1800D+00 0.1170D+01 2 4 2 -2 9999 1 0.50000000D+00 0.38000000D+00 0.1200D+00 0.1170D+01 2 4 2 -2 9999 3 0.30000000D+00 0.57000000D+00 -0.2700D+00 0.1170D+01 2 4 2 -2 9999 5 -0.60000000D+00 -0.75000000D+00 0.1500D+00 0.1170D+01 2 4 2 -2 9999 7 0.80000000D+00 0.98000000D+00 -0.1800D+00 0.1170D+01 2 1 -2 1 9999 1 0.50000000D+00 0.68000000D+00 -0.1800D+00 0.1170D+01 2 2 -2 1 9999 1 0.50000000D+00 0.35000000D+00 0.1500D+00 0.1170D+01 2 2 -2 1 9999 2 -0.90000000D+00 -0.72000000D+00 -0.1800D+00 0.1170D+01 2 4 -2 1 9999 1 0.50000000D+00 0.38000000D+00 0.1200D+00 0.1170D+01 2 4 -2 1 9999 2 -0.90000000D+00 -0.63000000D+00 -0.2700D+00 0.1170D+01 2 4 -2 1 9999 3 0.30000000D+00 0.15000000D+00 0.1500D+00 0.1170D+01 2 4 -2 1 9999 4 0.70000000D+00 0.88000000D+00 -0.1800D+00 0.1170D+01 2 1 -1 -2 9999 1 0.50000000D+00 0.68000000D+00 -0.1800D+00 0.1170D+01 2 2 -1 -2 9999 1 0.50000000D+00 0.68000000D+00 -0.1800D+00 0.1170D+01 2 2 -1 -2 9999 3 0.30000000D+00 0.33000000D+00 -0.3000D-01 0.1170D+01 2 4 -1 -2 9999 1 0.50000000D+00 0.68000000D+00 -0.1800D+00 0.1170D+01 2 4 -1 -2 9999 3 0.30000000D+00 0.33000000D+00 -0.3000D-01 0.1170D+01 2 4 -1 -2 9999 5 -0.60000000D+00 -0.75000000D+00 0.1500D+00 0.1170D+01 2 4 -1 -2 9999 7 0.80000000D+00 0.10400000D+01 -0.2400D+00 0.1170D+01 Test of subprogram number 3 DROTG FAIL CASE N INCX INCY MODE I COMP(I) TRUE(I) DIFFERENCE SIZE(I) 3 1 9999 9999 9999 1 0.30000000D+00 0.50000000D+00 -0.2000D+00 0.5000D+00 3 1 9999 9999 9999 1 0.40000000D+00 0.16666667D+01 -0.1267D+01 0.1667D+01 3 1 9999 9999 9999 1 0.42439916-313 0.60000000D+00 -0.6000D+00 0.6000D+00 3 1 9999 9999 9999 1 0.15576089-312 0.80000000D+00 -0.8000D+00 0.8000D+00 3 2 9999 9999 9999 1 0.40000000D+00 0.50000000D+00 -0.1000D+00 0.5000D+00 3 2 9999 9999 9999 1 0.30000000D+00 0.60000000D+00 -0.3000D+00 0.6000D+00 3 2 9999 9999 9999 1 0.42439916-313 0.80000000D+00 -0.8000D+00 0.8000D+00 3 2 9999 9999 9999 1 0.15576089-312 0.60000000D+00 -0.6000D+00 0.6000D+00 3 3 9999 9999 9999 1 -0.30000000D+00 0.50000000D+00 -0.8000D+00 0.5000D+00 3 3 9999 9999 9999 1 0.40000000D+00 -0.16666667D+01 0.2067D+01 -0.1667D+01 3 3 9999 9999 9999 1 0.42439916-313 -0.60000000D+00 0.6000D+00 -0.6000D+00 3 3 9999 9999 9999 1 0.15576089-312 0.80000000D+00 -0.8000D+00 0.8000D+00 3 4 9999 9999 9999 1 -0.40000000D+00 -0.50000000D+00 0.1000D+00 -0.5000D+00 3 4 9999 9999 9999 1 0.30000000D+00 -0.60000000D+00 0.9000D+00 -0.6000D+00 3 4 9999 9999 9999 1 0.42439916-313 0.80000000D+00 -0.8000D+00 0.8000D+00 3 4 9999 9999 9999 1 0.15576089-312 -0.60000000D+00 0.6000D+00 -0.6000D+00 3 5 9999 9999 9999 1 -0.30000000D+00 -0.50000000D+00 0.2000D+00 -0.5000D+00 3 5 9999 9999 9999 1 -0.40000000D+00 0.16666667D+01 -0.2067D+01 0.1667D+01 3 5 9999 9999 9999 1 0.42439916-313 0.60000000D+00 -0.6000D+00 0.6000D+00 3 5 9999 9999 9999 1 0.15576089-312 0.80000000D+00 -0.8000D+00 0.8000D+00 3 6 9999 9999 9999 1 0.42439916-313 0.10000000D+01 -0.1000D+01 0.1000D+01 3 6 9999 9999 9999 1 0.15576089-312 0.00000000D+00 0.1558-312 0.0000D+00 3 7 9999 9999 9999 1 0.00000000D+00 0.10000000D+01 -0.1000D+01 0.1000D+01 3 7 9999 9999 9999 1 0.42439916-313 0.00000000D+00 0.4244-313 0.0000D+00 3 7 9999 9999 9999 1 0.15576089-312 0.10000000D+01 -0.1000D+01 0.1000D+01 3 8 9999 9999 9999 1 0.42439916-313 0.10000000D+01 -0.1000D+01 0.1000D+01 3 8 9999 9999 9999 1 0.15576089-312 0.00000000D+00 0.1558-312 0.0000D+00 Test of subprogram number 4 DROT FAIL CASE N INCX INCY MODE I COMP(I) TRUE(I) DIFFERENCE SIZE(I) 4 1 1 1 9999 1 0.60000000D+00 0.78000000D+00 -0.1800D+00 0.1170D+01 4 1 1 1 9999 1 0.50000000D+00 0.40000000D-01 0.4600D+00 0.1170D+01 4 2 1 1 9999 1 0.60000000D+00 0.78000000D+00 -0.1800D+00 0.1170D+01 4 2 1 1 9999 2 0.10000000D+00 -0.46000000D+00 0.5600D+00 0.1170D+01 4 2 1 1 9999 1 0.50000000D+00 0.40000000D-01 0.4600D+00 0.1170D+01 4 2 1 1 9999 2 -0.90000000D+00 -0.78000000D+00 -0.1200D+00 0.1170D+01 4 4 1 1 9999 1 0.60000000D+00 0.78000000D+00 -0.1800D+00 0.1170D+01 4 4 1 1 9999 2 0.10000000D+00 -0.46000000D+00 0.5600D+00 0.1170D+01 4 4 1 1 9999 3 -0.50000000D+00 -0.22000000D+00 -0.2800D+00 0.1170D+01 4 4 1 1 9999 4 0.80000000D+00 0.10600000D+01 -0.2600D+00 0.1170D+01 4 4 1 1 9999 1 0.50000000D+00 0.40000000D-01 0.4600D+00 0.1170D+01 4 4 1 1 9999 2 -0.90000000D+00 -0.78000000D+00 -0.1200D+00 0.1170D+01 4 4 1 1 9999 3 0.30000000D+00 0.54000000D+00 -0.2400D+00 0.1170D+01 4 4 1 1 9999 4 0.70000000D+00 0.80000000D-01 0.6200D+00 0.1170D+01 4 1 2 -2 9999 1 0.60000000D+00 0.78000000D+00 -0.1800D+00 0.1170D+01 4 1 2 -2 9999 1 0.50000000D+00 0.40000000D-01 0.4600D+00 0.1170D+01 4 2 2 -2 9999 1 0.60000000D+00 0.66000000D+00 -0.6000D-01 0.1170D+01 4 2 2 -2 9999 3 -0.50000000D+00 -0.10000000D+00 -0.4000D+00 0.1170D+01 4 2 2 -2 9999 1 0.50000000D+00 0.70000000D+00 -0.2000D+00 0.1170D+01 4 2 2 -2 9999 3 0.30000000D+00 -0.12000000D+00 0.4200D+00 0.1170D+01 4 4 2 -2 9999 1 0.60000000D+00 0.96000000D+00 -0.3600D+00 0.1170D+01 4 4 2 -2 9999 3 -0.50000000D+00 -0.76000000D+00 0.2600D+00 0.1170D+01 4 4 2 -2 9999 7 -0.40000000D+00 -0.20000000D-01 -0.3800D+00 0.1170D+01 4 4 2 -2 9999 1 0.50000000D+00 0.64000000D+00 -0.1400D+00 0.1170D+01 4 4 2 -2 9999 3 0.30000000D+00 -0.30000000D+00 0.6000D+00 0.1170D+01 4 4 2 -2 9999 5 -0.60000000D+00 -0.18000000D+00 -0.4200D+00 0.1170D+01 4 4 2 -2 9999 7 0.80000000D+00 0.28000000D+00 0.5200D+00 0.1170D+01 4 1 -2 1 9999 1 0.60000000D+00 0.78000000D+00 -0.1800D+00 0.1170D+01 4 1 -2 1 9999 1 0.50000000D+00 0.40000000D-01 0.4600D+00 0.1170D+01 4 2 -2 1 9999 1 0.60000000D+00 -0.60000000D-01 0.6600D+00 0.1170D+01 4 2 -2 1 9999 3 -0.50000000D+00 -0.10000000D+00 -0.4000D+00 0.1170D+01 4 2 -2 1 9999 1 0.50000000D+00 0.70000000D+00 -0.2000D+00 0.1170D+01 4 2 -2 1 9999 2 -0.90000000D+00 -0.10800000D+01 0.1800D+00 0.1170D+01 4 4 -2 1 9999 1 0.60000000D+00 0.90000000D+00 -0.3000D+00 0.1170D+01 4 4 -2 1 9999 3 -0.50000000D+00 -0.22000000D+00 -0.2800D+00 0.1170D+01 4 4 -2 1 9999 5 0.90000000D+00 0.18000000D+00 0.7200D+00 0.1170D+01 4 4 -2 1 9999 7 -0.40000000D+00 -0.20000000D-01 -0.3800D+00 0.1170D+01 4 4 -2 1 9999 1 0.50000000D+00 0.64000000D+00 -0.1400D+00 0.1170D+01 4 4 -2 1 9999 2 -0.90000000D+00 -0.12600000D+01 0.3600D+00 0.1170D+01 4 4 -2 1 9999 3 0.30000000D+00 0.54000000D+00 -0.2400D+00 0.1170D+01 4 4 -2 1 9999 4 0.70000000D+00 0.20000000D+00 0.5000D+00 0.1170D+01 4 1 -1 -2 9999 1 0.60000000D+00 0.78000000D+00 -0.1800D+00 0.1170D+01 4 1 -1 -2 9999 1 0.50000000D+00 0.40000000D-01 0.4600D+00 0.1170D+01 4 2 -1 -2 9999 1 0.60000000D+00 0.78000000D+00 -0.1800D+00 0.1170D+01 4 2 -1 -2 9999 2 0.10000000D+00 0.26000000D+00 -0.1600D+00 0.1170D+01 4 2 -1 -2 9999 1 0.50000000D+00 0.40000000D-01 0.4600D+00 0.1170D+01 4 2 -1 -2 9999 3 0.30000000D+00 0.18000000D+00 0.1200D+00 0.1170D+01 4 4 -1 -2 9999 1 0.60000000D+00 0.78000000D+00 -0.1800D+00 0.1170D+01 4 4 -1 -2 9999 2 0.10000000D+00 0.26000000D+00 -0.1600D+00 0.1170D+01 4 4 -1 -2 9999 3 -0.50000000D+00 -0.76000000D+00 0.2600D+00 0.1170D+01 4 4 -1 -2 9999 4 0.80000000D+00 0.11200000D+01 -0.3200D+00 0.1170D+01 4 4 -1 -2 9999 1 0.50000000D+00 0.40000000D-01 0.4600D+00 0.1170D+01 4 4 -1 -2 9999 3 0.30000000D+00 0.18000000D+00 0.1200D+00 0.1170D+01 4 4 -1 -2 9999 5 -0.60000000D+00 -0.18000000D+00 -0.4200D+00 0.1170D+01 4 4 -1 -2 9999 7 0.80000000D+00 0.16000000D+00 0.6400D+00 0.1170D+01 4 4 1 1 9999 1 0.10000000D+01 -0.10000000D+01 0.2000D+01 -0.1000D+01 4 4 1 1 9999 2 0.20000000D+01 -0.20000000D+01 0.4000D+01 -0.2000D+01 4 4 1 1 9999 3 0.30000000D+01 -0.30000000D+01 0.6000D+01 -0.3000D+01 4 4 1 1 9999 4 0.40000000D+01 -0.40000000D+01 0.8000D+01 -0.4000D+01 4 4 1 1 9999 5 0.50000000D+01 -0.50000000D+01 0.1000D+02 -0.5000D+01 4 4 1 -1 9999 1 0.10000000D+01 0.50000000D+01 -0.4000D+01 0.5000D+01 4 4 1 -1 9999 2 0.20000000D+01 0.40000000D+01 -0.2000D+01 0.4000D+01 4 4 1 -1 9999 4 0.40000000D+01 0.20000000D+01 0.2000D+01 0.2000D+01 4 4 1 -1 9999 5 0.50000000D+01 0.10000000D+01 0.4000D+01 0.1000D+01 4 4 1 -1 9999 1 0.10000000D+01 -0.50000000D+01 0.6000D+01 -0.5000D+01 4 4 1 -1 9999 2 0.20000000D+01 -0.40000000D+01 0.6000D+01 -0.4000D+01 4 4 1 -1 9999 3 0.30000000D+01 -0.30000000D+01 0.6000D+01 -0.3000D+01 4 4 1 -1 9999 4 0.40000000D+01 -0.20000000D+01 0.6000D+01 -0.2000D+01 4 4 1 -1 9999 5 0.50000000D+01 -0.10000000D+01 0.6000D+01 -0.1000D+01 4 4 -1 -1 9999 1 0.10000000D+01 -0.10000000D+01 0.2000D+01 -0.1000D+01 4 4 -1 -1 9999 2 0.20000000D+01 -0.20000000D+01 0.4000D+01 -0.2000D+01 4 4 -1 -1 9999 3 0.30000000D+01 -0.30000000D+01 0.6000D+01 -0.3000D+01 4 4 -1 -1 9999 4 0.40000000D+01 -0.40000000D+01 0.8000D+01 -0.4000D+01 4 4 -1 -1 9999 5 0.50000000D+01 -0.50000000D+01 0.1000D+02 -0.5000D+01 4 4 1 2 9999 2 0.20000000D+01 0.30000000D+01 -0.1000D+01 0.3000D+01 4 4 1 2 9999 3 0.30000000D+01 0.50000000D+01 -0.2000D+01 0.5000D+01 4 4 1 2 9999 1 0.10000000D+01 -0.10000000D+01 0.2000D+01 -0.1000D+01 4 4 1 2 9999 3 0.30000000D+01 -0.20000000D+01 0.5000D+01 -0.2000D+01 4 4 1 2 9999 5 0.50000000D+01 -0.30000000D+01 0.8000D+01 -0.3000D+01 4 4 -1 1 9999 1 0.10000000D+01 0.50000000D+01 -0.4000D+01 0.5000D+01 4 4 -1 1 9999 2 0.20000000D+01 0.40000000D+01 -0.2000D+01 0.4000D+01 4 4 -1 1 9999 4 0.40000000D+01 0.20000000D+01 0.2000D+01 0.2000D+01 4 4 -1 1 9999 5 0.50000000D+01 0.10000000D+01 0.4000D+01 0.1000D+01 4 4 -1 1 9999 1 0.10000000D+01 -0.50000000D+01 0.6000D+01 -0.5000D+01 4 4 -1 1 9999 2 0.20000000D+01 -0.40000000D+01 0.6000D+01 -0.4000D+01 4 4 -1 1 9999 3 0.30000000D+01 -0.30000000D+01 0.6000D+01 -0.3000D+01 4 4 -1 1 9999 4 0.40000000D+01 -0.20000000D+01 0.6000D+01 -0.2000D+01 4 4 -1 1 9999 5 0.50000000D+01 -0.10000000D+01 0.6000D+01 -0.1000D+01 4 4 1 1 9999 1 0.10000000D+01 -0.10000000D+01 0.2000D+01 -0.1000D+01 4 4 1 1 9999 2 0.20000000D+01 -0.20000000D+01 0.4000D+01 -0.2000D+01 4 4 1 1 9999 3 0.30000000D+01 -0.30000000D+01 0.6000D+01 -0.3000D+01 4 4 1 1 9999 4 0.40000000D+01 -0.40000000D+01 0.8000D+01 -0.4000D+01 4 4 1 1 9999 5 0.50000000D+01 -0.50000000D+01 0.1000D+02 -0.5000D+01 4 4 1 -1 9999 1 0.10000000D+01 -0.50000000D+01 0.6000D+01 -0.5000D+01 4 4 1 -1 9999 2 0.20000000D+01 -0.40000000D+01 0.6000D+01 -0.4000D+01 4 4 1 -1 9999 3 0.30000000D+01 -0.30000000D+01 0.6000D+01 -0.3000D+01 4 4 1 -1 9999 4 0.40000000D+01 -0.20000000D+01 0.6000D+01 -0.2000D+01 4 4 1 -1 9999 5 0.50000000D+01 -0.10000000D+01 0.6000D+01 -0.1000D+01 4 4 1 -1 9999 1 0.10000000D+01 0.50000000D+01 -0.4000D+01 0.5000D+01 4 4 1 -1 9999 2 0.20000000D+01 0.40000000D+01 -0.2000D+01 0.4000D+01 4 4 1 -1 9999 4 0.40000000D+01 0.20000000D+01 0.2000D+01 0.2000D+01 4 4 1 -1 9999 5 0.50000000D+01 0.10000000D+01 0.4000D+01 0.1000D+01 4 4 -1 -1 9999 1 0.10000000D+01 -0.10000000D+01 0.2000D+01 -0.1000D+01 4 4 -1 -1 9999 2 0.20000000D+01 -0.20000000D+01 0.4000D+01 -0.2000D+01 4 4 -1 -1 9999 3 0.30000000D+01 -0.30000000D+01 0.6000D+01 -0.3000D+01 4 4 -1 -1 9999 4 0.40000000D+01 -0.40000000D+01 0.8000D+01 -0.4000D+01 4 4 -1 -1 9999 5 0.50000000D+01 -0.50000000D+01 0.1000D+02 -0.5000D+01 4 4 1 2 9999 1 0.10000000D+01 -0.10000000D+01 0.2000D+01 -0.1000D+01 4 4 1 2 9999 2 0.20000000D+01 -0.30000000D+01 0.5000D+01 -0.3000D+01 4 4 1 2 9999 3 0.30000000D+01 -0.50000000D+01 0.8000D+01 -0.5000D+01 4 4 1 2 9999 3 0.30000000D+01 0.20000000D+01 0.1000D+01 0.2000D+01 4 4 1 2 9999 5 0.50000000D+01 0.30000000D+01 0.2000D+01 0.3000D+01 4 4 -1 1 9999 1 0.10000000D+01 -0.50000000D+01 0.6000D+01 -0.5000D+01 4 4 -1 1 9999 2 0.20000000D+01 -0.40000000D+01 0.6000D+01 -0.4000D+01 4 4 -1 1 9999 3 0.30000000D+01 -0.30000000D+01 0.6000D+01 -0.3000D+01 4 4 -1 1 9999 4 0.40000000D+01 -0.20000000D+01 0.6000D+01 -0.2000D+01 4 4 -1 1 9999 5 0.50000000D+01 -0.10000000D+01 0.6000D+01 -0.1000D+01 4 4 -1 1 9999 1 0.10000000D+01 0.50000000D+01 -0.4000D+01 0.5000D+01 4 4 -1 1 9999 2 0.20000000D+01 0.40000000D+01 -0.2000D+01 0.4000D+01 4 4 -1 1 9999 4 0.40000000D+01 0.20000000D+01 0.2000D+01 0.2000D+01 4 4 -1 1 9999 5 0.50000000D+01 0.10000000D+01 0.4000D+01 0.1000D+01 Test of subprogram number 5 DCOPY FAIL CASE N INCX INCY MODE I COMP(I) TRUE(I) DIFFERENCE SIZE(I) 5 1 1 1 9999 1 0.50000000D+00 0.60000000D+00 -0.1000D+00 0.0000D+00 5 2 1 1 9999 1 0.50000000D+00 0.60000000D+00 -0.1000D+00 0.0000D+00 5 2 1 1 9999 2 -0.90000000D+00 0.10000000D+00 -0.1000D+01 0.0000D+00 5 4 1 1 9999 1 0.50000000D+00 0.60000000D+00 -0.1000D+00 0.0000D+00 5 4 1 1 9999 2 -0.90000000D+00 0.10000000D+00 -0.1000D+01 0.0000D+00 5 4 1 1 9999 3 0.30000000D+00 -0.50000000D+00 0.8000D+00 0.0000D+00 5 4 1 1 9999 4 0.70000000D+00 0.80000000D+00 -0.1000D+00 0.0000D+00 5 1 2 -2 9999 1 0.50000000D+00 0.60000000D+00 -0.1000D+00 0.0000D+00 5 2 2 -2 9999 1 0.50000000D+00 -0.50000000D+00 0.1000D+01 0.0000D+00 5 2 2 -2 9999 3 0.30000000D+00 0.60000000D+00 -0.3000D+00 0.0000D+00 5 4 2 -2 9999 1 0.50000000D+00 -0.40000000D+00 0.9000D+00 0.0000D+00 5 4 2 -2 9999 3 0.30000000D+00 0.90000000D+00 -0.6000D+00 0.0000D+00 5 4 2 -2 9999 5 -0.60000000D+00 -0.50000000D+00 -0.1000D+00 0.0000D+00 5 4 2 -2 9999 7 0.80000000D+00 0.60000000D+00 0.2000D+00 0.0000D+00 5 1 -2 1 9999 1 0.50000000D+00 0.60000000D+00 -0.1000D+00 0.0000D+00 5 2 -2 1 9999 1 0.50000000D+00 -0.50000000D+00 0.1000D+01 0.0000D+00 5 2 -2 1 9999 2 -0.90000000D+00 0.60000000D+00 -0.1500D+01 0.0000D+00 5 4 -2 1 9999 1 0.50000000D+00 -0.40000000D+00 0.9000D+00 0.0000D+00 5 4 -2 1 9999 2 -0.90000000D+00 0.90000000D+00 -0.1800D+01 0.0000D+00 5 4 -2 1 9999 3 0.30000000D+00 -0.50000000D+00 0.8000D+00 0.0000D+00 5 4 -2 1 9999 4 0.70000000D+00 0.60000000D+00 0.1000D+00 0.0000D+00 5 1 -1 -2 9999 1 0.50000000D+00 0.60000000D+00 -0.1000D+00 0.0000D+00 5 2 -1 -2 9999 1 0.50000000D+00 0.60000000D+00 -0.1000D+00 0.0000D+00 5 2 -1 -2 9999 3 0.30000000D+00 0.10000000D+00 0.2000D+00 0.0000D+00 5 4 -1 -2 9999 1 0.50000000D+00 0.60000000D+00 -0.1000D+00 0.0000D+00 5 4 -1 -2 9999 3 0.30000000D+00 0.10000000D+00 0.2000D+00 0.0000D+00 5 4 -1 -2 9999 5 -0.60000000D+00 -0.50000000D+00 -0.1000D+00 0.0000D+00 Test of subprogram number 6 DSWAP FAIL CASE N INCX INCY MODE I COMP(I) TRUE(I) DIFFERENCE SIZE(I) 6 1 1 1 9999 1 0.60000000D+00 0.50000000D+00 0.1000D+00 0.0000D+00 6 1 1 1 9999 1 0.50000000D+00 0.60000000D+00 -0.1000D+00 0.0000D+00 6 2 1 1 9999 1 0.60000000D+00 0.50000000D+00 0.1000D+00 0.0000D+00 6 2 1 1 9999 2 0.10000000D+00 -0.90000000D+00 0.1000D+01 0.0000D+00 6 2 1 1 9999 1 0.50000000D+00 0.60000000D+00 -0.1000D+00 0.0000D+00 6 2 1 1 9999 2 -0.90000000D+00 0.10000000D+00 -0.1000D+01 0.0000D+00 6 4 1 1 9999 1 0.60000000D+00 0.50000000D+00 0.1000D+00 0.0000D+00 6 4 1 1 9999 2 0.10000000D+00 -0.90000000D+00 0.1000D+01 0.0000D+00 6 4 1 1 9999 3 -0.50000000D+00 0.30000000D+00 -0.8000D+00 0.0000D+00 6 4 1 1 9999 4 0.80000000D+00 0.70000000D+00 0.1000D+00 0.0000D+00 6 4 1 1 9999 1 0.50000000D+00 0.60000000D+00 -0.1000D+00 0.0000D+00 6 4 1 1 9999 2 -0.90000000D+00 0.10000000D+00 -0.1000D+01 0.0000D+00 6 4 1 1 9999 3 0.30000000D+00 -0.50000000D+00 0.8000D+00 0.0000D+00 6 4 1 1 9999 4 0.70000000D+00 0.80000000D+00 -0.1000D+00 0.0000D+00 6 1 2 -2 9999 1 0.60000000D+00 0.50000000D+00 0.1000D+00 0.0000D+00 6 1 2 -2 9999 1 0.50000000D+00 0.60000000D+00 -0.1000D+00 0.0000D+00 6 2 2 -2 9999 1 0.60000000D+00 0.30000000D+00 0.3000D+00 0.0000D+00 6 2 2 -2 9999 3 -0.50000000D+00 0.50000000D+00 -0.1000D+01 0.0000D+00 6 2 2 -2 9999 1 0.50000000D+00 -0.50000000D+00 0.1000D+01 0.0000D+00 6 2 2 -2 9999 3 0.30000000D+00 0.60000000D+00 -0.3000D+00 0.0000D+00 6 4 2 -2 9999 1 0.60000000D+00 0.80000000D+00 -0.2000D+00 0.0000D+00 6 4 2 -2 9999 3 -0.50000000D+00 -0.60000000D+00 0.1000D+00 0.0000D+00 6 4 2 -2 9999 5 0.90000000D+00 0.30000000D+00 0.6000D+00 0.0000D+00 6 4 2 -2 9999 7 -0.40000000D+00 0.50000000D+00 -0.9000D+00 0.0000D+00 6 4 2 -2 9999 1 0.50000000D+00 -0.40000000D+00 0.9000D+00 0.0000D+00 6 4 2 -2 9999 3 0.30000000D+00 0.90000000D+00 -0.6000D+00 0.0000D+00 6 4 2 -2 9999 5 -0.60000000D+00 -0.50000000D+00 -0.1000D+00 0.0000D+00 6 4 2 -2 9999 7 0.80000000D+00 0.60000000D+00 0.2000D+00 0.0000D+00 6 1 -2 1 9999 1 0.60000000D+00 0.50000000D+00 0.1000D+00 0.0000D+00 6 1 -2 1 9999 1 0.50000000D+00 0.60000000D+00 -0.1000D+00 0.0000D+00 6 2 -2 1 9999 1 0.60000000D+00 -0.90000000D+00 0.1500D+01 0.0000D+00 6 2 -2 1 9999 3 -0.50000000D+00 0.50000000D+00 -0.1000D+01 0.0000D+00 6 2 -2 1 9999 1 0.50000000D+00 -0.50000000D+00 0.1000D+01 0.0000D+00 6 2 -2 1 9999 2 -0.90000000D+00 0.60000000D+00 -0.1500D+01 0.0000D+00 6 4 -2 1 9999 1 0.60000000D+00 0.70000000D+00 -0.1000D+00 0.0000D+00 6 4 -2 1 9999 3 -0.50000000D+00 0.30000000D+00 -0.8000D+00 0.0000D+00 6 4 -2 1 9999 5 0.90000000D+00 -0.90000000D+00 0.1800D+01 0.0000D+00 6 4 -2 1 9999 7 -0.40000000D+00 0.50000000D+00 -0.9000D+00 0.0000D+00 6 4 -2 1 9999 1 0.50000000D+00 -0.40000000D+00 0.9000D+00 0.0000D+00 6 4 -2 1 9999 2 -0.90000000D+00 0.90000000D+00 -0.1800D+01 0.0000D+00 6 4 -2 1 9999 3 0.30000000D+00 -0.50000000D+00 0.8000D+00 0.0000D+00 6 4 -2 1 9999 4 0.70000000D+00 0.60000000D+00 0.1000D+00 0.0000D+00 6 1 -1 -2 9999 1 0.60000000D+00 0.50000000D+00 0.1000D+00 0.0000D+00 6 1 -1 -2 9999 1 0.50000000D+00 0.60000000D+00 -0.1000D+00 0.0000D+00 6 2 -1 -2 9999 1 0.60000000D+00 0.50000000D+00 0.1000D+00 0.0000D+00 6 2 -1 -2 9999 2 0.10000000D+00 0.30000000D+00 -0.2000D+00 0.0000D+00 6 2 -1 -2 9999 1 0.50000000D+00 0.60000000D+00 -0.1000D+00 0.0000D+00 6 2 -1 -2 9999 3 0.30000000D+00 0.10000000D+00 0.2000D+00 0.0000D+00 6 4 -1 -2 9999 1 0.60000000D+00 0.50000000D+00 0.1000D+00 0.0000D+00 6 4 -1 -2 9999 2 0.10000000D+00 0.30000000D+00 -0.2000D+00 0.0000D+00 6 4 -1 -2 9999 3 -0.50000000D+00 -0.60000000D+00 0.1000D+00 0.0000D+00 6 4 -1 -2 9999 1 0.50000000D+00 0.60000000D+00 -0.1000D+00 0.0000D+00 6 4 -1 -2 9999 3 0.30000000D+00 0.10000000D+00 0.2000D+00 0.0000D+00 6 4 -1 -2 9999 5 -0.60000000D+00 -0.50000000D+00 -0.1000D+00 0.0000D+00 Test of subprogram number 7 DNRM2 FAIL CASE N INCX INCY MODE I COMP(I) TRUE(I) DIFFERENCE SIZE(I) 7 1 1 9999 9999 1 0.00000000D+00 0.30000000D+00 -0.3000D+00 0.3000D+00 7 2 1 9999 9999 1 0.00000000D+00 0.50000000D+00 -0.5000D+00 0.5000D+00 7 3 1 9999 9999 1 0.00000000D+00 0.70000000D+00 -0.7000D+00 0.7000D+00 7 4 1 9999 9999 1 0.00000000D+00 0.60000000D+00 -0.6000D+00 0.6000D+00 7 1 2 9999 9999 1 0.00000000D+00 0.30000000D+00 -0.3000D+00 0.3000D+00 7 2 2 9999 9999 1 0.00000000D+00 0.50000000D+00 -0.5000D+00 0.5000D+00 7 3 2 9999 9999 1 0.00000000D+00 0.70000000D+00 -0.7000D+00 0.7000D+00 7 4 2 9999 9999 1 0.00000000D+00 0.60000000D+00 -0.6000D+00 0.6000D+00 Test of subprogram number 8 DASUM FAIL CASE N INCX INCY MODE I COMP(I) TRUE(I) DIFFERENCE SIZE(I) 8 1 1 9999 9999 1 0.00000000D+00 0.30000000D+00 -0.3000D+00 0.3000D+00 8 2 1 9999 9999 1 0.00000000D+00 0.70000000D+00 -0.7000D+00 0.7000D+00 8 3 1 9999 9999 1 0.00000000D+00 0.11000000D+01 -0.1100D+01 0.1100D+01 8 4 1 9999 9999 1 0.00000000D+00 0.10000000D+01 -0.1000D+01 0.1000D+01 8 1 2 9999 9999 1 0.00000000D+00 0.30000000D+00 -0.3000D+00 0.3000D+00 8 2 2 9999 9999 1 0.00000000D+00 0.70000000D+00 -0.7000D+00 0.7000D+00 8 3 2 9999 9999 1 0.00000000D+00 0.11000000D+01 -0.1100D+01 0.1100D+01 8 4 2 9999 9999 1 0.00000000D+00 0.10000000D+01 -0.1000D+01 0.1000D+01 Test of subprogram number 9 DSCAL FAIL CASE N INCX INCY MODE I COMP(I) TRUE(I) DIFFERENCE SIZE(I) 9 1 1 9999 9999 1 0.30000000D+00 -0.30000000D+00 0.6000D+00 -0.3000D+00 9 2 1 9999 9999 1 0.30000000D+00 0.00000000D+00 0.3000D+00 0.0000D+00 9 2 1 9999 9999 2 -0.40000000D+00 0.00000000D+00 -0.4000D+00 0.0000D+00 9 4 1 9999 9999 1 0.10000000D+00 0.30000000D-01 0.7000D-01 0.3000D-01 9 4 1 9999 9999 2 -0.30000000D+00 -0.90000000D-01 -0.2100D+00 -0.9000D-01 9 4 1 9999 9999 3 0.50000000D+00 0.15000000D+00 0.3500D+00 0.1500D+00 9 4 1 9999 9999 4 -0.10000000D+00 -0.30000000D-01 -0.7000D-01 -0.3000D-01 9 1 2 9999 9999 1 0.30000000D+00 0.90000000D-01 0.2100D+00 0.9000D-01 9 2 2 9999 9999 1 0.30000000D+00 0.90000000D-01 0.2100D+00 0.9000D-01 9 2 2 9999 9999 3 -0.40000000D+00 -0.12000000D+00 -0.2800D+00 -0.1200D+00 9 3 2 9999 9999 1 0.20000000D+00 0.60000000D-01 0.1400D+00 0.6000D-01 9 3 2 9999 9999 3 -0.60000000D+00 -0.18000000D+00 -0.4200D+00 -0.1800D+00 9 3 2 9999 9999 5 0.30000000D+00 0.90000000D-01 0.2100D+00 0.9000D-01 9 4 2 9999 9999 1 0.10000000D+00 0.30000000D-01 0.7000D-01 0.3000D-01 9 4 2 9999 9999 3 -0.30000000D+00 -0.90000000D-01 -0.2100D+00 -0.9000D-01 9 4 2 9999 9999 5 -0.50000000D+00 -0.15000000D+00 -0.3500D+00 -0.1500D+00 9 4 2 9999 9999 7 -0.10000000D+00 -0.30000000D-01 -0.7000D-01 -0.3000D-01 Test of subprogram number 10 IDAMAX FAIL CASE N INCX INCY MODE COMP TRUE DIFFERENCE 10 0 1 9999 9999 1 0 1 10 2 1 9999 9999 1 2 -1 10 3 1 9999 9999 1 2 -1 10 4 1 9999 9999 1 3 -2 10 0 2 9999 9999 1 0 1 10 2 2 9999 9999 1 2 -1 10 3 2 9999 9999 1 2 -1 10 4 2 9999 9999 1 3 -2