سؤال

أنا أستخدم ملحقات SSE المتاحة في معالج Core2Duo (برنامج التحويل البرمجي GCC 4.4.1). أرى أن هناك 16 سجلًا متاحًا يبلغ طول كل منها 128 بت. الآن ، يمكنني استيعاب 4 قيم عدد صحيح في سجل واحد ، و 4 في سجل آخر واستخدام الجوهارات يمكنني إضافتها في تعليمات واحدة. الميزة الواضحة هي هذه الطريقة التي أتطلب بها تعليمات واحدة فقط بدلاً من 4.

سؤالي هو "هل هذا كل شيء لـ SIMD؟". دعني أحصل على A1 و A2 و A3 و A4 و A5 و A6 و A7 و A8 و B1 و B2 و B3 و B4 و B5 و B6 و B7 و B8. دع A1 ، A2 هي سجلات المتجهات. الآن ، A1 <<< (A1 ، A2 ، A3 ، A4) و B1 <<< (B1 ، B2 ، B3 ، B4) ، وإضافة (A1 ، B1) ستقوم بإضافة المتجه.

دع A2 <<< (A5 ، A6 ، A7 ، A8) ، B2 <<< (B5 ، B6 ، B7 ، B8). هل هناك تعليمة إضافة يمكنها القيام (A1 ، B1) وإضافة (A2 ، B2) في وقت واحد.

كم عدد الوحدات الوظيفية المتجهات المتوفرة في Core2Duo وأين يمكنني الحصول على هذه المعلومات؟

أي مصدر آخر للمعلومات المتعلقة بها هو موضع تقدير كبير.

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

المحلول

  • لا ، لا يوجد أي تعليمات SSE واحدة للقيام بذلك. تحتاج إلى إصدار تعليمين. هل تفكر في شيء مثل تعليمات سلسلة X86 وبادئة Rep؟ ليس هناك ما يعادل SSE.

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

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

  • تحتوي بعض وحدات المعالجة المركزية على وحدة ناقلات واحدة لكل قلب ، وبعضها يحتوي على 1/2 فقط! في الحالة الأخيرة ، تكون وحدة المتجه بعرض 64 بت فقط وتنفيذ نصف تعليمات SSE فقط في وقت واحد. انت تحصل على ما تدفع ثمنه.

  • يجب أن تبحث في AVX ، تمديد مجموعة التعليمات الجديدة التي تطور SSE لدعم وحدات متجه أوسع.

  • أو يمكنك النظر في برمجة ناقلات حقيقية على وحدة معالجة الرسومات مع OpenCl أو CUDA.

نصائح أخرى

لا أعتقد أن هناك تعليمات واحدة للقيام بذلك (ما لم يتسللوا إلى نسخة حديثة من SSE).

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

begin C1 = A1 + B1
begin C2 = A2 + B2
wait
end C1 = A1 + B1
end C2 = A2 + B2

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

إليك شرح أكثر تفصيلاً لأنابيب: http://en.wikipedia.org/wiki/instruction_pipeline

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

يحتوي موقع Intel على جميع المعلومات التي ستحتاجها!

http://www.intel.com/products/processor/manuals/

تحرير رداً على التعليق: جميع المعلومات موجودة في الروابط المرتبطة أعلاه ولكن لا. يمكنك حزم الأعداد الصحيحة ذات 16 بت في سجل واحد ، وبالتالي أداء 8 إضافات متزامنة ولكن لا يوجد SSE لا تسمح بإضافة سجلين في وقت واحد.

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