سؤال

الرمز الذي أتعامل معه يحتوي على حلقات مثل ما يلي:

bistar = zeros(numdims,numcases); 
parfor hh=1:nt       
  bistar = bistar +  A(:,:,hh)*data(:,:,hh+1)' ;
end   

ل NT صغير (10).

بعد توقيته ، هو في الواقع 100 مرة أبطأ من استخدام الحلقة العادية !!! أعلم أن Parfor يمكنه القيام بمبالغ متوازية ، لذلك لست متأكدًا من سبب عدم عمل هذا.

انا اجري

matlabpool

مع التكوينات خارج الصندوق قبل تشغيل الكود الخاص بي.

أنا جديد نسبيًا على Matlab ، وبدأت للتو في استخدام الميزات الموازية ، لذا من فضلك لا تفترض أنني لا أفعل شيئًا غبيًا.

شكرًا!

ملاحظة: أنا أقوم بتشغيل الكود على نواة رباعية ، لذا أتوقع رؤية بعض التحسينات.

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

المحلول

إن جعل التقسيم وتجميع النتائج (النفقات العامة في تقسيم العمل وجمع النتائج من العديد من المواضيع/النوى) عالية بالنسبة للقيم الصغيرة من nt. هذا أمر طبيعي ، فلن تقوم بتقسيم البيانات لمهام سهلة يمكن تنفيذها بسرعة في حلقة بسيطة.

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

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

البيان الكامل في المساعدة (شكرًا على رابطك أدناه) هو:

إذا كان الوقت لحساب F و G و H كبيرًا, ، سيكون Parfor أسرع بكثير من المقابلة للبيان ، حتى لو كان N صغيرًا نسبيًا.

لذلك ترى أنها تعني تمامًا مثل ما أقصده ، فإن النفقات العامة لقيم N الصغيرة لا تستحق سوى الجهد إذا كان ما تفعله في الحلقة معقدًا/يستغرق وقتًا طويلاً بما فيه الكفاية.

نصائح أخرى

Parforيأتي مع القليل من النفقات العامة. وهكذا ، إذا nt صغير حقًا ، وإذا تم إجراء الحساب في الحلقة بسرعة كبيرة (مثل الإضافة) ، parfor الحل أبطأ. علاوة على ذلك ، إذا قمت بتشغيل parforعلى رباعي النواة ، سيكون زيادة السرعة قريبة من الخطي من 1-3 نوى ، ولكن أقل إذا كنت تستخدم 4 نوى ، لأن آخر جوهر يحتاج أيضًا إلى تشغيل عمليات النظام.

على سبيل المثال ، إذا كان PARFOR يأتي مع 100 مللي ثانية من النفقات العامة ، والحساب في الحلقة يستغرق 5 مللي ثانية ، وإذا افترضنا أن زيادة السرعة هي خطي يصل إلى 4 نوى مع معامل 1 (أي باستخدام 4 نوى يجعل الحساب 4 مرات) ب nt يجب أن يكون حوالي 30 لك لتحقيق مكسب السرعة مع parfor (150ms مع for, ، 132ms مع parfor). إذا كنت تريد تشغيل 10 تكرارات فقط ، parfor سيكون أبطأ (50 مللي ثانية مع for, ، 112ms مع parfor).

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

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

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