تنسيق الفاصلة العائمة بنصف الدقة
الدقة النصفية (وتُسمى أحيانًا FP16 أو float16 ) هي صيغة رقمية ثنائية للفاصلة العائمة تشغل 16 بت (بايتين في الحواسيب الحديثة) في ذاكرة الحاسوب . وهي مُخصصة لتخزين قيم الفاصلة العائمة في التطبيقات التي لا تتطلب دقة عالية، وخاصةً معالجة الصور والشبكات العصبية .
تتبع معظم الاستخدامات الحديثة معيار IEEE 754-2008 ، حيث يُشار إلى تنسيق الأساس 2 ذي 16 بت باسم binary16 ، ويستخدم الأس 5 بتات. ويمكن لهذا أن يعبر عن قيم في النطاق ±65504، مع كون القيمة الدنيا التي تزيد عن 1 هي 1 + 1/1024.
تاريخ
ظهرت عدة صيغ سابقة للأعداد العشرية ذات 16 بت، منها صيغة معالج الإشارات الرقمية HD61810 من هيتاشي عام 1982 (أس من 4 بتات وكسر من 12 بتًا)، [ 1 ] وأعلى 16 بتًا من عدد عشري ذي 32 بت (8 بتات للأس و7 بتات للكسر) يُسمى bfloat16 ، وصيغة WIF من توماس ج. سكوت عام 1991 (5 بتات للأس و10 بتات للكسر)، [ 2 ] ومعالج الرسومات Voodoo من 3dfx عام 1995 (وهو نفسه صيغة هيتاشي). [ 3 ]
كانت شركة ILM تبحث عن تنسيق صور قادر على التعامل مع نطاق ديناميكي واسع ، دون استهلاك موارد القرص الصلب والذاكرة اللازمة لأنظمة الفاصلة العائمة أحادية أو مزدوجة الدقة. [ 4 ] استخدم فريق التظليل القابل للبرمجة المُسرّع بالأجهزة، بقيادة جون آيري في شركة SGI (سيليكون غرافيكس)، نوع البيانات s10e5 في عام 1997 كجزء من مشروع تصميم "bali". وُصِف هذا النوع في ورقة بحثية نُشرت في مؤتمر SIGGRAPH 2000 [ 5 ] (انظر القسم 4.3)، ووُثِّق أيضًا في براءة الاختراع الأمريكية رقم 7518615. [ 6 ] وقد شاع استخدامه بفضل استخدامه في تنسيق الصور مفتوح المصدر OpenEXR .
قامت شركتا Nvidia و Microsoft بتعريف نوع البيانات النصفية في لغة Cg ، التي تم إصدارها في أوائل عام 2002، وقامتا بتنفيذها في السيليكون في GeForce FX ، التي تم إصدارها في أواخر عام 2002. [ 7 ] ومع ذلك، تم إسقاط دعم الأجهزة للنقطة العائمة 16 بت المعجلة لاحقًا بواسطة Nvidia قبل إعادة تقديمها في وحدة معالجة الرسومات المحمولة Tegra X1 في عام 2015.
يسمح امتداد F16C في عام 2012 لمعالجات x86 بتحويل الأعداد العشرية ذات الدقة النصفية من وإلى الأعداد العشرية ذات الدقة المفردة باستخدام تعليمات الآلة.
تنسيق الفاصلة العائمة الثنائية بنصف الدقة IEEE 754: binary16
يحدد معيار IEEE 754 [ 8 ] أن binary16 له التنسيق التالي:
- بت الإشارة : 1 بت
- عرض الأس : 5 بتات
- دقة الجزء المهم : 11 بت (يتم تخزين 10 بت بشكل صريح)
تم وضع التنسيق على النحو التالي:
![]()
يُفترض أن يكون للتنسيق بتّ رئيسي ضمني بقيمة 1 ما لم يُخزّن حقل الأسّ بأصفار. وبالتالي، يظهر 10 بتات فقط من الجزء الكسري في تنسيق الذاكرة، لكن الدقة الإجمالية هي 11 بتًا. في مصطلحات IEEE 754، يوجد 10 بتات للجزء الكسري، لكن دقة الجزء الكسري هي 11 بتًا (log 10 (2 11 ) ≈ 3.311 رقمًا عشريًا، أو 4 أرقام ± أقل بقليل من 5 خانات في الخانة الأخيرة ).
ترميز الأس
يتم ترميز الأس الثنائي ذي الدقة النصفية باستخدام تمثيل ثنائي الإزاحة ، حيث تكون إزاحة الصفر 15؛ وهو ما يُعرف أيضًا باسم انحياز الأس في معيار IEEE 754. [ 8 ]
- E دقيقة = 00001 2 − 01111 2 = −14
- ه ماكس = 11110 2 − 01111 2 = 15
- انحياز الأس = 01111 2 = 15
وبالتالي، وكما هو محدد بواسطة التمثيل الثنائي للإزاحة، من أجل الحصول على الأس الحقيقي، يجب طرح الإزاحة 15 من الأس المخزن.
يتم تفسير الأسس المخزنة 00000 2 و 11111 2 بشكل خاص.
| الأس | المعامل = صفر | المعامل المعنوي ≠ صفر | معادلة |
|---|---|---|---|
| 00000 2 | صفر ، -0 | أعداد دون المستوى الطبيعي | (−1) signbit × 2 −14 × 0.significantbits 2 |
| 00001 2 ، ..., 11110 2 | القيمة المعيارية | (−1) بت الإشارة × 2 الأس −15 × 1. بتات الإشارة 2 | |
| 11111 2 | ± ما لا نهاية | NaN (هادئ، إشارة) | |
أصغر قيمة موجبة تمامًا (دون المستوى الطبيعي) هي 2⁻²⁴ ≈ 5.96 × 10⁻⁸ . أصغر قيمة موجبة طبيعية هي 2⁻¹⁴ ≈ 6.10 × 10⁻⁵ . أكبر قيمة قابلة للتمثيل هي (2⁻²⁻¹⁰ ) × 2¹⁵ = 65504.
أمثلة على الدقة النصفية
تُقدَّم هذه الأمثلة بتمثيل بتّي للقيمة العشرية. ويشمل ذلك بت الإشارة، والأس (المتحيز)، والجزء الكسري.
| ثنائي | عرافة | قيمة | ملحوظات |
|---|---|---|---|
| 0 00000 0000000000 | 0000 | 0 | |
| 0 00000 0000000001 | ٠٠٠١ | 2 −14 × (0 + 1 / 1024 ) ≈ 0.000000059604645 | أصغر عدد طبيعي موجب |
| 0 00000 1111111111 | 03ff | 2 −14 × (0 + 1023 / 1024 ) ≈ 0.000060975552 | أكبر عدد دون الطبيعي |
| 0 00001 0000000000 | 0400 | 2 −14 × (1 + 0 / 1024 ) ≈ 0.00006103515625 | أصغر عدد طبيعي موجب |
| 0 01101 0101010101 | 3555 | 2 −2 × (1 + 341 / 1024 ) ≈ 0.33325195 | أقرب قيمة إلى 1/3 |
| 0 01110 1111111111 | 3bff | 2 −1 × (1 + 1023 / 1024 ) ≈ 0.99951172 | أكبر عدد أقل من واحد |
| 0 01111 0000000000 | 3c00 | 20 × (1 + 0 / 1024 ) = 1 | واحد |
| 0 01111 0000000001 | 3c01 | 2 0 × (1 + 1 / 1024 ) ≈ 1.00097656 | أصغر عدد أكبر من واحد |
| 0 10000 1001001000 | 4248 | 2 1 × (1 + 584 / 1024 ) = 3.140625 | أقرب قيمة إلى π |
| 0 11001 1111111111 | 67 وما بعدها | 2 × 10 × (1 + 1023 / 1024 ) = 2047 | أكبر عدد فردي |
| 0 11110 1111111111 | 7bff | 2 15 × (1 + 1023 / 1024 ) = 65504 | أكبر عدد محدود |
| 0 11111 0000000000 | 7c00 | ∞ | اللانهاية |
| 1 00000 0000000000 | 8000 | -0 | |
| 1 10000 0000000000 | c000 | (−1) 1 × 2 1 × (1 + 0 / 1024 ) = −2 | |
| 1 11111 0000000000 | fc00 | −∞ | سالب ما لا نهاية |
افتراضيًا، يتم تقريب 1/3 إلى الأسفل كما هو الحال في الدقة المزدوجة ، نظرًا لعدد البتات الفردي في الجزء الكسري. البتات التي تلي نقطة التقريب هي 0101 ... وهي أقل من نصف وحدة في الخانة الأخيرة .
دقة نصف بديلة ARM
تدعم معالجات ARM (عبر بتة سجل التحكم في الفاصلة العائمة ) تنسيق "نصف الدقة البديل"، الذي يلغي الحالة الخاصة لقيمة الأس 31 (11111 2 ). [ 9 ] وهو مطابق تقريبًا لتنسيق IEEE، ولكنه لا يتضمن ترميزًا للقيم اللانهائية أو NaN؛ بدلاً من ذلك، يرمز الأس 31 إلى الأعداد المعيارية في النطاق من 65536 إلى 131008.
استخدامات الدقة النصفية
تُستخدم الدقة النصفية في العديد من بيئات رسومات الحاسوب لتخزين وحدات البكسل، بما في ذلك MATLAB وOpenEXR وJPEG XR وGIMP وOpenGL وVulkan وCg وDirect3D و D3DX . وتكمن ميزتها على الأعداد الصحيحة 8 بت أو 16 بت في أن النطاق الديناميكي الأوسع يسمح بالحفاظ على مزيد من التفاصيل في المناطق المضيئة والمظلمة للصور، ويتجنب تصحيح غاما . أما ميزتها على الأعداد العشرية أحادية الدقة 32 بت فهي أنها تتطلب نصف مساحة التخزين وعرض النطاق الترددي (على حساب الدقة والنطاق) .
يمكن أن تكون الدقة النصفية مفيدة لتكميم الشبكة . عادةً ما تُخزَّن بيانات الشبكة باستخدام أعداد عشرية أحادية الدقة 32 بت للرؤوس، ولكن في بعض الحالات، يُمكن تقليل الدقة إلى 16 بت فقط (نصف الدقة)، مما يتطلب نصف مساحة التخزين فقط على حساب بعض الدقة. كما يُمكن إجراء تكميم الشبكة بدقة ثابتة 8 بت أو 16 بت حسب المتطلبات. [ 11 ]
تستخدم الأجهزة والبرامج الخاصة بالتعلم الآلي والشبكات العصبية غالبًا حسابات نصف الدقة لتسريع العمليات الحسابية. في هذه التطبيقات، يُفضّل أحيانًا استخدام تنسيق bfloat16 المميز نظرًا لنطاقه الديناميكي الأوسع مقارنةً بنصف الدقة، [ 12 ] كما تُستخدم تنسيقات الفاصلة العائمة المتخصصة التي لا تتجاوز 8 بتات بشكل متزايد لتسريع بعض العمليات الحسابية.
إذا كانت المكونات المادية تحتوي على تعليمات لإجراء عمليات حسابية بنصف الدقة، فإنها غالبًا ما تكون أسرع من الدقة المفردة أو المزدوجة، وأحيانًا تصل سرعتها إلى أربعة أضعاف. بالإضافة إلى ذلك، إذا كان النظام يحتوي على تعليمات SIMD ، فغالبًا ما يمكن لتعليمات واحدة أن تعمل في وقت واحد على ضعف عدد القيم النصفية مقارنةً بالقيم العشرية. [ 13 ]
الدعم بواسطة لغات البرمجة
توفر لغات البرمجة Zig و Odin وغيرها دعمًا للدقة النصفية مع f16نوعها. [ 14 ] [ 15 ]
أضافت .NET 5 أرقام الفاصلة العائمة بنصف الدقة إلى System.Halfنوع المكتبة القياسية. [ 16 ] [ 17 ] اعتبارًا من 16 يوليو 2025 لا تحتوي أي لغة من لغات .NET (مثل C# و F# و Visual Basic و C++/CLI و C++/CX ) على قيم حرفية (مثلاً في C#، 1.0fيوجد نوع `has type` System.Singleأو 1.0m`has type` System.Decimal) أو كلمة مفتاحية لهذا النوع. [ 18 ] [ 19 ] [ 20 ]
قدمت لغة Swift أرقام الفاصلة العائمة بنصف الدقة في الإصدار 5.3 باستخدام النوع [ 21 ]Float16 .
يدعم OpenCL أيضًا أرقام الفاصلة العائمة بنصف الدقة باستخدام نوع البيانات half على تنسيق تخزين IEEE 754-2008 بنصف الدقة. [ 22 ]
اعتبارًا من 31 مايو 2026 يعمل Rust حاليًا على إضافة f16نوع جديد للأعداد العشرية ذات الدقة النصفية 16 بت وفقًا لمعيار IEEE. [ 23 ]
توفر لغة جوليا دعمًا للأرقام العشرية ذات الدقة النصفية باستخدام Float16النوع. [ 24 ]
أدخلت لغة C++ خاصية الدقة النصفية منذ الإصدار C++23 مع النوع [ 25 ]std::float16_t . ويدعم GCC هذه الخاصية بالفعل. [ 26 ]
دعم الأجهزة
تدعم العديد من إصدارات بنية ARM الدقة النصفية. [ 27 ]
تم تحديد دعم التحويلات باستخدام الأعداد العشرية ذات الدقة النصفية في مجموعة تعليمات x86 في امتداد مجموعة تعليمات F16C ، الذي قدمته AMD لأول مرة في عام 2009 واعتمدته معالجات AMD وIntel على نطاق واسع بحلول عام 2012. وقد تم توسيع هذا الدعم لاحقًا ليشمل امتداد مجموعة تعليمات AVX-512_FP16 الذي تم تنفيذه في معالج Intel Sapphire Rapids . [ 28 ]
في معمارية RISC-V ، توفر Zfhالامتدادات دعمًا ماديًا للأعداد العشرية ذات الدقة النصفية 16 بت. ويُعد هذا الامتداد بديلاً بسيطًا لـ [ 29 ] .ZfhminZfhminZfh
في نظام Power ISA ، يوفر كل من VSX وامتداد SVP64 الذي لم تتم الموافقة عليه بعد، دعمًا ماديًا للأعداد العشرية ذات الدقة النصفية 16 بت بدءًا من PowerISA v3.1B والإصدارات الأحدث. [ 30 ] [ 31 ]
يُعد دعم الدقة النصفية على نظام IBM Z جزءًا من ميزة مساعدة معالجة الشبكات العصبية التي قدمتها IBM مع نظام Telum . وتشير IBM إلى بيانات الفاصلة العائمة ذات الدقة النصفية باسم NNP-Data-Type 1 (16 بت).
انظر أيضاً
- تنسيق الفاصلة العائمة bfloat16 : تنسيق بديل للفاصلة العائمة 16 بت مع 8 بتات للأس و7 بتات للكسر العشري
- Minifloat : تنسيقات الفاصلة العائمة الصغيرة
- IEEE 754 : معيار IEEE للحسابات ذات الفاصلة العائمة (IEEE 754)
- ISO/IEC 10967 ، الحساب المستقل عن اللغة
- نوع البيانات الأولية
- تنسيق صورة RGBE
- ناقل إدارة الطاقة § تنسيق النقطة العائمة Linear11
مراجع
- ↑ "هيتاشي :: داتا بوكس :: دليل مستخدم معالج الإشارات الرقمية HD61810" . Archive.org . تم الاطلاع عليه بتاريخ 14 يوليو 2017 .
- ↑ سكوت، توماس ج. (مارس 1991). "الرياضيات وعلوم الحاسوب على خلاف حول الأعداد الحقيقية". وقائع الندوة الفنية الثانية والعشرين لجمعية SIGCSE حول تعليم علوم الحاسوب - SIGCSE '91 . المجلد 23. الصفحات 130-139 . doi : 10.1145/107004.107029 . ISBN 0897913779. S2CID 16648394 .
- ↑ "/home/usr/bk/glide/docs2.3.1/GLIDEPGM.DOC" . Gamers.org . تم الاطلاع عليه بتاريخ 14 يوليو 2017 .
- 1 2 "OpenEXR" . OpenEXR. مؤرشف من الأصل بتاريخ 2013-05-08 . تم الاسترجاع بتاريخ 2017-07-14 .
- ↑ مارك س. بيرسي؛ مارك أولانو؛ جون أيري؛ ب. جيفري أونغار. "التظليل التفاعلي متعدد المراحل القابل للبرمجة" (ملف PDF) . People.csail.mit.edu . تاريخ الاسترجاع: 14 يوليو 2017 .
- ↑ "براءة الاختراع الأمريكية رقم US7518615 - نظام عرض مزود بتقنية تحويل البيانات إلى صور نقطية عائمة وتقنية معالجة البيانات النقطية العائمة ... - براءات اختراع جوجل" . Google.com . تاريخ الاسترجاع: 14 يوليو 2017 .
- ↑ "vs_2_sw" . وثائق مجموعة أدوات Cg 3.1 . إنفيديا . تم الاطلاع عليه بتاريخ 17 أغسطس 2016 .
- 1 2 معيار IEEE للحسابات ذات الفاصلة العائمة . IEEE STD 754-2019 (مراجعة IEEE 754-2008). يوليو 2019. الصفحات 1-84 . doi : 10.1109/ieeestd.2019.8766229 . ISBN 978-1-5044-5924-2.
- ↑ "دعم الأعداد العشرية ذات الدقة النصفية" . دليل مستخدم مُجمِّع أدوات RealView . 10 ديسمبر 2010. تم الاطلاع عليه بتاريخ 5 مايو 2015 .
- ↑ غارارد، أندرو. "10.1. أعداد الفاصلة العائمة ذات 16 بت" . مواصفات تنسيق بيانات كرونوس الإصدار 1.2 المراجعة 1. كرونوس . تم الاسترجاع في 5 أغسطس 2023 .
- ↑ "KHR_mesh_quantization" . GitHub . مجموعة كرونوس . تم الاسترجاع في 2023-07-02 .
- ↑ داريا سوبوليفا (30 يناير 2023). "هل نستخدم Bfloat أم لا؟ هذا هو السؤال!" . مؤرشف من الأصل في 15 أغسطس 2025. تم الاطلاع عليه في 13 أبريل 2026. يمكن
لتنسيق بيانات bfloat16 تقليل الوقت اللازم لتدريب نماذج التعلم العميق من نوع GPT مع الحفاظ على دقة النموذج في المهام اللاحقة. [...] يتميز bfloat16 بنطاق ديناميكي أكبر (عدد بتات الأس) من float16، وهو مطابق لـ float32.
- ↑ هو، نهوت-مين؛ وونغ، وينغ-فاي (1 سبتمبر 2017). "استغلال حسابات نصف الدقة في وحدات معالجة الرسومات من إنفيديا" (ملف PDF) . قسم علوم الحاسوب، جامعة سنغافورة الوطنية . تاريخ الاسترجاع: 13 يوليو 2020.
أضافت إنفيديا مؤخرًا دعمًا أصليًا لحسابات الفاصلة العائمة بنصف الدقة (FP16) إلى وحدات معالجة الرسومات من نوع باسكال. وكان الدافع الرئيسي وراء ذلك هو إمكانية تسريع التطبيقات كثيفة البيانات والتي تتحمل الأخطاء في وحدات معالجة الرسومات.
- ↑ "Floats" . ziglang.org . تم الاطلاع عليه في 7 يناير 2024 .
- ↑ "الأنواع الأساسية" . odin-lang.org . تم الاطلاع عليه بتاريخ 22 مارس 2026 .
- ↑ "نصف البنية (النظام)" . learn.microsoft.com . تم الاطلاع عليه بتاريخ 2024-02-01 .
- ↑ جوفينداراجان، براشانث (31 أغسطس 2020). "تقديم النوع النصفي!" . مدونة .NET . تم الاطلاع عليه بتاريخ 1 فبراير 2024 .
- ↑ "أنواع الأرقام ذات الفاصلة العائمة - مرجع C#" . learn.microsoft.com . 2022-09-29 . تم الاطلاع عليه بتاريخ 2024-02-01 .
- ↑ "القيم الحرفية - مرجع لغة F#" . learn.microsoft.com . 2022-06-15 . تم الاطلاع عليه بتاريخ 2024-02-01 .
- ↑ "ملخص أنواع البيانات - مرجع لغة فيجوال بيسك" . learn.microsoft.com . 2021-09-15 . تم الاطلاع عليه بتاريخ 2024-02-01 .
- ↑ "swift-evolution/proposals/0277-float16.md at main · apple/swift-evolution" . github.com . تم الاطلاع عليه بتاريخ 13 مايو 2024 .
- ↑ "امتداد cl_khr_fp16" . registry.khronos.org . تم الاطلاع عليه بتاريخ 31 مايو 2024 .
- ↑ كروس، ترافيس. "مشكلة تتبع أنواع الأعداد العشرية f16 و f128" . جيت هاب . تم الاسترجاع في 2024-07-05 .
- ↑ "الأعداد الصحيحة والأعداد العشرية · لغة جوليا" . docs.julialang.org . تم الاطلاع عليه بتاريخ 11-07-2024 .
- ↑ "P1467R9: أنواع الفاصلة العائمة الموسعة والأسماء القياسية" . www.open-std.org . تم الاطلاع عليه بتاريخ 18-10-2024 .
- ↑ "106652 – [ C++23 ] P1467 - أنواع الفاصلة العائمة الموسعة والأسماء القياسية" . gcc.gnu.org . تم الاطلاع عليه بتاريخ 18-10-2024 .
- ↑ "تنسيق الأرقام العشرية بنصف الدقة" . دليل مرجعي لمترجم ARM armclang، الإصدار 6.7 . مطورو ARM . تم الاطلاع عليه بتاريخ 13 مايو 2022 .
- ↑ تاونر، دانيال. "مجموعة تعليمات Intel® Advanced Vector Extensions 512 - FP16 لمنتجات Intel® Xeon® Processor" (ملف PDF) . برامج Intel® Builders . تم الاطلاع عليه بتاريخ 13 مايو 2022 .
- ↑ "دليل مجموعة تعليمات RISC-V، المجلد الأول: مجموعة تعليمات RISC-V على مستوى المستخدم" . فايف إمبيد ديف . تم الاطلاع عليه بتاريخ 2023-07-02 .
- ↑ "OPF_PowerISA_v3.1B.pdf" . ملفات OpenPOWER . مؤسسة OpenPOWER . تم الاطلاع عليه بتاريخ 2023-07-02 .
- ↑ "ls005.xlen.mdwn" . libre-soc.org Git . تم الاسترجاع في 2023-07-02 .
للمزيد من القراءة
روابط خارجية
- الأرقام العشرية الصغيرة (في دراسة استقصائية لتنسيقات الأرقام العشرية )
- موقع OpenEXR
- الحساب الثنائي
- أنواع الفاصلة العائمة 16 بت
