2017-01-29 5 views
0

Ich versucheWarum verwendet Arrayfun nur einen einzelnen Kern?

% matlabpool open 2; % line 1 
tic; arrayfun(@(x) sum(sum(rand(1000))), [1 : 100]); toc; 
Elapsed time is 4.070030 seconds. 

zu schätzen, wenn ich die erste Zeile Kommentar-, so dass ich einen Pool von 2 Arbeiter schaffen, bekomme ich die gleiche Zeit Ergebnis.

Warum einige offensichtliche Systemfunktionen nicht automatisch im Parallelmodus ausgeführt werden? Hat Matlab eine ähnliche Funktion wie arrayfun für GPU, wenn wir parallel laufen?

Antwort

2

Der Grund, dass Sie keine Geschwindigkeitserhöhung bekommen von matlabpool Aufruf vor arrayfun Aufruf ist, dass nur der Akt der Erstellung mehrerer Arbeiter nicht alle Code diese Arbeiter nutzen macht Berechnungen durchzuführen. Wenn Sie den Pool von Arbeitern ausnutzen möchten, müssen Sie Ihren Code explizit mit parfor (zusammengehörende Informationen here) parallelisieren.

parfor k = 1:10 
    result{k} = sum(sum(a*b)); 
end 

Im Allgemeinen arrayfun tut nicht jede Parallelisierung oder Beschleunigung tun. Tatsächlich ist es oft langsamer als einfach die for-Schleife zu schreiben, da die explizite for-Schleife eine bessere JIT-Beschleunigung ermöglicht.

for k = 1:10 
    result(k) = sum(sum(a * b)); 
end 

Wenn Sie den Vorgang ausführen möchten Sie die GPU gezeigt verwendet haben, wenn die Eingangsdaten zu arrayfun ein gpuarray ist, dann wird es auf der GPU excecute (die distributed version of arrayfun verwenden). Das Problem besteht jedoch darin, dass alles, was auf der GPU unter Verwendung von arrayfunausgeführt wird, nur elementweise Operationen hat, so dass die Operation auf jedem Element unabhängig von den Operationen auf allen anderen Elementen ist (wodurch es parallelisiert werden kann). In Ihrem Fall ist es nicht Element-weise Operationen und daher kann die GPU-Version von arrayfun nicht verwendet werden.

Als Nebenbemerkung möchten Sie parpool statt matlabpool verwenden, da letzteres veraltet ist.

+0

Vielen Dank. Habe ich richtig verstanden, dass GPU nur für riesige Arrays und einfache Operationen (wie. +, .-,. *, ./) wirklich schnell sein kann? Nicht alle Operationen von https://www.mathworks.com/help/distcomp/run-built-in-functions-on-a-gpu.html können schnell für GPU sein? – user7484269

+0

@ user7484269 Nein, alle diese Funktionen können dank der GPU beschleunigt werden, ich bezog mich explizit auf 'arrayfun'. Nur 'arrayfun' kann elementweise Operationen ausführen. Es gibt jedoch keinen signifikanten Overhead, wenn Daten vor der Berechnung an die GPU übertragen werden. – Suever

+0

Ok, nochmals vielen Dank.Und als letzte Frage zu diesem Thema: Welche mittlere Zeitbeschleunigung haben Sie mit gpu bei der Arbeit mit Matlab erreicht? – user7484269

1

Core MATLAB verwendet zwar Threads und Vektoroperationen, aber Sie müssen den Code selbst vektorisieren. Für Ihr Beispiel, zum Beispiel, müssen Sie

A = rand(1000, 1000, 100); 
B = sum(sum(A, 1), 2); 

B ist nun ein 1-by-1-by-100-Array der Summen schreiben. Ich habe zwei Summen verwendet, um Ihnen zu verstehen, was passiert, wenn Sie eigentlich wollten, um jede Zahl in einer Matrix zu summieren, würden Sie gehen sum(A(:)), oder für diese Charge Beispiel, sum(reshape(A, [], 100)).

Für Task-Parallelität anstelle von Datenparallelität parfor, batch, parfeval oder eine andere parallele Anweisung verwenden.

Verwandte Themen