Suche…


Verwenden von parfor zum Parallelisieren einer Schleife

Sie können parfor , um die Iterationen einer Schleife parallel auszuführen:

Beispiel:

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

Hinweis: parfor kann nicht direkt verschachtelt werden. Für parfor Schachtelung einer Funktion in fisrt verwenden parfor und zweiten hinzuzufügen parfor in dieser Funktion.

Beispiel:

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

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

Wann verwenden Sie parfor

Grundsätzlich wird in zwei Fällen parfor empfohlen: viele Iterationen in Ihrer Schleife (z. B. 1e10 ) oder wenn jede Iteration sehr lange dauert (z. B. eig(magic(1e4)) ). Im zweiten Fall sollten Sie über die Verwendung von spmd . Der Grund, warum parfor langsamer ist als eine for Schleife für kurze Reichweiten oder schnelle Iterationen, ist der Overhead, der für die korrekte Verwaltung aller Mitarbeiter parfor ist, parfor nur die Berechnung parfor .

Viele Funktionen haben auch implizites Multithreading eingebaut , so dass eine parfor Schleife bei Verwendung dieser Funktionen nicht effizienter ist als eine serielle for Schleife, da alle Kerne bereits verwendet werden. parfor ist in diesem Fall tatsächlich ein Nachteil, da es einen zusätzlichen Aufteilungsaufwand hat und gleichzeitig so parallel ist wie die Funktion, die Sie verwenden parfor .

Betrachten Sie das folgende Beispiel, um das Verhalten von for im Gegensatz zu parfor . Öffnen Sie zuerst den Parallelpool, wenn Sie dies noch nicht getan haben:

gcp; % Opens a parallel pool using your current settings

Führen Sie dann einige große Schleifen aus:

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[-]';

Dann mache dasselbe mit parfor anstelle von for . Sie werden feststellen, dass die durchschnittliche Zeit pro Iteration steigt. parfor Sie jedoch fest, dass der parfor alle verfügbaren parfor verwendet hat. parfor die Gesamtzeit ( sum(Time) ) durch die Anzahl der Kerne in Ihrem Computer geteilt werden.

Während also die Zeit für jede einzelne Iteration mit der Verwendung von for steigt, parfor die Gesamtzeit erheblich.

Parallele Ausführung von Befehlen mithilfe der Anweisung "Single Program, Multiple Data" (SPMD)

Im Gegensatz zu einer parallelen for-Schleife ( parfor ), bei der die Iterationen einer Schleife auf mehrere Threads verteilt werden, nimmt ein Programm mit mehreren Daten ( spmd ) eine Reihe von Befehlen und verteilt sie an alle Threads, so dass jeder Thread führt den Befehl aus und speichert die Ergebnisse. Bedenken Sie:

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

Es ist wichtig zu beachten, dass auf jeden Thread während des spmd Blocks über seinen Thread-Index (auch als labindex oder labindex ) 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

In beiden Beispielen ist q ein zusammengesetztes Objekt , das mit dem Befehl q = Composite() initialisiert werden kann. Es ist wichtig zu beachten, dass auf zusammengesetzte Objekte nur während der Ausführung des Pools zugegriffen werden kann.

Mit dem Batch-Befehl können Sie verschiedene Berechnungen parallel ausführen

Um Multithreading in MATLAB zu verwenden, kann der Befehl batch . Beachten Sie, dass Sie die Parallel Computing-Toolbox installiert haben müssen.

Für ein zeitaufwendiges Skript zum Beispiel

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

Um es im Batch-Modus auszuführen, würde man Folgendes verwenden:

job=batch("da")

Dadurch kann MATLAB im Batch-Modus ausgeführt werden, und MATLAB kann in der Zwischenzeit für andere Aufgaben verwendet werden, z. B. zum Hinzufügen weiterer Batch-Prozesse.

So rufen Sie die Ergebnisse nach Beendigung des Jobs ab und laden das Array A in den Arbeitsbereich:

load(job, 'A')

Öffnen Sie schließlich die "Monitor-Job-GUI" unter StartUmgebungParallelJobs überwachen und löschen Sie den Job durch:

delete(job)

Um eine Funktion für die Stapelverarbeitung zu laden, verwenden Sie einfach diese Anweisung. Dabei ist fcn der Funktionsname, N die Anzahl der Ausgabearrays und x1 , ... , xn sind Eingabearrays:

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


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow