سؤال

أحتاج إلى تحسين بعض رمز C ، الذي يقوم بالكثير من حسابات الفيزياء ، باستخدام امتدادات SIMD على SPE لمعالج الخلية. يمكن لكل مشغل متجه معالجة 4 عوامات في نفس الوقت. من الناحية المثالية ، أتوقع تسريع 4x في الحالات الأكثر تفاؤلاً.

هل تعتقد أن استخدام مشغلي المتجهات يمكن أن يعطي سرعات أكبر؟

شكرًا

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

المحلول

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

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

نصائح أخرى

يمكن أن يعطي سرعات أفضل من 4 مرات على نقطة عائمة مستقيمة لأن تعليمات SIMD قد تكون أقل دقة (ليس بقدر ما يعطي الكثير من المشكلات) وبالتالي تأخذ دورات أقل لتنفيذها. يعتمد حقا.

أفضل خطة هي أن تتعلم الكثير عن المعالج الذي تقوم بتحسينه قدر الإمكان. قد تجد أنه يمكن أن يمنحك أفضل بكثير من تحسينات 4x. قد تجد أنك لا تستطيع. لا يمكننا القول على الرغم من عدم معرفة المزيد عن الخوارزمية التي تقوم بتحسينها وما هي وحدة المعالجة المركزية التي تستهدفها.

بمفردهم ، لا. ولكن إذا كانت عملية إعادة كتابة الخوارزميات الخاصة بك لدعمها تحدث أيضًا لتحسين ، على سبيل المثال ، محلية ذاكرة التخزين المؤقت أو السلوك المتفرعة ، فيمكنك العثور على سرعات غير ذات صلة. ومع ذلك ، هذا صحيح في أي إعادة كتابة ...

هذا ممكن تماما.

  • يمكنك القيام بمزيد من التحسينات الدقيقة على مستوى التعليمات الذكية أكثر من التحسينات المترجم ، إذا كنت تعرف ما تفعله.
  • تقدم معظم مجموعات تعليمات SIMD العديد من العمليات القوية التي لا تحتوي على أي معادلة في رمز FPU/ALU العادي العادي (مثل PAVG/PMIN وما إلى ذلك في SSE2). حتى لو كانت هذه لا تناسب مشكلتك بالضبط ، فيمكنك في كثير من الأحيان الجمع بين هذه التعليمات لتأثير كبير.
  • لست متأكدًا من الخلية ، ولكن تحتوي معظم مجموعات تعليمات SIMD على ميزات لتحسين الوصول إلى الذاكرة ، على سبيل المثال إلى البيانات المسبقة في ذاكرة التخزين المؤقت. لقد حصلت على نتائج جيدة جدًا مع هذه.

الآن هذا ليس خلية أو PPC على الإطلاق ، ولكن مرشح إتلاف الصور البسيط الخاص بي حصل على تسريع 20x (C مقابل SSE2) على الذرة ، وهو أعلى من مستوى التوازي (16 بكسل في وقت واحد).

يعتمد ذلك على الهندسة المعمارية .. في الوقت الحالي أفترض بنية X86 (AKA SSE).

يمكنك الحصول على عامل أربعة على حلقات ضيقة بسهولة. ما عليك سوى استبدال الرياضيات الحالية بتعليمات SSE وانتهيت.

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

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

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