مجموعات تعليمات جديدة في وحدة المعالجة المركزية

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

  •  22-09-2019
  •  | 
  •  

سؤال

يقدم كل جيل جديد من وحدة المعالجة المركزية بعض مجموعات التعليمات الجديدة ، أي MMX و 3DNOW و SSE وما إلى ذلك.

لدي القليل من الأسئلة العامة عنهم:

  1. إذا كانت بعض البرامج تستخدم على سبيل المثال ، فهل يمكن تشغيل تعليمات SSE على وحدة المعالجة المركزية التي لا تدعم SSE؟
  2. إذا كانت الإجابة بنعم ، هل يعني ذلك أنه سيتم تغيير هذه التعليمات إلى عدد أكبر من الإرشادات الأكثر بساطة؟
  3. إذا لم يكن الأمر كذلك ، فهل هذا يعني أن تأثير الأداء الحقيقي لهذه التعليمات الجديدة سيكون بعد سنوات قليلة عندما تدعم معظم وحدة المعالجة المركزية هذه التكنولوجيا (لذلك لن يكون هناك أي حالات عدم توافق)؟
  4. عندما أقوم بتجميع برنامج C ++ مع تحسينات ، فهذا يعني أنه سيستخدم بعض هذه التعليمات الجديدة؟ (أعلم أن ذلك يعتمد على العديد من العوامل ، وخاصة على الكود ، لكنني أريد إجابة عامة). أم أنها مخصصة في الغالب للبرامج المكتوبة في ASM؟
هل كانت مفيدة؟

المحلول

1) نعم ولا: ستعتبر وحدة المعالجة المركزية غير صالحة ، ولكن إذا كان البرنامج يتحقق مما إذا كانت وحدة المعالجة المركزية تدعم تلك التعليمات ، فيمكن أن تتوقف إلى إصدار لا يستخدم هذه التعليمات ، مما يسمح بتشغيل البرنامج على أي حال.

2) سيتعين على البرنامج توفير تطبيق بديل باستخدام التعليمات "الأساسية" ، ومعرفة متى يجب استخدام أي واحد.

3) نظرًا لأن البرنامج يمكنه التحقق من وحدة المعالجة المركزية ، يمكن أن تكون الفوائد متاحة في الوقت الحالي ، ولكن بالطبع ، إذا كان المستخدمون يستخدمون وحدة المعالجة المركزية التي لا تدعم هذه التعليمات ، فلن يروا أي فائدة.

4) سيعتمد هذا بالكامل على المترجم والمحسّن. يمكن اعتبار بعض مجموعات التعليمات قديمة بما يكفي بحيث يستخدمها المترجم دائمًا ما لم تخبرها بعدم ذلك ، بينما سيكون الآخر عكس ذلك: عليك أن تخبر المترجم باستخدامها. سواء أكان ذلك سيؤدي إلى إنشاء عوامل احتياطية تلقائيًا ، فسوف يعتمد أيضًا على المترجم.

نصائح أخرى

لتوضيح إجابة Michael Madsen للسؤال 4 ، تتخلف GCC الافتراضي لإنشاء رمز لمعالج I386. يوفر علامة تسمى -march (المعروف أيضا باسم -mcpu) التي تحدد أنواع التعليمات التي ينبعثها المترجم. Microsoft cl.exe يوفر /arch: و /Gx أعلام لنفس الغرض.

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

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

لا يمكن تنفيذ تعليمات جديدة تحتوي على تعليمات جديدة إلا على وحدة المعالجة المركزية التي تدعم هذه التعليمات الجديدة. يمكنك تكوين برنامج التحويل البرمجي لتجميع وحدة المعالجة المركزية المحددة.

كان MMX موجودًا منذ عام 1996 ، وخرج SSE في عام 1999 ، وظهرت SSE2 لأول مرة مع Pentium 4 في عام 2001. أعتقد أنه من الآمن افتراض أن أي وحدة المعالجة المركزية التي ستستخدمها لديها MMX و SSE ، وربما SSE2. 3dnow أعتقد أنه AMD فقط ، لذلك لا تتوقع أن تكون هذه التعليمات متاحة.

  1. إذا كانت بعض البرامج تستخدم على سبيل المثال ، فهل يمكن تشغيل تعليمات SSE على وحدة المعالجة المركزية التي لا تدعم SSE؟

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

على سبيل المثال منذ زمن طويل ، غالبًا ما تحتوي البرامج على رمز لـ x87. في حالة وجود المعالج المشترك x87 ، سيتم تشغيل التعليمات بشكل طبيعي في الأجهزة ، ولكن إذا كان الكمبيوتر يفتقر إلى المعالج المشترك x87 ، فسيقوم بإنشاء فخ ، وبعد ذلك ستتم معالجة التعليمات في البرمجيات ونتائج الإرجاع كالمعتاد. نرى ما هو بروتوكول محاكاة نقطة عائمة x87 في MS-DOS؟

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

  1. إذا لم يكن الأمر كذلك ، فهل هذا يعني أن تأثير الأداء الحقيقي لهذه التعليمات الجديدة سيكون بعد سنوات قليلة عندما تدعم معظم وحدة المعالجة المركزية هذه التكنولوجيا (لذلك لن يكون هناك أي حالات عدم توافق)؟

نعم. ولكن بعد بضع سنوات ، ربما تحتاج البرامج إلى تحديثات ، أليس كذلك؟ بالنسبة لبرنامج الأداء الحاسم ، قد تكون هناك حاجة إلى إعادة كتابة للاستفادة من مجموعة التعليمات الجديدة. بالنسبة لبعض الآخرين ، قد لا تكون الزيادة في الأداء ملحوظًا

  1. عندما أقوم بتجميع برنامج C ++ مع تحسينات ، فهذا يعني أنه سيستخدم بعض هذه التعليمات الجديدة؟ (أعلم أن ذلك يعتمد على العديد من العوامل ، وخاصة على الكود ، لكنني أريد إجابة عامة) أم أنها مخصصة في الغالب للبرامج المكتوبة في ASM؟

يعتمد على المترجم والخيارات التي تنقلها إليها في وقت الترجمة.

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

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

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