FastMath هي مكتبة الرياضيات في دلفي تم تحسينها للأداء السريع (أحيانًا على حساب عدم إجراء خطأ في الأخطاء أو فقدان دقة صغيرة). يستخدم رمز التجميع المحسّن يدويًا لتحقيق أداء أفضل بكثير ثم الوظائف المكافئة التي توفرها Delphi RTL.
هذا يجعل Fastmath مثاليًا للتطبيقات عالية الأداء للرياضيات مثل التطبيقات والألعاب متعددة الوسائط. من أجل أداء أفضل ، توفر المكتبة مجموعة متنوعة من الوظائف "التقريبية" (التي تبدأ جميعها مع prefix 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.normalizing | TVector4.Normalize | 4.1x | 5.1x | 7.4x | 11.7x |
| tvector3d * tmatrix3d | TVector4 * 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 |
| الخطيئة (واحدة) (x4) | فتيسين (TVector4) | 14.8x | 7.7x | 42.6x | 40.1x |
| sincos (واحد) (x4) | Fastsincos (TVector4) | 19.1x | 9.0x | 67.9x | 93.3x |
| Exp2 (واحد) (x4) | fastexp2 (TVector4) | 22.4x | 32.7x | 275.0x | 302.4x |
كما ترون ، يمكن أن تكون بعض عمليات شائعة جدًا (ثلاثية الأبعاد) مثل تكاثر المصفوفة والانعكاس أسرع 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) ، يتم استخدام مجموعة تعليمات النيون لتحسين SIMD. هذا يعني أن جهازك يحتاج إلى دعم النيون. ولكن بما أن Delphi يتطلب هذا بالفعل ، فإن هذا لا يشكل أي قيود أخرى.
على منصات متنقلة 64 بت (iOS) ، يتم استخدام مجموعة تعليمات SIMD ARM64/AARCH64.
لا يوجد أي دعم مسرع أجهزة لمحاكاة iOS (سوف يستخدم إصدارات Pascal لجميع الحسابات).
عمليات fastmath على القيم العائمة ذات الدقة الفردية فقط. الحساب المزدوج الفاصلة العائمة هو (حاليا) غير مدعوم.
تعمل معظم الوظائف على قيم واحدة (من النوع Single ) وناقلات 2 و 3 و 4 و 4 أبعاد (من الأنواع TVector2 و TVector3 و TVector4 على التوالي). لا يتم استخدام المتجهات فقط لتمثيل النقاط أو الاتجاهات في الفضاء ، ولكن يمكن اعتبارها أيضًا صفائف من قيم 2 أو 3 أو 4 التي يمكن استخدامها لإجراء الحسابات بالتوازي. بالإضافة إلى ناقلات النقطة العائمة ، هناك أيضًا ناقلات تعمل على قيم عدد صحيح ( TIVector2 و TIVector3 و TIVector4 ).
هناك أيضًا دعم لمصفوفات 2 × 2 و 3 × 3 و 4 × 4 (تسمى TMatrix2 و TMatrix3 و TMatrix4 ). بشكل افتراضي ، يتم تخزين المصفوفات بترتيب من الصفوف ، مثل تلك الموجودة في وحدة RTL's System.Math.Vectors . ومع ذلك ، يمكنك تغيير هذا التصميم مع تحديد FM_COLUMN_MAJOR . سيؤدي ذلك إلى تخزين المصفوفات بترتيب الأعمدة والجراحة بدلاً من ذلك ، وهو أمر مفيد لتطبيقات OpenGL (التي تعمل بشكل أفضل مع هذا التصميم). بالإضافة إلى ذلك ، سيؤدي هذا التعريف أيضًا إلى قيام عمق مصفوفات الكاميرا إلى -1..1 بدلاً من الافتراضي 0..1. مرة أخرى ، هذا يتماشى أكثر مع الافتراضي لتطبيقات OpenGL.
لتمثيل الدورات في الفضاء ثلاثي الأبعاد ، هناك أيضًا TQuaternion يشبه نوع TQuaternion3D الخاص بـ RTL.
تشغيل المكتبة مستوحى إلى حد ما من لغات التظليل (مثل GLSL و HLSL). في تلك اللغات ، يمكنك أيضًا التعامل مع القيم المفردة والمتجهات بالمثل. على سبيل المثال ، يمكنك استخدام وظيفة Sin لحساب قيمة جيب واحد ، ولكن يمكنك أيضًا استخدامها مع نوع TVector4 لحساب 4 قيم جيب في مكالمة واحدة. عند دمجها مع وظائف Fast* ، يمكن أن يؤدي ذلك إلى زيادة أداء هائلة ، كما هو موضح سابقًا.
تدعم جميع أنواع المتجهات والمصفوفة المشغلين الزائدين الذين يتيحون لك نفي العدادات المقياس والمصفوفات والمصفوفات.
هناك أيضًا عوامل محملة زائدة تقارن المتجهات والمصفوفات للمساواة. يقوم هؤلاء المشغلين بالتحقق من المطابقة الدقيقة (مثل Delphi's = Operator). أنها لا تسمح بتغيرات صغيرة جدًا (مثل وظائف Delphi SameValue ).
مشغلي الحساب + ، - ، * و / عادةً ما يكون مكونًا يعمل عند تطبيقه على المتجهات. على سبيل المثال ، إذا كان A و B من النوع TVector4 ، فسيتم تعيين C C := A * B على (AX * BX, AY * BY, AZ * BZ, AW * BW) . لن يقوم بمنتج أو منتج متقاطع (يمكنك استخدام وظائف Dot Cross لحسابها).
بالنسبة للمصفوفات ، يعمل المشغلون + و - على المكونات. ومع ذلك ، عند مضاعفة (أو تقسيم) المصفوفات مع المتجهات أو المصفوفات الأخرى ، يتم استخدام الضرب الجبري الخطي المعتاد (أو التقسيم). على سبيل المثال:
M := M1 * M2 يؤدي مضاعفة المصفوفة الجبرية الخطيةV := M1 * V1 يقوم بمصفوفة * row vector algebraic algeblicationV := V1 * M1 يقوم بمتجه العمود * المصفوفة الضرب الجبري الخطي لضرب مكون المصفوفات ، يمكنك استخدام طريقة CompMult .
يوفر FastMath أنواع المتجه والمصفوفة الخاصة به للأداء المتفوق. معظمها مكافئ في الوظائف وتخزين البيانات لأنواع Delphi RTL. يمكنك أن يتم تحريكها بينهما أو تحويلها ضمنيًا من نوع fastmath إلى نوع RTL أو العكس (على سبيل المثال. MyVector2 := MyPointF ). يوضح الجدول التالي التعيين:
| غاية | fastmath | Delphi RTL |
|---|---|---|
| 2D النقطة/المتجه | TVector2 | tpointf |
| 3D النقطة/المتجه | TVector3 | tpoint3d |
| 4D Point/Vector | TVector4 | TVector3D |
| 2x2 مصفوفة | tmatrix2 | ن/أ |
| 3x3 مصفوفة | tmatrix3 | tmatrix |
| 4x4 مصفوفة | tmatrix4 | tmatrix3d |
| رباعي | tqu- | tquaternion3d |
يمكن العثور على الوثائق في ملف HTML Help FileDmath.chm في دليل Doc .
بدلاً من ذلك ، يمكنك قراءة الوثائق عبر الإنترنت.
يحتفظ مستودع Fastmath بالدلائل التالية:
Doc : الوثائق بتنسيق HTMLHELP. يحتوي أيضًا على جدول بيانات (معايير. xlsx) مع نتائج اختبارات الأداء على أجهزتي (سطح المكتب Core i7 و iPad3).DocSource : يحتوي على ملفات دفعية لإنشاء الوثائق. تحتاج إلى pasdocex لإنشاء الوثائق بنفسك إذا كنت ترغب في ذلك.FastMath : يحتوي على وحدة Neslib.FastMath الرئيسية وكذلك العديد من الملفات التي تحتوي على تحسينات محددة للمعالج ، والمكتبات الثابتة مع إصدارات محسّنة للذراع لنظام التشغيل iOS و Android.Arm : ذراع رمز المصدر المحدد والبرامج النصية.Arm32 : يحتوي على رمز مصدر التجميع لوظائف ARM النيون المحسنة.Arm64 : يحتوي على رمز مصدر التجميع لوظائف ARM64 المحسنة.fastmath-android : يحتوي على ملف دفعي وملفات مساعد لإنشاء المكتبة الثابتة لنظام Android باستخدام Android NDK.fastmath-ios : يحتوي على نص MacOS Shell لبناء مكتبة ثابتة عالمية لنظام التشغيل iOS.Tests : يحتوي على تطبيق FireMonkey الذي يقوم بتشغيل اختبارات الوحدة واختبارات الأداء. تم ترخيص FastMath بموجب ترخيص BSD المبسط. تعتمد بعض وظائفها على رمز الأشخاص الآخرين المرخصة بموجب تراخيص MIT و BSD و ZLIB الجديدة. هذه التراخيص متساهلة مثل ترخيص BSD المبسط المستخدم للمشروع بأكمله.
انظر الترخيص. txt للحصول على التفاصيل.