مكتبة x86 SIMD الجديدة - تصحيح إينترين

مع كل جيل جديد من معالجات Intel ، تظهر تعليمات متجهية جديدة ومتزايدة التعقيد. على الرغم من أن طول المتجه (512 بت) لن ينمو في المستقبل القريب ، ستظهر أنواع جديدة من البيانات وأنواع التعليمات. على سبيل المثال ، من الذي يمكنه أن يفهم في لمحة ما الذي يفعله هذا المضمّن (وتعليمات المعالج المقابلة)؟

منطق الثلاثية bitwise الذي يوفر القدرة على تنفيذ أي وظيفة ثنائية ثلاثة المعامل ؛ يتم تحديد الوظيفة الثنائية المحددة حسب القيمة في imm8.

__m512i _mm512_mask_ternarylogic_epi32 (__m512i src, __mmask8 k, __m512i a, __m512i b, int imm8) FOR j := 0 to 15 i := j*32 IF k[j] FOR h := 0 to 31 index[2:0] := (src[i+h] << 2) OR (a[i+h] << 1) OR b[i+h] dst[i+h] := imm8[index[2:0]] ENDFOR ELSE dst[i+31:i] := src[i+31:i] FI ENDFOR dst[MAX:512] := 0 

حسنًا ، دعنا نقول أننا توصلنا إلى كيفية عمله. المستوى التالي من التعقيد هو رمز تصحيح الأخطاء الذي يستخدم بشكل مكثف مثل هذه العناصر الداخلية.

أولئك الذين يستخدمون المواد الداخلية بانتظام يعرفون مثل هذا الموقع المفيد للغاية - دليل إنتل الداخلي . إذا نظرت بعناية في كيفية عمله ، فمن السهل أن تلاحظ أن واجهة جافا سكريبت الأمامية تقوم بتنزيل ملف data-3.xxxml ، الذي يصف بالتفصيل جميع العناصر الداخلية ، برمز مشابه لبرنامج Matlab. (على سبيل المثال ، الذي قمت بنسخه في عنوان المنشور.)

لكن عندما نستخدم العناصر الداخلية لتسريع الكود ، فإننا لا نكتب بلغة Matlab ، ولكن في C و C ++! قبل ثلاثة أشهر ، سألني أحد العملاء عما إذا كان هناك تطبيق مضمن في المتجهات في C لتصحيح الأخطاء ، وقررت أن أكتب محللًا يترجم الشفرة من دليل Intrinsics إلى C. ويظهر مكتبة تقوم بتنفيذ جميع العناصر الداخلية تقريبًا حتى تتمكن من الدخول إلى الداخل باستخدام مصحح أخطاء خطوة بخطوة ( أو إضافة تصحيح printf).

على سبيل المثال ، تتحول عملية من عنوان منشور إلى

 for (int j = 0; j <= 15; j++) { if (k & (1 << j)) { for (int h = 0; h <= 31; h++) { int index = ((((src_vec[j] & (1 << h)) >> h) << 2) | (((a_vec[j] & (1 << h)) >> h) << 1) | ((b_vec[j] & (1 << h)) >> h)) & 0x7; dst_vec[j] = (dst_vec[j] & ~(1 << h)) | ((((imm8 & (1 << index)) >> index)) << h); } } else { dst_vec[j] = src_vec[j]; } } 

صحيح ، هذا أكثر قابلية للفهم؟ ليس حقا؟ حسنًا ، لقد اخترت وظيفة معقدة كمثال. عادةً ، عند تصحيح التعليمات البرمجية باستخدام العناصر الداخلية ، (على سبيل المثال ، DSP) ، عليك أن تضع في الاعتبار كلاً من الخوارزمية وميزات كل تعليمة. بالنظر إلى أن التعليمات تعمل مع المتجهات الطويلة ، وأن خوارزميات DSP تعتمد في كثير من الأحيان على الرياضيات الجادة ، فإن رأسي لا يتأقلم - فليس هناك ما يكفي من الذاكرة والتركيز على المدى القصير. أظن أنني لست وحدي - حتى أنني اعتقدت عدة مرات أنني قد وجدت خللًا في الإرشادات. ثم ، بالطبع ، في كل مرة اتضح أنني كنت مخطئًا ، ولم ينجح الأمر في فتح خطأ FDIV جديد. ولكن إذا كان في هذه الحالات يمكنني تصحيح الأخطاء خطوة بخطوة داخل التعليمات ، فسوف أفهم على الفور تحت أي ظرف من الظروف القيمة التي تظهر في مكون الموجه الخاص بي الذي لم أتوقعه.

أخبرني العملاء أنهم يستخدمون هذه المكتبة لتصحيح الأخطاء الفردية مع مضمن AVX-512 على كمبيوتر محمول يدعم AVX2 فقط. بالطبع ، تعد Intel SDE مناسبة تمامًا لهذا الغرض - لأنها تحاكي بدقة جميع مجموعات التعليمات. لدي مجموعة من اختبارات الوحدة (يتم إنشاؤها تلقائيًا أيضًا) تقارن بها نتيجة كل عمل داخلي من المكتبة نتيجة عملها مع نتيجة تنفيذ تعليمات المجمّع المقابلة. كما يلائم اختبارات الوحدة ، معظم العمل كما هو متوقع. لكن بعض العلامات الداخلية لتصحيح الأخطاء بنقطة عائمة (دقة مزدوجة وفردية) لا تعمل دائمًا بنسبة 100٪ بشكل صحيح. أود أن أقول أنه في بعض الأحيان نوع من الرياضيات السريعة . وهناك آليات التقريب مختلفة! IEE754 لديه الكثير من التفاصيل الدقيقة ...

هناك ميزة أخرى مهمة تتمثل في استخدام debint immintrin بدلاً من SDE (لا أوافق عليه بأي حال ، لكن لا يمكنني إيقافه). إذا قمت بترجمة gcc أو clang مع الخيار ، على سبيل المثال ، march = nehalem ، فسترجع gcc و clang المتجهات 512 بت من الوظائف الموجودة في المكدس من الوظائف ، ولا يزال ICC يعيدها إلى ZMM0. لذلك لا يمكن استخدام برنامج التحويل البرمجي Intel في هذا الوضع. ويحتوي gcc على خيار مفيد -Og ، والذي يساعد في تصحيح الأخطاء ، بما في ذلك مع تصحيح أخطاء immintrin.

هناك العديد من العناصر الداخلية التي يتمثل عملها الرئيسي في تغيير محتويات السجل ، على سبيل المثال ، أو الأعلام. أنا لم تنفذ هذه التعليمات. حسنًا ، على الرغم من أن المحلل اللغوي الخاص بي ليس جاهزًا تمامًا ، فإن تطبيق حوالي 10٪ من العناصر الداخلية غير متاح بعد.

يعد استخدام تصحيح أخطاء imintrin أمرًا بسيطًا للغاية - لا تحتاج إلى تغيير المصدر ، ولكن يجب عليك إضافة التصنيف الشرطي لتضمين immintrin_dbg.h بدلاً من immintrin.h في حالة إنشاء تصحيح الأخطاء.

يمكنك تنزيله على جيثب .

Source: https://habr.com/ru/post/ar450964/


All Articles