تحديثات الخلفية لـ MSVC في Visual Studio 2019 معاينة 2: تحسينات جديدة و OpenMP وتحسين بناء الإنتاجية


في Visual Studio 2019 Preview 2 ، واصلنا تحسين الواجهة الخلفية لـ C ++ من خلال ميزات جديدة وتحسينات جديدة ومحسّنة وبناء تحسينات في الإنتاجية وتغيير جودة الحياة.


الأصل في بلوق

ميزات جديدة


  • إضافة رمز تبديل مضمّن جديد لسطر الأوامر: -Ob3. -Ob3 هو إصدار أكثر عدوانية من -Ob2. -O2 (تحسين الثنائي للسرعة) لا يزال يعني -Ob2 بشكل افتراضي ، ولكن هذا قد يتغير في المستقبل. إذا وجدت أن برنامج التحويل البرمجي قيد التحويل ، فكر في اجتياز -O2 -Ob3.
  • إضافة دعم أساسي لبرنامج OpenMP SIMD vectorization الذي يعد أكثر ميزات OpenMP استخدامًا في مكتبات التعلم الآلي (ML). دراسة الحالة لدينا هي مكتبة Intel MKL-DNN ، والتي تُستخدم ككتلة بناء للمكتبات الأخرى المعروفة ذات المصدر المفتوح ، بما في ذلك Tensor Flow. يمكن تشغيل هذا باستخدام مفتاح CL جديد -openmp: تجريبي. يسمح هذا بتدوين الحلقات الموضحة بـ "pragma omp simd". لا يمكن ضمان الاتجاه ، وسيتم توضيح تحذير للحلقات الموضحة ولكنها غير موجهة. لا توجد عبارات SIMD مدعومة ، سيتم تجاهلها ببساطة مع الإبلاغ عنها.
  • تمت إضافة معالج استثناء C ++ جديد __CxxFrameHandler4 مما يقلل من معالجة البيانات الوصفية بنسبة 66٪. يوفر ذلك ما يصل إلى 15٪ من إجمالي تحسين الحجم الثنائي على الثنائيات التي تستخدم كميات كبيرة من معالجة استثناء C ++. إيقاف التشغيل الافتراضي حاليًا ، جربه بتمرير "/ d2FH4" عند التحويل البرمجي باستخدام cl.exe. لاحظ أن / d2FH4 غير موثقة وغير معتمدة على المدى الطويل. هذا غير معتمد حاليًا على تطبيقات UWP نظرًا لأن وقت تشغيل UWP لا يحتوي على هذه الميزة حتى الآن.
  • لدعم الاتجاه اليدوي للحلقات التي تحتوي على استدعاءات لوظائف مكتبة الرياضيات وبعض العمليات الأخرى مثل عدد صحيح ، تدعم MSVC الآن الدوال الجوهرية لـ Vector Vector Math Library (SVML) التي تحسب مكافئات المتجه. يتوفر دعم لمتجهات 128 بت و 256 بت و 512 بت لمعظم الوظائف ، فيما عدا الاستثناءات المذكورة أدناه. لاحظ أن هذه الوظائف لا تقم بتعيين errno. انظر دليل Intel Intrinsic Guide للحصول على تعريفات للوظائف المدعومة.
    الاستثناءات تشمل:
    • يتوفر تقسيم عدد صحيح متجه و الباقي فقط لعناصر 32 بت و أطوال متجه 128 بت و 256 بت. استخدم تقسيم منفصل ووظائف الباقي لأحجام العناصر الأخرى وأطوال المتجهات.
    • يتوفر SVML square-root فقط في أطوال متجه 128 بت و 256 بت. يمكنك استخدام وظائف _mm512_sqrt_pd أو _mm512_sqrt_ps لمتجهات 512 بت.
    • تتوفر فقط إصدارات متجه 512 بت من وظائف rint و nearbyint . في كثير من الحالات ، يمكنك استخدام الدالات المستديرة بدلاً من ذلك ، على سبيل المثال استخدام _mm256_round_ps (x ، _MM_FROUND_CUR_DIRECTION) كإصدار متجه 256 بت من rint ، أو _mm256_round_ps (x ، _MM_FROUND_TO_NEAREST_INT)
    • يتم توفير فقط 512 بت متبادل. يمكنك حساب المكافئ باستخدام دالات set1 و div ، على سبيل المثال ، يمكن حساب المعامل المتبادل 256 بت كـ _mm256_div_ps (_mm256_set1_ps (1.0f) ، (x)) .
    • هناك وظائف SVML لجذر التربيع المعقدة أحادية الدقة ، اللوغاريتم والتسوية فقط بطول متجه 128 بت و 256 بت.

