Fastmath - это математическая библиотека Delphi, которая оптимизирована для быстрой производительности (иногда за счет не выполнять проверку ошибок или потери небольшой точности). Он использует ручной оптимизированный код сборки для достижения гораздо лучшей производительности, чем эквивалентные функции, предоставленные Delphi RTL.
Это делает Fastmath идеальным для высокоэффективных математических приложений, таких как мультимедийные приложения и игры. Для еще лучшей производительности библиотека обеспечивает множество «приблизительных» функций (которые начинаются с Fast питания). Это может быть очень быстро, но вы потеряете (иногда удивительно мало) точность. Для игр и анимации эта потеря в точности обычно вполне приемлема и перевешивается увеличением скорости. Не используйте их для научных расчетов, хотя ...
Возможно, вы захотите вызвать DisableFloatingPointExceptions при запуске приложения, чтобы подавить любые исключения с плавающей запятой. Вместо этого он вернет экстремальные значения (например, NAN или Infinity), когда операция не может быть выполнена. Если вы используете Fastmath в нескольких потоках, вы должны вызвать DisableFloatingPointExceptions в блоке Execute этих потоков.
Большинство операций могут быть выполнены как на сингулярных значениях (скаляры), так и в векторах (состоящие из 2, 3 или 4 значений). Оптимизированный код сборки SIMD используется для расчета нескольких выходов одновременно. Например, добавление двух 4-знательных векторов вместе почти так же быстро, как и добавление двух одиночных значений, что приводит к увеличению скорости в 4 раза. Многие функции написаны таким образом, что производительность еще лучше.
Вот несколько примеров факторов скорости, которые вы можете ожидать на разных платформах:
| Rtl | Fastmath | x86-32 | x86-64 | ARM32 | ARM64 |
|---|---|---|---|---|---|
| TVECTOR3D + TVECTOR3D | TVECTOR4 + TVECTOR4 | 1,2x | 1,6x | 2.8x | 2.5x |
| Сингл * TVECTOR3D | Сингл * TVECTOR4 | 2.2x | 2.1x | 5,6x | 3.7x |
| TVECTOR3D.Length | TVECTOR4.Length | 3,0x | 5,6x | 19.9x | 17.1x |
| TVECTOR3D.NORMALIGE | TVECTOR4. Нормализовать | 4,1x | 5,1x | 7,4x | 11,7X |
| TVECTOR3D * TMATRIX3D | TVECTOR4 * TMATRIX4 | 1,3х | 4,0x | 6,5x | 4,2x |
| Tmatrix3d * tmatrix3d | Tmatrix4 * tmatrix4 | 2.2x | 7,2X | 5,4х | 8,0x |
| Tmatrix3d.inverse | Tmatrix4.inverse | 9,8X | 9.2x | 8,0x | 9,8X |
| Грех (сингл) (x4) | Fastsin (tvector4) | 14.8x | 7,7x | 42,6x | 40.1x |
| Sincos (сингл) (x4) | Fastsincos (TVECTOR4) | 19.1x | 9.0x | 67.9x | 93,3X |
| Exp2 (single) (x4) | FASTEXP2 (TVECTOR4) | 22.4x | 32,7X | 275.0x | 302,4X |
Как видите, некоторые очень распространенные (3D) операции, такие как умножение матрицы и инверсия, могут быть почти в 10 раз быстрее, чем их соответствующие версии RTL. Кроме того, Fastmath включает в себя ряд функций Fast* приближения, которые жертвуют небольшой точностью для огромного увеличения скорости. Например, использование FastSinCos для расчета 4 синусоидальных и косинусных функций параллельно может быть в 90 раз быстрее, чем вызов функции RTL SinCos 4 раза, в то же время обеспечивая отличную точность для углов до +/4000 радиан (или +/- 230 000 градусов).
На 32-битных и 64-битных настольных платформах (Windows и OS X) эта производительность достигается с помощью набора инструкций SSE2. Это означает, что компьютер должен поддерживать SSE2. Однако, поскольку SSE2 был введен еще в 2001 году, подавляющее большинство компьютеров, используемых сегодня, поддержат его. Все 64-битные настольные компьютеры по умолчанию имеют поддержку SSE2. Тем не менее, вы всегда можете скомпилировать эту библиотеку с FM_NOSIMD , чтобы отключить оптимизацию SIMD и использовать простые версии Pascal. Это также может быть полезно для сравнения скорости версий Pascal с оптимизированными версиями SIMD.
На 32-битных мобильных платформах (iOS и Android) набор инструкций Neon используется для оптимизации SIMD. Это означает, что вашему устройству нужно поддерживать Neon. Но поскольку Delphi уже требует этого, это не создает никаких дополнительных ограничений.
На 64-битных мобильных платформах (iOS) используется набор инструкций ARM64/AARCH64 SIMD.
Не существует аппаратной ускоренной поддержки для симулятора iOS (он будет использовать версии Pascal для всех расчетов).
Операции Fastmath только на однооценных значениях с плавающей запятой. Арифметика с плавающей точкой с двумя режимами (в настоящее время) не поддерживается.
Большинство функций работают на отдельных значениях (типа Single ) и 2-, 3- и 4-мерных векторов (типов TVector2 , TVector3 и TVector4 соответственно). Векторы используются не только для представления точек или направлений в пространстве, но также могут рассматриваться как массивы 2, 3 или 4 значений, которые можно использовать для выполнения расчетов параллельно. В дополнение к векторам с плавающей точкой, существуют также векторы, которые оператор по целочисленным значениям ( TIVector2 , TIVector3 и TIVector4 ).
Существует также поддержка матриц 2x2, 3x3 и 4x4 (называется TMatrix2 , TMatrix3 и TMatrix4 ). По умолчанию матрицы хранятся в порядке строк мажор, как и в System.Math.Vectors RTL. Math.vectors. Тем не менее, вы можете изменить этот макет с помощью определения FM_COLUMN_MAJOR . Вместо этого это будет хранить матрицы в порядке столбцов, что полезно для приложений OpenGL (которые лучше всего работают с этим макетом). Кроме того, этот определение также будет обрезать глубину матриц камеры до -1..1 вместо по умолчанию 0..1. Опять же, это больше соответствует по умолчанию для приложений OpenGL.
Для представления вращений в трехмерном пространстве также есть TQuaternion , который похож на тип TQuaternion3D RTL.
Работа библиотеки несколько вдохновлена языками шейдеров (например, GLSL и HLSL). На этих языках вы также можете относиться к отдельным значениям и векторам аналогично. Например, вы можете использовать функцию Sin для расчета одного значения синуса, но вы также можете использовать ее с типом TVector4 для расчета 4 значений SINE за один вызов. В сочетании с приблизительными функциями Fast* это может привести к огромному повышению производительности, как показано ранее.
Все перегруженные операторы векторов и типов матриц, которые позволяют сводить, добавлять, добавлять, вычитать, умножать и делить скаляры, векторы и матрицы.
Есть также перегруженные операторы, которые сравнивают векторы и матрицы для равенства. Эти операторы проверяют точные совпадения (например, = Delphi). Они не допускают очень маленькие вариации (например, функции SameValue Delphi).
Арифметические операторы + , - , * и / обычно работают в виде компонента при применении к векторам. Например, если A и B имеют типа TVector4 , то C := A * B установит C TO (AX * BX, AY * BY, AZ * BZ, AW * BW) . Он не будет выполнять точку или поперечный продукт (вы можете использовать функции Dot и Cross для их вычисления).
Для матриц операторы + и - также работают по компонентам. Однако при умножении (или делящих) матриц на векторы или другие матрицы используется обычное линейное алгебраическое умножение (или деление). Например:
M := M1 * M2 выполняет линейную алгебраическую матрицу умножениюV := M1 * V1 выполняет матрицу * Вектор строк линейный алгебраический умножениеV := V1 * M1 выполняет вектор столбца * Матрица линейная алгебраическая умножение Чтобы умножить матрицы с точки зрения компонентов, вы можете использовать метод CompMult .
Fastmath предоставляет свои собственные типы векторов и матрицы для превосходной производительности. Большинство из них эквивалентны функциональности и хранению данных для типов RTL Delphi. Вы можете типировать между ними или неявно преобразовать из типа FastMath в тип 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 |
Документация можно найти в файле HTML Help File Fastmath.chm в каталоге Doc .
В качестве альтернативы вы можете прочитать документацию в режиме онлайн.
Репозиторий Fastmath содержит следующие каталоги:
Doc : Документация в формате HTMLHELP. Также содержит электронную таблицу (Benchmarks.xlsx) с результатами тестов производительности на моих устройствах (настольный компьютер Core i7 и iPad3).DocSource : содержит пакетные файлы для генерации документации. Вам нужен Pasdocex, чтобы создать документацию самостоятельно, если хотите.FastMath : содержит основной блок Neslib.FastMath , а также различные включают файлы с оптимизацией конкретных процессоров и статические библиотеки с оптимизированными ARM -версиями для iOS и Android.Arm : ARM Специфический исходный код и сценарии.Arm32 : содержит исходный код сборки для оптимизированных функций ARM.Arm64 : содержит исходный код сборки для оптимизированных функций ARM64.fastmath-android : содержит пакетные файлы и вспомогательные файлы для создания статической библиотеки для Android с помощью Android NDK.fastmath-ios : содержит сценарий оболочки MacOS для создания универсальной статической библиотеки для iOS.Tests : содержит приложение FireMonkey, которое запускает модульные тесты и тесты производительности. Fastmath лицензируется по упрощенной лицензии BSD. Некоторые из его функций основаны на коде других людей, лицензированных по MIT, новым лицензиям BSD и Zlib. Эти лицензии столь же разрешительны, как упрощенная лицензия BSD, используемая для всего проекта.
См. License.txt для деталей.