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?