تحسينات جديدة ومحسنة


  • الآن ، ستستخدم الميمسات غير المنضمة وتهيئات الحظر تعليمات SSE2 (أو تعليمات AVX إذا كان ذلك مسموحًا به). زادت عتبة الحجم لما سيتم إزالته وفقًا لذلك (التحويل البرمجي للحجم باستخدام SSE2: تنتقل عتبة unrolling من 31 إلى 63 بايت ، وتجميع للسرعة باستخدام SSE2: العتبة تتحرك من 79 إلى 159 بايت).
  • تحسين الكود العام للمجموعات الصغيرة ، التي تستهدف في المقام الأول الوظائف المحمية .
  • إدخال تحسينات على التخلص من المحلات الزائدة في محسّن SSA : تحسين تحليل الهروب والتعامل مع الحلقات
  • يتعرف المحول البرمجي على memmove () كدالة مضمّنة ويحسنها وفقًا لذلك. يعمل ذلك على تحسين إنشاء التعليمات البرمجية للعمليات المبنية على memmove () بما في ذلك std :: copy () وغيرها من رموز مكتبة المستوى الأعلى مثل std :: vector و std :: string construction
  • يقوم المُحسِّن بعمل أفضل لتحسين عمليات memmove () قصيرة وطويلة و memcpy () و memcmp ().
  • تطبيق تحسين ازدواجية المحول لتنفيذ أفضل للمفاتيح داخل الحلقات الساخنة. قمنا بتكرار قفزات المفتاح للمساعدة في تحسين دقة التنبؤ بالفرع وبالتالي أداء وقت التشغيل.
  • إضافة تبسيط ثابت قابل للطي وحساب للتعبيرات باستخدام SIMD (ناقل) جوهري ، لكل من الأشكال العائمة والأعداد الصحيحة. تتعامل معظم تحسينات التعبير المعتادة الآن مع مضامين SSE2 و AVX2 ، إما من رمز المستخدم أو نتيجة ناقل تلقائي.
  • يتم تحديد عدة أنماط جديدة متعددة الإضافات (FMA) تنصهر بها عددي مع / arch: AVX2 / fp: fast. تتضمن هذه التعبيرات الشائعة التالية: (x + 1.0) * y; (x – 1.0) * y; (1.0 – x) * y; (-1.0 – x) * y (x + 1.0) * y; (x – 1.0) * y; (1.0 – x) * y; (-1.0 – x) * y
  • يتم تحديد تسلسل الكود الذي يقوم بتهيئة قيمة عنصر (SIM) __m128 SIMD (عنصر متجه) واستبداله بجوهر _mm_set_ps . يتيح ذلك لتحسينات SIMD الجديدة مراعاة القيمة كجزء من التعبيرات ، خاصة إذا كانت القيمة تحتوي على عناصر ثابتة فقط. سوف يدعم التحديث في المستقبل المزيد من أنواع القيم.
  • يعد حذف التعبير الفرعي الشائع (CSE) أكثر فاعلية في وجود المتغيرات التي يمكن تعديلها بطرق غير مباشرة لأن عناوينها مأخوذة.
  • تتم إزالة نُسخ البنية / الفئة عديمة الفائدة في العديد من الحالات الأخرى ، بما في ذلك النسخ إلى معلمات الإخراج والوظائف التي تعيد كائنًا. هذا التحسين فعال بشكل خاص في برامج C ++ التي تمرر الكائنات حسب القيمة.
  • تمت إضافة تحليل أكثر قوة لاستخراج معلومات حول المتغيرات من تدفق التحكم (if / else / switch switch) ، يُستخدم لإزالة الفروع التي يمكن إثبات أنها صحيحة أو خاطئة دائمًا ولتحسين تقدير النطاق المتغير. ترى الشفرة التي تستخدم gsl :: span تحسينات ، حيث يتم الآن إزالة بعض عمليات التحقق من النطاق.
  • ستتوفر الآن التحسينات الافتراضية لتحسين فرص العمل ، كما هو الحال عندما يتم تعريف الفئات في مساحات أسماء مجهولة.

