खोज…


एक लूप को समानांतर करने के लिए parfor का उपयोग करना

आप समानांतर में एक पाश के पुनरावृत्तियों को निष्पादित करने के लिए parfor का उपयोग कर सकते हैं:

उदाहरण:

poolobj = parpool(2);       % Open a parallel pool with 2 workers 

s = 0;                      % Performing some parallel Computations
parfor i=0:9
    s = s + 1;
end
disp(s)                     % Outputs '10'

delete(poolobj);            % Close the parallel pool

नोट: parfor को सीधे नेस्टेड नहीं किया जा सकता है। parfor लिए fisrt parfor में एक फ़ंक्शन का उपयोग करें और उस फ़ंक्शन में दूसरा parfor जोड़ें।

उदाहरण:

parfor i = 1:n
[op] = fun_name(ip);
end

function [op] = fun_name(ip)
parfor j = 1:length(ip)
% Some Computation
end

जब parfor का उपयोग करने के लिए

मूल रूप से, दो मामलों में parfor की सिफारिश की जाती है: आपके लूप में बहुत सारे पुनरावृत्तियों (जैसे, 1e10 ), या यदि प्रत्येक पुनरावृत्ति में बहुत लंबा समय लगता है (जैसे, eig(magic(1e4)) )। दूसरे मामले में आप spmd का उपयोग करने पर विचार कर spmd । कारण parfor एक की तुलना में धीमी है for कम पर्वतमाला या तेजी से पुनरावृत्तियों के लिए पाश भूमि के ऊपर के रूप में सिर्फ गणना कर का विरोध करने के लिए सही ढंग से सभी कर्मचारियों को प्रबंधित करने के लिए, की जरूरत है।

इन कार्यों का उपयोग करते समय, लूप के for एक धारावाहिक की तुलना में, जब सभी कोर पहले से ही उपयोग किए जा रहे हैं, तब भी बहुत सारे कार्यों में अंतर्निहित बहु-थ्रेडिंग अंतर्निहित है , जो एक parfor लूप को अधिक कुशल नहीं parfor है। parfor वास्तव में इस मामले में एक parfor होगी, क्योंकि इसमें आवंटन ओवरहेड है, जबकि आप जिस फ़ंक्शन का उपयोग करने की कोशिश कर रहे हैं, उसके समानांतर।

निम्नलिखित उदाहरण पर विचार के व्यवहार को देखने के लिए for के रूप में की है कि करने के लिए विरोध parfor । यदि आपने पहले से ऐसा नहीं किया है, तो पहले समानांतर पूल खोलें:

gcp; % Opens a parallel pool using your current settings

फिर बड़े लूप के एक जोड़े को निष्पादित करें:

n = 1000; % Iteration number
EigenValues = cell(n,1); % Prepare to store the data
Time = zeros(n,1);
for ii = 1:n
tic
    EigenValues{ii,1} = eig(magic(1e3)); % Might want to lower the magic if it takes too long
Time(ii,1) = toc; % Collect time after each iteration
end

figure; % Create a plot of results
plot(1:n,t)
title 'Time per iteration'
ylabel 'Time [s]'
xlabel 'Iteration number[-]';

फिर साथ भी ऐसा ही parfor के बजाय for । आप देखेंगे कि प्रति चलना का औसत समय बढ़ जाता है। हालांकि यह महसूस करें कि सभी उपलब्ध श्रमिकों का उपयोग करने वाले parfor , इस प्रकार कुल समय ( sum(Time) ) को आपके कंप्यूटर में कोर की संख्या से विभाजित किया जाना है।

इसलिए, प्रत्येक अलग पुनरावृत्ति करने के लिए समय का उपयोग करने के for सम्मान के साथ parfor का उपयोग कर ऊपर जाता है, कुल समय काफी कम हो जाता है।

"सिंगल प्रोग्राम, मल्टीपल डेटा" (SPMD) स्टेटमेंट का उपयोग करके समानांतर में कमांड निष्पादित करना

एक समानांतर फॉर-लूप ( parfor ) के विपरीत, जो एक लूप की पुनरावृत्तियों को लेता है और उन्हें कई थ्रेड्स के बीच वितरित करता है, एक एकल प्रोग्राम, कई डेटा ( spmd ) स्टेटमेंट कमांड की एक श्रृंखला लेता है और उन्हें सभी थ्रेड्स में वितरित करता है, ताकि प्रत्येक थ्रेड कमांड को निष्पादित करता है और परिणामों को संग्रहीत करता है। इस पर विचार करो:

poolobj = parpool(2);    % open a parallel pool with two workers

spmd
    q = rand(3);         % each thread generates a unique 3x3 array of random numbers
end

q{1}             % q is called like a cell vector
q{2}             % the values stored in each thread may be accessed by their index

delete(poolobj)  % if the pool is closed, then the data in q will no longer be accessible

यह ध्यान रखना महत्वपूर्ण है कि प्रत्येक थ्रेड को spmd ब्लॉक के दौरान उसके थ्रेड इंडेक्स (जिसे लैब इंडेक्स या labindex भी कहा जाता है) द्वारा एक्सेस किया जा सकता है:

poolobj = parpool(2);        % open a parallel pool with two workers

spmd
    q = rand(labindex + 1);  % each thread generates a unique array of random numbers
end

size(q{1})                   % the size of q{1} is 2x2
size(q{2})                   % the size of q{2} is 3x3

delete(poolobj)              % q is no longer accessible

दोनों उदाहरणों में, q एक समग्र वस्तु है , जिसे कमांड q = Composite() साथ आरंभ किया जा सकता है। यह ध्यान रखना महत्वपूर्ण है कि जब पूल चल रहा है तो समग्र वस्तुएं केवल सुलभ हैं।

समानांतर में विभिन्न अभिकलन करने के लिए बैच कमांड का उपयोग करना

MATLAB में मल्टी-थ्रेडिंग का उपयोग करने के लिए batch कमांड का उपयोग किया जा सकता है। ध्यान दें कि आपके पास समानांतर कम्प्यूटिंग टूलबॉक्स स्थापित होना चाहिए।

उदाहरण के लिए, समय लेने वाली स्क्रिप्ट के लिए,

for ii=1:1e8
   A(ii)=sin(ii*2*pi/1e8);
end

इसे बैच मोड में चलाने के लिए निम्न का उपयोग किया जाएगा:

job=batch("da")

जो MATLAB को बैच मोड में चलाने में सक्षम बनाता है और इस बीच में MATLAB का उपयोग करना संभव बनाता है, जैसे कि अन्य चीजें करने के लिए, और अधिक बैच प्रक्रियाएं जोड़ें।

कार्य समाप्त करने के बाद परिणाम प्राप्त करने के लिए और कार्यक्षेत्र में A को लोड करें:

load(job, 'A')

अंत में, होमएनवायरनमेंटपैरेललमॉनिटर जॉब्स से "मॉनिटर जॉब गिई" खोलें और जॉब को डिलीट करें:

delete(job)

बैच प्रोसेसिंग के लिए एक समारोह लोड के लिए, बस इस बयान जहां का उपयोग fcn समारोह का नाम है, N उत्पादन सरणियों और की संख्या है x1 , ... , xn इनपुट सरणियों हैं:

 j=batch(fcn, N, {x1, x2, ..., xn})


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow