C ++ كيفية كتابة التعليمات البرمجية يمكن أن يحسن المترجم بسهولة من أجل SIMD؟

StackOverflow https://stackoverflow.com/questions/4026703

  •  26-09-2019
  •  | 
  •  

سؤال

أنا أعمل في Visual Studio 2008 وفي إعدادات المشروع ، أرى خيار "تنشيط مجموعة التعليمات الموسعة" والذي يمكنني تعيينه على لا شيء أو SSE أو SSE2

لذلك سيحاول المترجم تعليمات معًا من أجل الاستفادة من تعليمات SIMD؟

هل هناك أي قواعد يمكن للمرء اتباعها في كيفية تحسين التعليمات البرمجية بحيث يمكن للمترجم أن يجعل مجمع EffieCient باستخدام هذه الامتدادات؟

على سبيل المثال ، أنا أعمل على Raytracer. يأخذ التظليل بعض المدخلات ويحسب من الإدخال لون الإخراج ، مثل هذا:

PixelData data = RayTracer::gatherPixelData(pixel.x, pixel.y);
Color col = shadePixel(data);

هل سيكون من المفيد على سبيل المثال كتابة ShaderCode بحيث تظل 4 وحدات مختلفة من البكسلات داخل مكالمة تعليمية واحدة؟ شيء من هذا القبيل:

PixelData data1 = RayTracer::gatherPixelData(pixel1.x, pixel1.y);
...
shadePixels(data1, data2, data3, data4, &col1out, &col2out, &col3out, &col4out);

لمعالجة العديد من DataUnits في وقت واحد. هل سيكون هذا مفيدًا لجعل المترجم يستخدم تعليمات SSE؟

شكرًا!

هل كانت مفيدة؟

المحلول

أنا أعمل في Visual Studio 2008 وفي إعدادات المشروع ، أرى خيار "تنشيط مجموعة التعليمات الموسعة" والذي يمكنني تعيينه على لا شيء أو SSE أو SSE2

لذلك سيحاول المترجم تعليمات معًا من أجل الاستفادة من تعليمات SIMD؟

لا ، لن يستخدم المترجم تعليمات المتجه من تلقاء نفسه. سوف تستخدم تعليمات SSE العددية بدلاً من X87.

ما تصفه يسمى "التقييم التلقائي". لا يقوم مجمعو Microsoft بذلك ، مجمعين إنتل فعل.

على برنامج التحويل البرمجي Microsoft يمكنك استخدامه الجوهارات لأداء تحسينات SSE اليدوية.

نصائح أخرى

ثلاث ملاحظات.

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

  2. بمجرد أن تحصل على خوارزمياتك الصحيحة ، حان الوقت معيار. في كثير من الأحيان هناك قاعدة 80/20 في العمل. 20 ٪ من الكود الخاص بك سوف يستغرق 80 ٪ من وقت التنفيذ. ولكن من أجل تحديد موقع هذا الجزء ، تحتاج إلى مفيدة جيدة. Intel Vtune يمكن أن يمنحك ملف تعريف أخذ العينات من كل وظيفة وتقارير لطيفة تحدد قتلة الأداء. بديل مجاني آخر هو AMD Codeanalyst إذا كان لديك وحدة المعالجة المركزية AMD.

  3. قدرة AutoVector Autovector على التحويل البرمجي ليست رصاصة فضية. على الرغم من أنه سيحاول بشدة (خاصة Intel C ++) ستحتاج غالبًا إلى مساعدتها عن طريق إعادة كتابة الخوارزميات في شكل متجه. يمكنك في كثير من الأحيان الحصول على نتائج أفضل بكثير عن طريق تصفيف أجزاء صغيرة من رمز عنق الزجاجة لاستخدام تعليمات SIMD. يمكنك القيام بذلك في رمز C (راجع رابط VJO أعلاه) باستخدام الجوهارات أو استخدام التجميع المضمّن.

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

المترجم ليس كله أقوياء ، ولديه بعض القيود. إذا كان بإمكانه (وإذا تم تمرير الأعلام الصحيحة إليها) ، فسيستخدم تعليمات SSE. الطريقة الوحيدة لمعرفة ما فعلته هي فحص رمز التجميع الذي تم إنشاؤه بواسطة المترجم.

خيار آخر هو استخدام تعليمات C SSE/SSE2. بالنسبة لنظام التشغيل Windows ، يمكنك العثور عليها هنا:

http://msdn.microsoft.com/en-us/library/y0dh78ez٪28vs.80٪29.aspx

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top