بناء تحسينات الإنتاجية


  • قم بتصفية معلومات تصحيح الأخطاء أثناء التحويل البرمجي استنادًا إلى الرموز والأنواع المشار إليها لتقليل حجم قسم تصحيح الأخطاء وتحسين سرعة رابط الربط. يمكن أن يؤدي التحديث من 15.9 إلى 16.0 إلى تقليل حجم الإدخال للرابط بنسبة تصل إلى 40٪.
  • ربط وقت التحسينات في نوع PDB دمج وإنشاء.
  • يمكن أن يؤدي التحديث إلى 16.0 من 15.9 إلى تحسين أوقات الارتباط بنسبة تصل إلى 2X. على سبيل المثال ، أدى ربط Chrome إلى تسريع وقت الارتباط 1.75X عند استخدام / DEBUG: ممتلئ ، ووقت تسريع وقت الارتباط 1.4X عند استخدام / DEBUG: fastlink.

تحسينات نوعية الحياة


  • يعرض المترجم أسماء الملفات والمسارات باستخدام غلاف يوفره المستخدم حيث سبق للمعرض عرض أسماء الملفات والمسارات ذات الغلاف السفلي.
  • سيقوم الرابط الجديد الآن بالإبلاغ عن الرموز (الرموز) التي يُحتمل مطابقتها للرموز التي لم يتم حلها ، مثل:

 main.obj : error LNK2019: unresolved external symbol _foo referenced in function _main Hint on symbols that are defined and could potentially match: "int __cdecl foo(int)" (?foo@@YAHH@Z) "bool __cdecl foo(double)" (?foo@@YA_NN@Z) @foo@0 foo@@4 main.exe : fatal error LNK1120: 1 unresolved externals 
  • عند إنشاء مكتبة ثابتة ، لم تعد هناك حاجة لتمرير علامة / LTCG إلى LIB.exe.
  • تمت إضافة خيار رابط / LINKREPROTARGET: [binary_name] لإنشاء نسخة متماثلة فقط للثنائي المحدد. يتيح هذا٪ LINK_REPRO٪ أو / LINKREPRO: [directory_name] يتم تعيينها في بنية كبيرة مع روابط متعددة ، وسوف يولد الرابط فقط النسخ للثنائي المحدد في / linkreprotarget.

يسعدنا تنزيل Visual Studio 2019 وتجربته . كما هو الحال دائمًا ، نرحب بتعليقاتك. يمكن الوصول إلينا عبر التعليقات أدناه أو عبر البريد الإلكتروني ( visualcpp@microsoft.com ). إذا واجهت مشاكل في Visual Studio أو MSVC ، أو كان لديك اقتراح بالنسبة لنا ، فيرجى إخبارنا من خلال المساعدة> إرسال الملاحظات> الإبلاغ عن مشكلة / تقديم اقتراح في المنتج ، أو عبر مجتمع مطوري البرامج . يمكنك أن تجدنا أيضًا على Twitter ( VisualC ) و Facebook (msftvisualcpp).

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


All Articles