C/C ++ استخدام ميزات وحدة المعالجة المركزية الخاصة

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

  •  27-09-2019
  •  | 
  •  

سؤال

أنا فضولي ، هل يستخدم المترجمون الجدد بعض الميزات الإضافية المدمجة في وحدات المعالجة المركزية الجديدة مثل MMX SSE ، 3DNOW! وهكذا؟

أعني ، في 8086 الأصلي ، لم يكن هناك حتى FPU ، لذا فإن برنامج التحويل البرمجي الذي لا يمكنه حتى استخدامه ، ولكن يمكن للمترجمين الجدد ، لأن FPU جزء من كل وحدة المعالجة المركزية الجديدة. إذن ، هل يستخدم المجمعون الجدد ميزات جديدة من وحدة المعالجة المركزية؟

أو ، يجب أن يكون أكثر صوابًا في السؤال ، هل تستخدم وظائف مكتبة C/C ++ الجديدة لميزات جديدة؟

شكرا للإجابة.

تعديل:

حسنًا ، لذلك ، إذا حصلت على جميعكم على صواب ، حتى بعض عمليات Standart ، خاصة مع أرقام التعويم يمكن القيام باستخدام SSE بشكل أسرع.

من أجل استخدامه ، يجب أن أمكّن هذه الميزة في برنامج التحويل البرمجي الخاص بي ، إذا كان يدعمها. إذا كان الأمر كذلك ، يجب أن أكون متأكدًا من أن النظام الأساسي المستهدف يدعم هذه الميزات.

في حالة وجود بعض مكتبات النظام التي تتطلب أداءً أعلى ، مثل OpenGL و DirectX وهكذا ، قد يتم دعم هذا الدعم في النظام.

بشكل افتراضي ، لأسباب التوافق ، لا يدعمه برنامج التحويل البرمجي ، ولكن يمكنك إضافة هذا الدعم باستخدام وظائف C الخاصة التي يتم تسليمها بواسطة Intel على سبيل المثال. يجب أن تكون هذه هي أفضل طريقة ، حيث يمكنك التحكم مباشرة في Wheather وعندما تستخدم ميزات خاصة للمنصة المطلوبة ، لكتابة تطبيقات دعم CPU.

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

المحلول

ستدعم GCC التعليمات الأحدث عبر وسيطات سطر الأوامر. نرى هنا لمزيد من المعلومات. يقتبس:

يمكن لـ GCC الاستفادة من الإرشادات الإضافية في امتدادات MMX و SSE و SSE2 و SSE3 و 3DNOW لمعالجات Intel و AMD الحديثة. تتيح الخيارات -mmmx ، -msse ، -msse2 ، -msse3 و -m3dnow استخدام هذه التعليمات الإضافية ، مما يسمح بمعالجة كلمات متعددة من البيانات بالتوازي. لن يتم تشغيل التنفيذيين الناتج فقط على المعالجات التي تدعم الامتدادات المناسبة-على أنظمة أخرى ستعطل بها خطأ تعليمي غير قانوني (أو ما شابه)

نصائح أخرى

هذه التعليمات ليست جزءًا من أي معايير ISO C/C ++. وهي متوفرة من خلال الآلات المترجمة, ، اعتمادا على المترجم المستخدم.

لمعرفة MSVC ، انظر http://msdn.microsoft.com/en-us/library/26td21ds(vs.80).aspx

بالنسبة لـ GCC ، يمكنك النظر إلى http://developer.apple.com/hardwaredrivers/ve/sse.html

AFAIK ، الجوهارات SSE هي نفسها بين GCC و MSVC.

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

ستحتاج إلى دراسة الوثائق التي جاءت مع المترجم الخاص بك.

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

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

إذا كنت تستخدم برنامج التحويل البرمجي Intel C ، وقمت بتعيين خيارات تحسين عالية بما فيه الكفاية ، فستجد أن بعض حلقاتك تحصل على "ناقلات" ، مما يعني أن المترجم أعاد كتابةها لاستخدام تعليمات على غرار SSE.

إذا كنت ترغب في استخدام عمليات SSE مباشرة ، فأنت تستخدم الجوهارات المحددة في ملف "Xmmintrin.h" ؛ قل

#تضمنu003Cxmmintrin.h>

__m128 u ، v ، w ؛ تعويم WW [4] ؛

v = _mm_set1_ps (1.5) ؛

u = _mm_set_ps (0،1،2،3) ؛

w = _mm_add_ps (u ، v) ؛

_mm_storeu_ps (ww ، w) ؛

سيستخدم المترجمون المتغيرون ميزات جديدة مختلفة. ستستخدم Visual Studio SSE/2 ، وأعتقد أن برنامج التحويل البرمجي Intel سيدعم أحدث ميزات وحدة المعالجة المركزية. بالطبع ، يجب أن تكون حذرًا بشأن اختراق السوق لميزةك المفضلة.
أما بالنسبة لما استخدام المكتبة القياسية المفضلة لديك ، فإن هذا يعتمد على ما تم تجميعه به. ومع ذلك ، يتم تجميع المكتبة القياسية C ++ عادةً في الموقع ، نظرًا لأنها محفوفة للغاية ، لذلك إذا قمت بتمكين SSE2 ، فيجب أن تستخدمه C ++ STD LIBS. أما بالنسبة إلى CRT ، يعتمد على ما تم تجميعه به.

هناك عمومًا طريقتان يمكن للمترجم إنشاء رمز يستخدم ميزات خاصة مثل هذه:

  1. عندما يتم تجميع المترجم نفسه ، تقوم بتكوينه لإنشاء رمز لعمارة معينة ، ويمكن أن يستفيد من أي ميزات تعرف أن البنية ستحصل عليها. على سبيل المثال ، إذا gcc يتم تكوينه لمعالج Intel جديد بما فيه الكفاية (أم أنه "ليس قديمًا بما فيه الكفاية"؟) لاحتواء FPU متكامل ، فإنه سيولد تعليمات النقطة العائمة.
  2. عندما يتم استدعاء المترجم ، يمكن للأعلام أو المعلمات تحديد نوع الميزات المتاحة للمعالج الذي سيقوم بتشغيل البرنامج ، ثم يعرف المترجم أنه آمن لاستخدام هذه الميزات. إذا لم تكن الأعلام موجودة ، فسيقوم بإنشاء رمز مكافئ دون استخدام الإرشادات الخاصة التي توفرها تلك الميزات.

إذا كنت تتحدث عن التعليمات البرمجية المكتوبة في C/C ++ ، فسيتم شرح الميزات الجديدة إذا أخبرت المترجم الخاص بك القيام بذلك. بشكل افتراضي ، ربما يستهدف المترجم الخاص بك "Plain x86" (بشكل طبيعي مع FPU :)) ، وعادة ما يتم تحسينه لتوليد المعالج الأكثر انتشارًا في الوقت الحالي ، لكنه لا يزال قادرًا على التشغيل على المعالجات القديمة.

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

لاحظ أنه لا يمكن استغلال العديد من ميزات مجموعات التعليمات الجديدة مباشرة في الكود "العادي" ، لذلك عادة ما يتم تزويدك بأوان برمجيات البرمجيات للعمل على أنواع البيانات المحددة الأصلية لمجموعات التعليمات الجديدة.

يوفر Intel رمز مثال CPUID محدث في كل مرة تقوم فيها بإصدار وحدة المعالجة المركزية الجديدة حتى تتمكن من التحقق من الميزات الجديدة وكانت طالما أتذكر. على الأقل هذا هو ما وجدته في المرة الأولى التي فكرت فيها في هذا السؤال نفسه بنفسي.

باستخدام CPUID للكشف عن وجود مجموعات تعليم SSE 4.1 و SSE 4.2

عند إصدار المترجمين الجدد ، يضيفون الميزات الجديدة مباشرة مثل VS2010 على سبيل المثال.Visual C ++ Code Generation في Visual Studio 2010

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