Better parallelization than parfor?
Ältere Kommentare anzeigen
Hello,
I have a function fun(vec(1:n),Nmax) with two outputs: (i) a matrix g(1:n,1:Nmax) and (ii) a vector tau(1:Nmax), as Nmax eigenfunctions and eigenvalues of a matrix constructed within fun. Now I want to get this output for all values withing a vector vec2(1:n). The simplest way is a for-loop
for i=1:n
[g(1:n,1:Nmax,1:n),tau(1:n,1:Nmax)] = fun(vec(1:n),Nmax,vec2(i))
end
This is however slow. Replacing it with a parfor-loop
parfor i=1:n
[g(:,:,i),tau(i,:)] = fun(vec(:),Nmax,vec2(i))
end
is quite a bit faster. I was wondering if there is a way to accelerate this even further by threading over the vector vec2? Somehow I cannot find the correct way without rewriting the function fun in several ways. Maybe the problem is that g is already a matrix, therefore fun(vec,Nmax,vec2') does not evaluate things in the correct dimension?
3 Kommentare
Matt J
am 27 Jan. 2020
I was wondering if there is a way to accelerate this even further by threading over the vector vec2?
Not sure what you mean. The code as you've presented it already does divide vec2 into parallel pieces. Nothing in what you've shown makes inefficient use of parfor that I can see. Anything slow would be in the details of how fun is implemented.
If i write sin(vec+vec'), the output is a nxn matrix, where n is the length of vec. However within this notation I am limited to automatic threading over only two dimensions.
The extension would be
sin(vec+vec.'+ reshape(vec,1,1,[]));
Akzeptierte Antwort
Weitere Antworten (1)
Philippe Lebel
am 27 Jan. 2020
0 Stimmen
maybe take a look at arrayfun().
Kategorien
Mehr zu Parallel for-Loops (parfor) finden Sie in Hilfe-Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!