2012-03-30 3 views
5

मैं matlab में पाश parfor एक लंबी चलने के साथ काम कर रहा हूँ।मैटलैब समानांतर कंप्यूटिंग टूलबॉक्स, parfor में काम के गतिशील आवंटन लूप

parfor iter=1:1000 
    chunk_of_work(iter); 
end 

आम तौर पर रन प्रति 2-3 समय बाहरी कारकों के कारण कर रहे हैं। ऐसा लगता है कि काम के हर 1000 हिस्सों के लिए 2-3 होते हैं जो बाकी की तुलना में लगभग 100 गुना अधिक समय लेते हैं। चूंकि लूप पूरा होने के करीब है, श्रमिकों ने मूल्यांकन करने वाले श्रमिकों को जारी रखा है जबकि शेष श्रमिकों के पास कोई कम्प्यूटेशनल लोड नहीं है।

यह parfor पाश स्थिर काम वितरण के अनुरूप है। यह समानांतर कंप्यूटिंग टूलबॉक्स found here के लिए प्रलेखन के साथ विपरीत है:।

"काम वितरण गतिशील है इसके बजाय एक निश्चित यात्रा रेंज आवंटित किया जा रहा है, श्रमिकों के लिए एक नया यात्रा के बाद ही वे प्रसंस्करण उनके खत्म आवंटित किए जाते हैं वर्तमान पुनरावृत्ति, जिसके परिणामस्वरूप कार्य भार वितरण भी होता है। "

क्या हो रहा है के बारे में कोई भी विचार?

उत्तर

5

मुझे लगता है कि डॉक में आप बोली एक बहुत अच्छा वर्णन क्या काम का एक स्थिर आवंटन माना जाता है है: प्रत्येक कार्यकर्ता "एक निश्चित यात्रा रेंज आवंटित किया जा रहा"। 4 श्रमिकों के लिए, इसका मतलब यह होगा पहले निर्धारित किये जाने से iter 1: 250, दूसरी iter 251: 500, ... या 1: 4: 100 पहले के लिए, 2: 4: 1000 दूसरी और इतने पर के लिए।

आपने जो कुछ भी देखा है, वह आपने बिल्कुल नहीं कहा है, लेकिन जो भी आप वर्णन करते हैं वह गतिशील वर्कलोड वितरण के साथ अच्छी तरह से संगत है: सबसे पहले, चार (उदाहरण) कर्मचारी प्रत्येक iter पर काम करते हैं, जो पहले पांचवें स्थान पर काम करता है, अगला जो किया जाता है (जो ठीक हो सकता है यदि पहले चार में से तीन कुछ हद तक अधिक समय लेते हैं) छठे पर काम करता है, और इसी तरह। अब अगर आपके आउटलाइजर्स संख्या 20, 850 और 900 हैं, तो MATLAB लूप पुनरावृत्तियों को संसाधित करने का विकल्प चुनता है और प्रत्येक 100 गुना लंबा लेता है, इसका मतलब केवल 21 से 320 वें पुनरावृत्तियों को चार श्रमिकों में से तीन द्वारा हल किया जाएगा जबकि एक है 20 वीं के साथ व्यस्त (320 तक यह किया जाएगा, अब लगभग गैर-बाहरी गणना समय का वितरण भी माना जाता है)। कार्यकर्ता निर्धारित किये जाने से 850 यात्रा, तथापि, के बाद भी एक और हल किया है # 1000, और # 900 के लिए एक ही चलना जारी रहेगा। वास्तव में, अगर लगभग 1100 पुनरावृत्तियों थे, तो # 900 पर काम करने वाला व्यक्ति लगभग उसी समय समाप्त होना चाहिए जब अन्य लोग हों।

[मूल शब्दों गर्भित MATLAB अभी भी 1000 1 से क्रम में parfor पाश की पुनरावृत्तियों आवंटित होता है, ग्रहण नहीं किया जाना चाहिए जो के रूप में संपादित],

इतने लंबे समय कहानी कम जब तक आप एक रास्ता खोजने पहले अपने आउटलाइर्स को संसाधित करने के लिए (निश्चित रूप से आपको एक प्राथमिकता जानने की आवश्यकता है जो आउटलेटर्स हैं, और MATLAB को इनके साथ पार्स लूप प्रोसेसिंग शुरू करने का तरीका ढूंढने के लिए), अकेले गतिशील वर्कलोड वितरण आपके द्वारा देखे जाने वाले प्रभाव से बच नहीं सकता है।

