MATLAB Language
बहु सूत्रण
खोज…
एक लूप को समानांतर करने के लिए 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})