Der inhaltliche Vortrag

Werbung
Euklidische Norm eines
Vektors
|| x ||2  (v1  v2  ...  vn )
2
Ausarbeitung: Team 9
12. 07 2006
2
2
Implementierung in Assembler
Tankred Hase, Daniel Muhra, Kolja Rödel
Darstellung eines Vektors im
Speicher
Wert 1 Wert 2 Wert 3 Wert 4 Wert 5 Wert 6
Länge des Feldelementes m
Adresse
Gesamtlänge des Feldes n
Parameter der Funktion
Eingabe :
- Startadresse a
- Länge eines Feldelementes m
- Anzahl der Elemente n
Ausgabe:
- Vektornorm als Fließkommazahl
(wegen Wurzelziehung)
Problem:
 Elementlänge bestimmt Datentyp nicht
eindeutig
 z.B. int und float jeweils 4 Byte
Lösung:
 double als geforderter Datentyp
 ausreichend für Darstellung von int und
float
Darstellung der Funktion

double vectorNorm(double* a, int m, int n)
Bemerkungen:
- double* repräsentiert eine int Variable
- m zwar nicht nötig, bietet aber neue Möglichkeiten
- Grundsätzlich sizeof(double) für m verwenden
Möglichkeiten des Parameters m
8 Byte

Verwenden der Funktion auf
Spaltenvektoren von Matrizen:
 a1

 a2
a
 3
b1
b2
b3
c1 

c2 
c3 
A1
B1
C1
A2
B2
C2
A3
B3
C3
m
m
Speicher
Funktionsweise:
Summe
Wurzel ziehen
+
1
Wert n
2
quadrieren
(Wert n)²
1)²
2)²
Norm
Rechnen mit der FPU


Wichtig: FPU arbeitet als Stack
Strategie: maximal 2 Werte
gleichzeitig in der FPU
Wert 1
push
pop
Wert 2
Vorgehensweise:
-
-
Wert wir doppelt in die FPU geladen und miteinander
multipliziert und pop ausgeführt  Quadrat in FPU
Summe aus Speicher in FPU laden und Quadrat auf
Summe aufaddieren (+pop) -> neue Summe
Summe in Speicher schreiben
Vorgang wiederholt sich bis alle Vektorelemente
durchlaufen sind.
Zuletzt wird Wert aus dem Speicher in FPU geladen und
Wurzel gezogen.
Ergebnis in FPU
Benchmark
Vergleich mit einer C Implementierung
 Gemessen wurden Dauer von je 100.000
Durchläufen
 Anschließend wurden die Ergebnisse in
Relation zueinander gesetzt

Ergebnisse
Versuche:
Dimension
x faster
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
1
6,32
6,62
5,62
6,82
6,82
6,01
6,01
6,22
6,62
6,62
5,81
10
4,73
4,10
4,87
4,88
4,21
4,75
5,38
4,43
4,88
4,87
4,88
100
2,51
2,53
2,62
2,57
2,50
2,53
2,58
2,41
2,46
2,32
2,55
1000
1,98
2,00
1,97
1,97
1,96
1,97
1,99
1,97
1,97
1,98
1,99
Die beiden Implementierungen werden jeweils 100.000 mal mit Zufallswerten durchgeführt.
Dann wird der Quotient der benötigten Zeit gebildet (x faster).
8000
1,91
1,91
1,92
1,89
1,90
1,92
1,93
1,95
1,87
1,91
1,90
Fragen?
Herunterladen