ما هو الحد الأقصى للسرعة النظرية بسبب SSE للحصول على الطرح الثنائي بسيط؟

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

سؤال

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

إذا كان لدي التعليمات البرمجية التالية:

float px[32768],py[32768],pz[32768];
float xref, yref, zref, deltax, deltay, deltaz;

initialize_with_random(px);
initialize_with_random(py);
initialize_with_random(pz);

for(i=0;i<32768-1;i++) {
  xref=px[i];
  yref=py[i];
  zref=pz[i];
  for(j=0;j<32768-1;j++ {
    deltx=xref-px[j];
    delty=yref-py[j];
    deltz=zref-pz[j];
  } }

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

الآن أرى سرعة تصل إلى 3x مع التعليمات البرمجية الخاصة بي، عندما كنت أعتقد أن SSE من شأنها أن تعطيني عمق ناقلات أكثر مما يشير إلى السرعة 3x لأعلى (يفترض أن سرعة 3x يخبرني أن لدي أقصى قدر من النظرية 4x الإنتاجية). (لقد جربت أشياء مثل السماح لتخصص DELTX / DELTY / DELTZ في حالة عدم وجود برنامج التحويل البرمجي ذكيا بما يكفي للترقية التلقائي، لكن ما زلت أرى سرعة 3x فقط.) أنا أستخدم مترجم Intel C مع أعلام المحول البرمجي المناسبة من أجل Vectorization، ولكن لا توجد جوهري.

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

المحلول

ذلك يعتمد على وحدة المعالجة المركزية. لكن ماكس النظرية لن تحصل فوق 4x. لا أعرف من وحدة المعالجة المركزية التي يمكن أن تنفذ أكثر من تعليمات SSE لكل دورة على مدار الساعة، مما يعني أنه يمكن في الغالب حساب 4 قيم لكل دورة.

معظم وحدة المعالجة المركزية يمكن أن تفعل على الأقل إحدى التعليمات العددية التعددية لكل دورة، لذلك في هذه الحالة، ترى كحد أقصى حد أقصى لمساعدة 4X.

ولكن عليك أن تبحث عن إنتاج التعليمات المحددة لمعهد وحدة المعالجة المركزية التي تعمل عليها.

السرعة العملية 3x جيدة جدا.

نصائح أخرى

أعتقد أنك ربما تضطر إلى تدوير الحلقة الداخلية بطريقة أو بأخرى. يتجول ناقل مكونات المكونات في وقت واحد، ولكن هذا فقط 3 عمليات في وقت واحد. للوصول إلى 4، كنت تفعل 3 مكونات من المتجه الأول، و 1 من التالي، ثم 2 و 2، وهلم جرا. إذا قمت بإنشاء نوع من قائمة الانتظار التي يتم تحميلها ويعالج مكونات البيانات 4 في كل مرة، فافصلها بعد ذلك، والتي قد تعمل.

تحرير: يمكنك إلغاء الحلقة الداخلية للقيام 4 ناقلات لكل التكرار (على افتراض أن حجم الصفيف هو دائما مضاعف 4). من شأنه أن ينجز ما قلته أعلاه.

النظر في: ما مدى تعويم الواسع؟ ما مدى وصول تعليمات SSEX؟ يجب أن تعطيك النسبة نوعا من الحدود العليا المعقولة.

تجدر الإشارة أيضا إلى أن الأنابيب خارج الترتيب تلعب Havok مع الحصول على تقديرات جيدة للسرعة.

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

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