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 HomeEnvironmentParallelMonitoruj 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})


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow