سؤال

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

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

المحلول

وأنا لم أرى الحلقات إما دول مجلس التعاون الخليجي أو إنتل C ++ تلقائيا vectorize أي شيء ولكن بسيطة جدا، حتى عندما تعطى رمز من الخوارزميات التي يمكن (وكان، بعد أن يدويا أعاد لهم باستخدام intrinsics SSE) أن vectorized.

وجزء من هذا يجري المحافظ - خصوصا عندما تواجه مع الممكن التعرج المؤشر، يمكن أن يكون من الصعب جدا على C مترجم / C ++ إلى "إثبات" على نفسها أن كمية موجهة ستكون آمنة، حتى لو كنت كما مبرمج نعلم أن أنه. معظم المجمعين (معقولة) يفضلون عدم تحسين التعليمات البرمجية بدلا من المخاطرة miscompiling ذلك. هذا هو أحد المجالات التي لها لغات المستوى العالي ميزة حقيقية على C، على الأقل من الناحية النظرية (وأقول نظريا لأنني لست على علم بأي كمية موجهة تلقائيا ML أو هاسكل المجمعين في الواقع).

وجزء آخر منه هو القيود ببساطة التحليلية - معظم الأبحاث في كمية موجهة، وأنا أفهم، ويرتبط إلى تحسين مشاكل العددية الكلاسيكية (ديناميكا الموائع، ويقول) الذي كان الخبز والزبدة من معظم الآلات ناقلات قبل قبل بضع سنوات (عندما بين CUDA / OpenCL، Altivec / SSE، وخلية STI، أصبحت البرمجة ناقلات في أشكال مختلفة على نطاق واسع في الأنظمة التجارية).

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

نصائح أخرى

ومن الصعب استخدامها في أي منطق الأعمال، ولكنه يعطي شكا من السرعة عند تجهيز كميات من البيانات في نفس الطريق.

والمثال الجيد هو معالجة الصوت / الفيديو حيث يمكنك تطبيق نفس العملية على كل عينة / بكسل. ولقد استخدمت VisualDSP لهذا، وكان لديك للتحقق من النتائج بعد تجميع - إذا تم استخدامه حقا حيث ينبغي

وكمية موجهة سيكون مفيدا في المقام الأول لبرامج العددية. ويمكن لبرامج Vectorized تشغيل أسرع على ناقلات المعالجات مثل معالج الخلية STI المستخدمة في أجهزة PS3 الألعاب. هناك، استخدمت الحسابات العددية، على سبيل المثال، مما يجعل رسومات اللعبة يمكن تسريع الكثير من خلال كمية موجهة. وتسمى هذه المعالجات SIMD (واحدة تعليمات متعددة البيانات) المعالجات.

في المعالجات الأخرى كمية موجهة لن تستخدم. تشغيل البرامج Vectorized على مجموعة التعليمات vectorized التي لن تكون قابلة للتطبيق على معالج غير SIMD.

ونيهالم سلسلة إنتل للمعالجات (صدر أواخر عام 2008) تنفيذ SSE 4.2 تعليمات، والتي هي تعليمات SIMD. المصدر: ويكيبيديا

.

وتعليمات Vectorized لا تقتصر على معالجات الخليوي - محطات العمل تشبه أحدث CPU يكون لهم (PPC، إلى x86 منذ بنتيوم 3، سبارك، الخ ...). عندما تستخدم بشكل جيد لالعائمة عمليات نقطة، يمكن أن يساعد الكثير جدا لحساب جدا المهام مكثفة (الفلاتر، الخ ...). في تجربتي، وكمية موجهة التلقائي لا يعمل بشكل جيد.

ربما لاحظتم أنه لا أحد تقريبًا يعرف كيفية الاستفادة من تقنية التوجيه التلقائي لدول مجلس التعاون الخليجي.إذا كنت تبحث في جميع أنحاء الويب لرؤية تعليقات الأشخاص، فدائما ما يصل إلى فكرة أن دول مجلس التعاون الخليجي تسمح لك بتمكين التوجيه التلقائي، ولكنها نادرا ما تستخدمها فعليا، وهكذا إذا كنت تريد استخدام تسريع SIMD (على سبيل المثال:MMX، وSSE، وAVX، وNEON، وAltiVec)، فسيتعين عليك بشكل أساسي معرفة كيفية كتابتها باستخدام جوهر المترجم أو كود لغة التجميع.

لكن مشكلة intrinsics هي أنك تحتاج فعليًا إلى فهم جانب لغة التجميع ومن ثم تعلم أيضًا طريقة Intrinsics لوصف ما تريده، والذي من المحتمل أن يؤدي إلى تعليمات برمجية أقل كفاءة بكثير مما لو كتبته في رمز التجميع ( مثلاً بعامل 10x)، لأن المترجم سيظل يواجه مشكلة في الاستفادة الجيدة من تعليماتك الجوهرية!

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

لذلك في الأساس:

  • إذا كنت تريد ما يصل إلى 100 ٪ من السرعة (سرعة 2x) ، فماون إما شراء مجمعات Intel/ARM الرسمية أو تحويل بعض التعليمات البرمجية الخاصة بك لاستخدام الجوهرية SIMD C/C ++.
  • إذا كنت تريد 1000 ٪ من السرعة (سرعة 10x) ، فاكتبها في رمز التجميع باستخدام تعليمات SIMD باليد.أو إذا كان ذلك متاحًا على أجهزتك، فاستخدم تسريع GPU بدلاً من ذلك مثل OpenCL أو CUDA SDK من Nvidia، حيث يمكنهم توفير عمليات تسريع مماثلة في وحدة معالجة الرسومات كما تفعل SIMD في وحدة المعالجة المركزية.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top