अलावा: मुझे लगता है कि, हालांकि, अपने अवलोकन है कि के रूप में "पाश पूरा होने के करीब पहुँचता है, कार्यकर्ता * रों * का मूल्यांकन किया है कि बाहरी कारकों के कारण चलाने के लिए जारी" निम्नलिखित

    कम से कम एक मतलब करने लगता है
  1. बाहरी कारकों के कारण किसी भी तरह पुनरावृत्तियों की संख्या के परिमाण के क्रम में, पिछले पुनरावृत्तियों MATLAB
  2. कार्रवाई करने के लिए आप कई श्रमिकों है शुरू होता है में से एक हैं
  3. बाहरी कारकों के कारण की संख्या (2-3) या अपने अनुमान से संबंधित अनुमान उनकी गणना समय जुर्माना (कारक 100) बहुत कम है
3

PARFOR में कार्य वितरण कुछ हद तक निर्धारक है। आप सटीक रूप से देख सकते हैं कि प्रत्येक कार्यकर्ता डिस्क पर कैसे लॉग करता है, लेकिन मूल रूप से यह पता चला है कि PARFOR आपके लूप को एक निश्चित तरीके से भाग में विभाजित करता है, लेकिन उन्हें गतिशील रूप से दूर करता है। दुर्भाग्यवश, वर्तमान में उस खंडन को नियंत्रित करने का कोई तरीका नहीं है।

हालांकि, अगर आप भविष्यवाणी नहीं कर सकते कि आपके 1000 मामलों में से कौन से मामले बहिष्कार किए जा रहे हैं, तो काम को वितरित करने के लिए एक कुशल योजना की कल्पना करना मुश्किल है।

आप अपने बाहरी कारकों के कारण भविष्यवाणी कर सकते हैं, तो आप इस तथ्य है कि मोटे तौर पर बोल का लाभ लेने के लिए सक्षम हो सकता है, PARFOR उलटे क्रम में पाश पुनरावृत्तियों निष्पादित करता है, तो आप इतना काम पर शुरू होता है पाश के "अंत" में उन्हें डाल सकता है उन्हें तुरंत।

3

आपकी समस्या का सामना @ arne.b के उत्तर में अच्छी तरह से वर्णित है, मेरे पास इसमें शामिल करने के लिए कुछ भी नहीं है।

लेकिन, समांतर गणना टूलबॉक्स में स्वतंत्र निष्पादन के लिए job into tasks को विघटित करने के लिए कार्य शामिल हैं। आपके प्रश्न से यह निष्कर्ष निकालना संभव नहीं है कि यह उपयुक्त है या यह आपके आवेदन के लिए उपयुक्त नहीं है। यदि ऐसा है, तो सामान्य रणनीति नौकरी को कुछ आकार के कार्यों में तोड़ना है और प्रत्येक प्रोसेसर एक कार्य से निपटने के लिए है, जब समाप्त हो गया है तो अधूरा कार्यों के ढेर पर वापस जाएं और दूसरे पर शुरू करें।

आप अपने समस्या ऐसी है कि एक ही कार्य को बदल देता है एक पाश यात्रा (कार्यों के बहुत सारे, गणना के प्रबंधन में भूमि के ऊपर के बहुत सारे लेकिन सबसे अच्छा लोड संतुलन) या तो यह है कि एक ही कार्य की जगह एन पाश पुनरावृत्तियों (कम कार्य विघटित कर सकता है , कम ओवरहेड, गरीब लोड-बैलेंसिंग)। नौकरी और कार्य parfor से भी लागू करने के लिए थोड़ा सा ट्रिकियर हैं।

0

PARFOR के विकल्प के रूप में, R2013b और बाद में, आप PARFEVAL का उपयोग कर सकते हैं और जिस तरह से आप फिट देखते हैं, उस काम को विभाजित कर सकते हैं। एक बार पर्याप्त परिणाम मिलने के बाद, यदि आप उचित हैं तो आप 'टाइमिंग आउटलाइजर्स' को भी रद्द कर सकते हैं। 1000 अलग-अलग रिमोट PARFEVAL कॉल में अपने मौजूदा पाश को विभाजित करते समय, ओवरहेड है। शायद यह एक समस्या है, शायद नहीं। यहां मैं जिस चीज की कल्पना कर रहा हूं:

for idx = 1:1000 
    futures(idx) = parfeval(@chunk_of_work, 1, idx); 
end 
done = false; numComplete = 0; 
timer = tic(); 
while ~done 
    [idx, result] = fetchNext(futures, 10); % wait up to 10 seconds 
    if ~isempty(idx) 
     numComplete = numComplete + 1; 
     % stash result 
    end 
    done = (numComplete == 1000) || (toc(timer) > 100); 
end 
% cancel outstanding work, has no effect on completed futures 
cancel(futures); 
संबंधित मुद्दे