FastMath는 빠른 성능에 최적화 된 델파이 수학 라이브러리입니다 (때로는 오류 확인을 수행하지 않거나 약간의 정확성을 잃지 않아야합니다). 손으로 최적화 된 어셈블리 코드를 사용하여 Delphi RTL이 제공하는 동등한 기능보다 훨씬 더 나은 성능을 달성합니다.
이로 인해 Fastmath는 다중 미디어 응용 프로그램 및 게임과 같은 고성능 수학 집약적 인 응용 프로그램에 이상적입니다. 더 나은 성능을 얻으려면 라이브러리는 다양한 "근사"기능 (모두 Fast -Prefix로 시작)을 제공합니다. 이것들은 매우 빠를 수 있지만 (때로는 놀랍게도 적은) 정확도를 잃게됩니다. 게임 및 애니메이션의 경우, 이러한 정확도의 손실은 일반적으로 완벽하게 수용 가능하며 속도 증가로 인해 중요합니다. 과학적 계산에 사용하지 마십시오 ...
부동 소수점 예외를 억제하기 위해 응용 프로그램 시작시 DisableFloatingPointExceptions 를 호출 할 수 있습니다. 대신 작업을 수행 할 수없는 경우 극한의 값 (NAN 또는 Infinity)을 반환합니다. 여러 스레드에서 FastMath를 사용하는 경우 해당 스레드의 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.8x | 2.5x |
| 싱글 * tvector3d | 싱글 * tvector4 | 2.2 배 | 2.1x | 5.6 배 | 3.7x |
| tvector3d.length | tvector4.length | 3.0x | 5.6 배 | 19.9x | 17.1x |
| tvector3d. 정상화 | tvector4.normanize | 4.1x | 5.1x | 7.4x | 11.7x |
| tvector3d * tmatrix3d | tvector4 * tmatrix4 | 1.3 배 | 4.0x | 6.5x | 4.2 배 |
| tmatrix3d * tmatrix3d | tmatrix4 * tmatrix4 | 2.2 배 | 7.2 배 | 5.4x | 8.0x |
| tmatrix3d.inverse | tmatrix4.inverse | 9.8x | 9.2 배 | 8.0x | 9.8x |
| 죄 (싱글) (x4) | Fastsin (TVector4) | 14.8x | 7.7x | 42.6 배 | 40.1x |
| sincos (싱글) (x4) | FastSincos (TVector4) | 19.1x | 9.0x | 67.9x | 93.3x |
| exp2 (싱글) (x4) | FastExp2 (TVector4) | 22.4 배 | 32.7x | 275.0x | 302.4x |
보시다시피, 매트릭스 곱셈 및 역전과 같은 매우 일반적인 (3D) 작업은 해당 RTL 버전보다 거의 10 배 빠를 수 있습니다. 또한 FastMath에는 엄청난 속도 증가를 위해 약간의 정확도를 희생하는 많은 Fast* 근사 기능이 포함되어 있습니다. 예를 들어, FastSinCos 사용하여 4 개의 사인 및 코사인 함수를 병렬로 계산하는 것은 RTL SinCos 기능을 4 배라고 호출하는 것보다 최대 90 배 더 빠를 수 있지만, 최대 +/4000 라디안 (또는 +/- 230,000도)의 각도에 대한 정확도를 제공합니다.
32 비트 및 64 비트 데스크탑 플랫폼 (Windows 및 OS X) 에서이 성능은 SSE2 명령 세트를 사용하여 달성됩니다. 이는 컴퓨터가 SSE2를 지원해야 함을 의미합니다. 그러나 SSE2가 2001 년에 소개되었으므로 오늘날 사용중인 대다수의 컴퓨터가이를 지원할 것입니다. 64 비트 데스크탑 컴퓨터는 모두 기본적으로 SSE2 지원이 있습니다. 그러나 FM_NOSIMD 정의로 항상이 라이브러리를 컴파일하여 SIMD 최적화를 비활성화하고 일반 파스칼 버전을 사용합니다. 이것은 또한 파스칼 버전의 속도를 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 라고 함)에 대한 지원도 있습니다. 기본적으로 행렬은 RTL의 System.Math.Vectors 단위와 같이 행 광기 순서로 저장됩니다. 그러나 FM_COLUMN_MAJOR DEFINE 으로이 레이아웃을 변경할 수 있습니다. 이렇게하면 매트릭스를 대신 열 순서로 저장하므로 OpenGL 애플리케이션에 유용합니다 (이 레이아웃에서 가장 잘 작동합니다). 또한이 정의는 기본 0..1 대신 카메라 행렬의 깊이를 -1..1로 클립합니다. 다시 말하지만, 이것은 OpenGL 응용 프로그램의 기본값과 더 일치합니다.
3D 공간에서의 회전을 나타내는 경우 RTL의 TQuaternion3D 유형과 유사한 TQuaternion 도 있습니다.
라이브러리의 작동은 셰이더 언어 (예 : 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 유형에 대한 기능 및 데이터 스토리지와 동일합니다. 당신은 그들 사이를 타이핑하거나 FastMath 유형에서 RTL 유형으로 또는 그 반대를 암시 적으로 변환 할 수 있습니다 (예 : MyVector2 := MyPointF ). 다음 표는 매핑을 보여줍니다.
| 목적 | Fastmath | 델파이 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 형식의 문서. 또한 내 장치 (핵심 i7 데스크탑 및 iPad3)에서 성능 테스트 결과가 포함 된 스프레드 시트 (Benchmarks.xlsx)도 포함되어 있습니다.DocSource : 문서를 생성하기위한 배치 파일이 포함되어 있습니다. 원하는 경우 문서를 직접 생성하려면 pasdocex가 필요합니다.FastMath : Main Neslib.FastMath 장치와 프로세서 별 최적화가 포함 된 파일과 iOS 및 Android 용 ARM 최적화 버전이있는 정적 라이브러리가 포함되어 있습니다.Arm : ARM 특정 소스 코드 및 스크립트.Arm32 : ARM 네온 최적화 기능에 대한 어셈블리 소스 코드가 포함되어 있습니다.Arm64 : ARM64 최적화 함수의 어셈블리 소스 코드가 포함되어 있습니다.fastmath-android : Android NDK를 사용하여 Android 용 정적 라이브러리를 구축하기위한 배치 파일 및 도우미 파일이 포함되어 있습니다.fastmath-ios : iOS 용 범용 정적 라이브러리를 구축하기위한 MacOS 쉘 스크립트가 포함되어 있습니다.Tests : 단위 테스트 및 성능 테스트를 실행하는 Firemonkey 응용 프로그램이 포함되어 있습니다. FastMath는 단순화 된 BSD 라이센스에 따라 라이센스가 부여됩니다. 그 기능 중 일부는 MIT, 새로운 BSD 및 Zlib 라이센스에 따라 라이센스가 부여 된 다른 사람들의 코드를 기반으로합니다. 이러한 라이센스는 전체 프로젝트에 사용되는 단순화 된 BSD 라이센스만큼 허용됩니다.
자세한 내용은 License.txt를 참조하십시오.