MATLAB Language
Wielowątkowość
Szukaj…
Użycie parfor do zrównoleglenia pętli
Możesz użyć parfor
do parfor
wykonywania iteracji pętli:
Przykład:
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
Uwaga: parfor
nie może być zagnieżdżony bezpośrednio. Do zagnieżdżania parfor
użyj funkcji w fisrt parfor
i dodaj drugą parfor
w tej funkcji.
Przykład:
parfor i = 1:n
[op] = fun_name(ip);
end
function [op] = fun_name(ip)
parfor j = 1:length(ip)
% Some Computation
end
Kiedy stosować parfor
Zasadniczo parfor
jest zalecany w dwóch przypadkach: dużo iteracji w twojej pętli (np. Jak 1e10
) lub jeśli każda iteracja zajmuje bardzo dużo czasu (np. eig(magic(1e4))
). W drugim przypadku możesz rozważyć użycie spmd
. Powodem parfor
jest wolniejszy niż for
pętli o krótkich przedziałach lub szybko iteracji jest napowietrznych potrzebne do zarządzania wszystkim pracownikom prawidłowo, w przeciwieństwie do po prostu robi obliczenia.
Wiele funkcji ma również wbudowaną funkcję wielowątkowości , dzięki parfor
pętla parfor
nie jest bardziej wydajna podczas korzystania z tych funkcji niż szeregowa pętla for
, ponieważ wszystkie rdzenie są już używane. parfor
będzie w tym przypadku szkodą, ponieważ ma narzut związany z alokacją, a jednocześnie jest równoległy do funkcji, której próbujesz użyć.
Rozważ następujący przykład, aby zobaczyć zachowanie for
w przeciwieństwie do zachowania parfor
. Najpierw otwórz pulę równoległą, jeśli jeszcze tego nie zrobiłeś:
gcp; % Opens a parallel pool using your current settings
Następnie wykonaj kilka dużych pętli:
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[-]';
Następnie zrób to samo z parfor
zamiast for
. Zauważysz, że średni czas na iterację rośnie. parfor
jednak, że parfor
używał wszystkich dostępnych pracowników, dlatego całkowity czas ( sum(Time)
) musi być podzielony przez liczbę rdzeni w twoim komputerze.
Tak więc, chociaż czas wykonywania każdej oddzielnej iteracji parfor
się przy użyciu parfor
w odniesieniu do użycia for
, całkowity czas znacznie się zmniejsza.
Równoległe wykonywanie poleceń za pomocą instrukcji „SPMD” (Single Program, Multiple Data)
W przeciwieństwie do równoległej pętli parfor
( parfor
), która pobiera iteracje pętli i rozdziela je między wiele wątków, pojedyncza instrukcja, wiele danych ( spmd
) pobiera szereg poleceń i rozdziela je do wszystkich wątków, dzięki czemu każdy z nich Wątek wykonuje polecenie i przechowuje wyniki. Rozważ to:
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
Ważne jest, aby pamiętać, że do każdego wątku można uzyskać dostęp podczas bloku spmd
przez jego indeks wątków (zwany również indeksem laboratoryjnym lub 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
W obu przykładach q
jest obiektem złożonym , który można zainicjować za pomocą polecenia q = Composite()
. Należy zauważyć, że obiekty złożone są dostępne tylko podczas działania puli.
Korzystanie z polecenia wsadowego do wykonywania różnych obliczeń równolegle
Aby użyć wielowątkowości w MATLAB, można użyć polecenia batch
. Pamiętaj, że musisz mieć zainstalowany zestaw narzędzi Parallel Computing.
Na przykład czasochłonny skrypt
for ii=1:1e8
A(ii)=sin(ii*2*pi/1e8);
end
aby uruchomić go w trybie wsadowym, należy użyć:
job=batch("da")
która umożliwia MATLAB-owi działanie w trybie wsadowym i umożliwia używanie MATLAB-a do wykonywania innych czynności, takich jak dodawanie kolejnych procesów wsadowych.
Aby pobrać wyniki po zakończeniu zadania i załadować tablicę A
do obszaru roboczego:
load(job, 'A')
Na koniec otwórz „monitor zadania GUI” w Home → Environment → Parallel → Monitoruj zadania i usuń zadanie poprzez:
delete(job)
Aby załadować funkcję do przetwarzania wsadowego, po prostu użyj tej instrukcji, gdzie fcn
jest nazwą funkcji, N
to liczba tablic wyjściowych, a x1
, ...
, xn
to tablice wejściowe:
j=batch(fcn, N, {x1, x2, ..., xn})