MATLAB Language
Multithreading
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 Start → Umgebung → Parallel → Jobs ü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})