Fastmath ist eine Delphi -Mathematikbibliothek, die für die schnelle Leistung optimiert ist (manchmal auf Kosten der Nichtausführung der Fehlerprüfung oder des Verlusts einer geringen Genauigkeit). Es verwendet handoptimierten Montagecode, um eine viel bessere Leistung zu erzielen, als die entsprechenden Funktionen des Delphi RTL.
Dies macht Fastmath ideal für leistungsstarke mathematische Anwendungen wie Multimedia-Anwendungen und Spiele. Für eine noch bessere Leistung bietet die Bibliothek eine Vielzahl von "ungefähren" Funktionen (die alle mit einem Fast Prefix beginnen). Diese können sehr schnell sein, aber Sie verlieren einige (manchmal überraschend kleine) Genauigkeit. Für Spiele und Animation ist dieser Genauigkeitsverlust normalerweise vollkommen akzeptabel und überwogen durch die Geschwindigkeitssteigerung. Verwenden Sie sie jedoch nicht für wissenschaftliche Berechnungen ...
Möglicherweise möchten Sie bei Anwendungsstart DisableFloatingPointExceptions , um die Ausnahmen von Gleitpunkten zu unterdrücken. Stattdessen werden extreme Werte (wie Nan oder Unendlichkeit) zurückgegeben, wenn eine Operation nicht ausgeführt werden kann. Wenn Sie Fastmath in mehreren Threads verwenden, sollten Sie Execute DisableFloatingPointExceptions im Block dieser Threads aufrufen.
Die meisten Operationen können sowohl für Singularwerte (Skalare) als auch für Vektoren (bestehend aus 2, 3 oder 4 Werten) durchgeführt werden. SIMD -optimierter Montagecode wird verwendet, um mehrere Ausgänge gleichzeitig zu berechnen. Beispielsweise ist das Hinzufügen von zwei 4-Wert-Vektoren zusammen fast so schnell wie zusammen hinzugefügt, was zu einer 4-fachen Geschwindigkeitssteigerung führt. Viele Funktionen sind so geschrieben, dass die Leistung noch besser ist.
Hier sind einige Beispiele für Geschwindigkeitsfaktoren, die Sie auf verschiedenen Plattformen erwarten können:
| RTL | Fastmath | x86-32 | x86-64 | ARM32 | ARM64 |
|---|---|---|---|---|---|
| TEVECTOR3D + TEVECECTOR3D | TEBECTOR4 + TEVECTOR4 | 1.2x | 1,6x | 2.8x | 2.5x |
| Single * TEVECTOR3D | Single * TEVECTOR4 | 2.2x | 2.1x | 5.6x | 3.7x |
| TEVECTORTOR3D.Length | TEVECTORE4.Length | 3.0x | 5.6x | 19.9x | 17.1x |
| TEVECTOR3D.Normalize | TEVECTOR4.Normalisieren | 4.1x | 5.1x | 7.4x | 11.7x |
| TEVECTOR3D * TMATRIX3D | TEBECTOR4 * TMATRIX4 | 1.3x | 4.0x | 6.5x | 4.2x |
| Tmatrix3d * tmatrix3d | Tmatrix4 * tmatrix4 | 2.2x | 7.2x | 5.4x | 8.0x |
| Tmatrix3d.inverse | Tmatrix4.inverse | 9,8x | 9.2x | 8.0x | 9,8x |
| Sünde (Single) (x4) | Fastsin (TEVECTECTE4) | 14,8x | 7.7x | 42.6x | 40.1x |
| Sincos (Single) (x4) | Fastsincos (TEVECTOR4) | 19.1x | 9.0x | 67,9x | 93.3x |
| Exp2 (Single) (x4) | Fastexp2 (TEVECTOR4) | 22.4x | 32.7x | 275.0x | 302.4x |
Wie Sie sehen können, können einige sehr häufige (3D) -Operationen wie Matrixmultiplikation und Inversion fast 10 -mal schneller sein als ihre entsprechenden RTL -Versionen. Darüber hinaus enthält Fastmath eine Reihe von Fast* -Nähnungserfunktionen, die ein wenig Genauigkeit für eine enorme Geschwindigkeitssteigerung opfern. Beispielsweise kann die Verwendung FastSinCos zur Berechnung von 4 Sinus- und Cosinusfunktionen parallel bis zu 90-mal schneller sein als die RTL- SinCos -Funktion 4-mal und bietet dennoch eine hervorragende Genauigkeit für Winkel bis zu +/4000 Radians (oder +/- 230.000 Grad).
Auf 32-Bit- und 64-Bit-Desktop-Plattformen (Windows und OS X) wird diese Leistung durch die Verwendung des SSE2-Befehlssatzes erzielt. Dies bedeutet, dass der Computer SSE2 unterstützen muss. Da SSE2 jedoch im Jahr 2001 eingeführt wurde, wird die überwiegende Mehrheit der heute verwendeten Computer es unterstützen. Alle 64-Bit-Desktop-Computer haben standardmäßig SSE2-Unterstützung. Sie können diese Bibliothek jedoch jederzeit mit dem Definieren von FM_NOSIMD zusammenstellen, um die SIMD -Optimierung zu deaktivieren und einfache Pascal -Versionen zu verwenden. Dies kann auch nützlich sein, um die Geschwindigkeit der Pascal -Versionen mit den SIMD -optimierten Versionen zu vergleichen.
Auf 32-Bit-mobilen Plattformen (iOS und Android) wird der Neon-Befehlssatz für die SIMD-Optimierung verwendet. Dies bedeutet, dass Ihr Gerät Neon unterstützen muss. Da Delphi dies jedoch bereits benötigt, ist dies keine weiteren Einschränkungen.
Auf 64-Bit-Mobilfunkplattformen (iOS) wird der SIRM64/AARG64-SIMD-Befehlssatz verwendet.
Der iOS -Simulator wird keine hardwarebeschleunigte Unterstützung erhalten (es wird Pascal -Versionen für alle Berechnungen verwendet).
Fastmath-Operationen nur auf Einzelpreis-Schwimmpunktwerte. Die doppelte Precision Floating-Punkt-Arithmetik wird (derzeit) nicht unterstützt.
Die meisten Funktionen arbeiten mit einzelnen Werten (vom Typ Single ) und 2-, 3- und 4-dimensionaler Vektoren (der Typen TVector2 , TVector3 bzw. TVector4 ). Vektoren werden nicht nur zur Darstellung von Punkten oder Richtungen im Raum verwendet, sondern können auch als Arrays von 2, 3 oder 4 Werten angesehen werden, mit denen Berechnungen parallel durchgeführt werden können. Zusätzlich zu Floating-Punkt-Vektoren gibt es auch Vektoren, die Operator für Ganzzahlwerte ( TIVector2 , TIVector3 und TIVector4 ).
Es gibt auch Unterstützung für 2x2-, 3x3- und 4x4 -Matrizen (als TMatrix2 , TMatrix3 und TMatrix4 bezeichnet). Standardmäßig werden Matrizen in der Reihenfolge in der System.Math.Vectors gespeichert. Sie können dieses Layout jedoch mit der Definition FM_COLUMN_MAJOR ändern. Dadurch wird stattdessen Matrizen in Spalten-Major-Reihenfolge gespeichert, was für OpenGL-Anwendungen (die mit diesem Layout am besten geeignet sind) nützlich ist. Außerdem wird diese Definition auch die Tiefe der Kamera -Matrizen auf -1..1 anstelle der Standardeinstellung 0..1 übertragen. Auch dies entspricht eher der Standardeinstellung für OpenGL -Anwendungen.
Für die Darstellung von Rotationen im 3D -Raum gibt es auch ein TQuaternion , das dem TQuaternion3D -Typ der RTL ähnelt.
Der Betrieb der Bibliothek ist etwas von Shadersprachen (wie GLSL und HLSL) inspiriert. In diesen Sprachen können Sie auch einzelne Werte und Vektoren ähnlich behandeln. Sie können beispielsweise die Sin -Funktion verwenden, um einen einzelnen Sinuswert zu berechnen, aber Sie können sie auch mit einem TVector4 -Typ verwenden, um 4 Sinuswerte in einem Aufruf zu berechnen. In Kombination mit den ungefähren Fast* Funktionen kann dies zu einem enormen Leistungsschub führen, wie bereits gezeigt.
Alle Vektor- und Matrixtypen unterstützen überlastete Operatoren, mit denen Sie Skalare, Vektoren und Matrizen hinzufügen, subtrahieren, multiplizieren und teilen können.
Es gibt auch überlastete Betreiber, die Vektoren und Matrizen für die Gleichheit vergleichen. Diese Operatoren prüfen nach genauen Übereinstimmungen (wie Delphi = Operator). Sie ermöglichen keine sehr kleinen Variationen (wie Delphis SameValue Mehrwertfunktionen).
Die arithmetischen Operatoren + , - , * und / arbeiten normalerweise in Bezug auf die angewandten Vektoren. Zum Beispiel, wenn A und B vom Typ TVector4 sind, dann wird C := A * B C auf (AX * BX, AY * BY, AZ * BZ, AW * BW) eingestellt. Es wird kein Punkt oder ein Kreuzprodukt durchführen (Sie können die Dot und Cross verwenden, um diese zu berechnen).
Bei Matrizen betreiben die + und - Bediener auch Komponenten. Bei der Multiplizierung (Teilen) Matrizen mit Vektoren oder anderen Matrizen wird jedoch die übliche lineare algebraische Multiplikation (oder Teilung) verwendet. Zum Beispiel:
M := M1 * M2 führt eine lineare algebraische Matrix -Multiplikation durchV := M1 * V1 führt eine matrix * Zeilenvektor -lineare algebraische Multiplikation durchV := V1 * M1 führt einen Spaltenvektor * Matrix -lineare algebraische Multiplikation durch Um Matrizen zu multiplizieren, können Sie die CompMult -Methode verwenden.
Fastmath bietet seinen eigenen Vektor- und Matrixtypen für eine überlegene Leistung. Die meisten von ihnen entsprechen der Funktionalität und Datenspeicherung zu den Delphi -RTL -Typen. Sie können zwischen ihnen typern oder implizit vom Fastmath -Typ in den RTL -Typ konvertieren oder umgekehrt (z. B. MyVector2 := MyPointF ). Die folgende Tabelle zeigt die Zuordnung:
| Zweck | Fastmath | Delphi Rtl |
|---|---|---|
| 2D -Punkt/Vektor | TEVECTOR2 | TPointf |
| 3D -Punkt/Vektor | TEVECTOR3 | TPoint3d |
| 4D Punkt/Vektor | TEVECTOR4 | TEVECTOR3D |
| 2x2 Matrix | Tmatrix2 | N / A |
| 3x3 Matrix | Tmatrix3 | Tmatrix |
| 4x4 Matrix | Tmatrix4 | Tmatrix3d |
| Quaternion | Tquaternion | Tquaternion3d |
Die Dokumentation finden Sie in der HTML -Hilfedatei Fastmath.chm im Doc -Verzeichnis.
Alternativ können Sie die Dokumentation online lesen.
Das Fastmath -Repository enthält die folgenden Verzeichnisse:
Doc : Dokumentation im HTMLHELP -Format. Enthält auch eine Tabelle (Benchmarks.xlsx) mit Ergebnissen von Leistungstests auf meinen Geräten (ein Core i7 -Desktop und iPad3).DocSource : Enthält Stapeldateien zum Generieren der Dokumentation. Sie benötigen Pasdocex, um die Dokumentation selbst zu generieren, wenn Sie möchten.FastMath : Enthält die Haupteinheit Neslib.FastMath sowie verschiedene inklusive Dateien mit prozessorspezifischen Optimierungen und statische Bibliotheken mit ARM -optimierten Versionen für iOS und Android.Arm : Armspezifischer Quellcode und Skripte.Arm32 : Enthält den Quellcode für ARM -Neon -optimierte Assembly -Quellcode.Arm64 : Enthält den Quellcode für ARM64 optimierte Funktionen.fastmath-android : Enthält eine Batch-Datei und Helferdateien, um die statische Bibliothek für Android mithilfe des Android NDK zu erstellen.fastmath-ios : Enthält ein MacOS-Shell-Skript, um eine universelle statische Bibliothek für iOS zu erstellen.Tests : Enthält eine FireMonkey -Anwendung, bei der Unit -Tests und Leistungstests ausgeführt werden. Fastmath ist unter der vereinfachten BSD -Lizenz lizenziert. Einige seiner Funktionen basieren auf dem Code anderer Personen, der unter den MIT-, neuen BSD- und ZLIB -Lizenzen lizenziert ist. Diese Lizenzen sind so zulässig wie die vereinfachte BSD -Lizenz, die für das gesamte Projekt verwendet wird.
Einzelheiten siehe Lizenz.txt.