FastMath是一個Delphi數學庫,已針對快速性能進行了優化(有時以不執行錯誤檢查或失去一些精度為代價)。它使用手動優化的裝配代碼來實現比Delphi RTL提供的等效功能更好的性能。
這使得非常適合高性能數學密集型應用程序,例如多媒體應用程序和遊戲。為了獲得更好的性能,該庫提供了各種“近似”功能(所有這些功能都以Fast冠軍開頭)。這些可能非常快,但是您會失去一些(有時令人驚訝的)精度。對於遊戲和動畫,這種準確性的損失通常是完全可以接受的,並且速度的提高超過了。不過不要將它們用於科學計算...
您可能需要在應用程序啟動時調用DisableFloatingPointExceptions ,以抑制任何浮點異常。取而代之的是,當無法執行操作時,它將返回極端值(例如NAN或Infinity)。如果您在多個線程中使用快速固定,則應在這些線程的Execute塊中調用DisableFloatingPointExceptions 。
大多數操作都可以在單數值(標量)和向量(由2、3或4個值組成)上執行。 SIMD優化的裝配代碼用於同時計算多個輸出。例如,將兩個4值向量添加在一起幾乎與將兩個單個值添加在一起一樣快,從而增加了4倍速度。許多功能的編寫方式使性能更好。
以下是您可以在不同平台上期望的加速因素的一些示例:
| RTL | Fastmath | x86-32 | X86-64 | ARM32 | ARM64 |
|---|---|---|---|---|---|
| TVECTOR3D + TVECTOR3D | TVECTOR4 + TVECTOR4 | 1.2倍 | 1.6倍 | 2.8倍 | 2.5倍 |
| 單 * TVECTOR3D | 單 * TVECTOR4 | 2.2x | 2.1倍 | 5.6倍 | 3.7倍 |
| TVECTOR3D.LENGTH | tvector4.4length | 3.0x | 5.6倍 | 19.9倍 | 17.1x |
| TVECTOR3D.Normorize | TVECTOR4.SROMALIZE | 4.1倍 | 5.1倍 | 7.4倍 | 11.7倍 |
| TVECTOR3D * TMATRIX3D | TVector4 * tmatrix4 | 1.3倍 | 4.0x | 6.5倍 | 4.2x |
| tmatrix3d * tmatrix3d | tmatrix4 * tmatrix4 | 2.2x | 7.2倍 | 5.4倍 | 8.0x |
| tmatrix3d.inverse | tmatrix4.inverse | 9.8倍 | 9.2x | 8.0x | 9.8倍 |
| 罪(單)(x4) | Fastsin(TVector4) | 14.8倍 | 7.7倍 | 42.6倍 | 40.1x |
| Sincos(單)(x4) | FastSincos(TVector4) | 19.1x | 9.0x | 67.9倍 | 93.3x |
| exp2(單)(x4) | fastexp2(tvector4) | 22.4倍 | 32.7倍 | 275.0x | 302.4x |
如您所見,一些非常常見的(3D)操作(例如矩陣乘法和反轉)的速度幾乎比相應的RTL版本快10倍。此外,FastMath還具有許多Fast*近似函數,這些函數犧牲了一些精確度以增加速度。例如,使用FastSinCos與調用RTL SINCOS函數的速度高達90倍的速度可比調用RTL SinCos函數的速度高90倍,同時仍然為角度提供出色的精度至 +/4000弧度(OR +/- 230,000度)。
在32位和64位桌面平台(Windows和OS X)上,使用SSE2指令集實現此性能。這意味著計算機必須支持SSE2。但是,由於SSE2於2001年推出,因此當今使用的絕大多數計算機都將支持它。默認情況下,所有64位台式計算機均具有SSE2支持。但是,您始終可以使用FM_NOSIMD定義以禁用SIMD優化並使用普通Pascal版本來編譯此庫。這對於將PASCAL版本的速度與SIMD優化版本進行比較也很有用。
在32位移動平台(iOS和Android)上,霓虹燈指令集用於SIMD優化。這意味著您的設備需要支持霓虹燈。但是,由於德爾菲已經需要這一點,所以這沒有進一步的限制。
在64位移動平台(iOS)上,使用ARM64/AARCH64 SIMD指令集。
沒有對iOS模擬器的硬件加速支持(它將使用Pascal版本進行所有計算)。
僅在單精度浮點數值上操作。雙精度浮點算術是(當前)不支持的。
大多數函數在單個值(類型Single )和2-,3-和4維向量(分別為TVector2 , TVector3和TVector4 )上運行。向量不僅用於表示空間中的點或方向,而且還可以視為2、3或4個值的陣列,可通過並行執行計算。除了浮點矢量外,還有對整數值的載體( TIVector2 , TIVector3和TIVector4 )。
還支持2x2、3x3和4x4矩陣(稱為TMatrix2 , TMatrix3和TMatrix4 )。默認情況下,像RTL的System.Math.Vectors單元中的矩陣一樣,按行訂單存儲。但是,您可以使用FM_COLUMN_MAJOR定義更改此佈局。這將以列列訂單存儲矩陣,這對OpenGL應用程序很有用(與此佈局最有用)。此外,此定義還將剪輯相機矩陣的深度為-1..1,而不是默認的0..1。同樣,這與OpenGL應用程序的默認值一致。
為了表示3D空間中的旋轉,還有一個TQuaternion ,類似於RTL的TQuaternion3D類型。
圖書館的操作在某種程度上受到著色器語言(例如GLSL和HLSL)的啟發。在這些語言中,您還可以類似地對待單個值和向量。例如,您可以使用Sin函數來計算單個正弦值,但是您也可以將其與TVector4類型一起使用,以在一個呼叫中計算4個正弦值。當與近似Fast*函數結合使用時,這可能會導致巨大的性能提升,如前所述。
所有向量和矩陣類型都支持超載的運算符,使您可以否定,添加,減,乘和分割標量,向量和矩陣。
還有一些超載的操作員比較向量和矩陣以保持平等。這些操作員檢查確切的匹配(例如Delphi's = Operator)。它們不允許很小的變化(例如Delphi的SameValue功能)。
當應用於向量時,算術運算符+ , - *和/通常會在組件上工作。例如,如果A和B是類型TVector4 ,則C := A * B將將C設置為(AX * BX, AY * BY, AZ * BZ, AW * BW) 。它不會執行點或跨產品(您可以使用Dot和Cross功能來計算這些點)。
對於矩陣, +和-操作員還可以在組件上操作。但是,當用向量或其他矩陣繁殖(或分隔)矩陣時,則使用通常的線性代數乘法(或除法)。例如:
M := M1 * M2執行線性代數矩陣乘法V := M1 * V1執行矩陣 *行矢量線性代數乘法V := V1 * M1執行列矢量 *矩陣線性代數乘法為了使矩陣組成部分,您可以使用CompMult方法。
FastMath提供了自己的向量和矩陣類型,可提供出色的性能。它們中的大多數在功能和數據存儲方面等效於Delphi RTL類型。您可以在它們之間類型或隱式轉換為RTL類型,反之亦然(例如MyVector2 := MyPointF )。下表顯示了映射:
| 目的 | Fastmath | Delphi RTL |
|---|---|---|
| 2D點/向量 | TVector2 | tpointf |
| 3D點/向量 | TVECTOR3 | tpoint3d |
| 4D點/向量 | TVECTOR4 | TVECTOR3D |
| 2x2矩陣 | tmatrix2 | N/A。 |
| 3x3矩陣 | tmatrix3 | tmatrix |
| 4x4矩陣 | tmatrix4 | tmatrix3d |
| 季節 | tquaternion | tquaternion3d |
文檔可以在Doc目錄中的HTML幫助文件fastmath.chm中找到。
另外,您可以在線閱讀文檔。
FastMath存儲庫包含以下目錄:
Doc :htmlhelp格式的文檔。還包含一個電子表格(benchmarks.xlsx),並在設備上進行性能測試結果(Core i7台式機和iPad3)。DocSource :包含用於生成文檔的批處理文件。如果您願意,您需要Pasdocex自己生成文檔。FastMath :包含Neslib.FastMath主要單元,以及各種包含具有特定於處理器的優化的文件,以及具有iOS和Android ARM優化版本的靜態庫。Arm :特定的源代碼和腳本。Arm32 :包含用於ARM霓虹燈優化功能的組裝源代碼。Arm64 :包含用於ARM64優化功能的裝配源代碼。fastmath-android :包含一個批處理文件和輔助文件,以使用Android NDK構建Android的靜態庫。fastmath-ios :包含一個MacOS Shell腳本,用於構建iOS通用靜態庫。Tests :包含一個運行單元測試和性能測試的Firemonkey應用程序。 Fastmath已根據簡化的BSD許可獲得許可。它的某些功能是基於在麻省理工學院,新BSD和ZLIB許可下獲得許可的其他人的代碼。這些許可與整個項目使用的簡化BSD許可一樣允許。
有關詳細信息,請參見License.txt。