Better parallelization than parfor?
1 visualizzazione (ultimi 30 giorni)
Mostra commenti meno recenti
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?
Risposta accettata
Matt J
il 27 Gen 2020
The reason why I think it could be improved is that MATLAB tells me that vec in my above example is a 'broadcast' variable and might slow things down.
But you said vec2 was the problem, not vec.
In any case, if each call to fun requires all of vec then you have no choice but to broadcast it.
2 Commenti
Edric Ellis
il 28 Gen 2020
As @Matt J pointed out, if each iteration needs all of vec, then there's not much you can do. That warning is shown for all broadcast variables, regardless of whether or not they actually cause a performance degradation.
You can use ticBytes and tocBytes to see how much data is actually being transmitted to/from your parfor loop. If vec is a numeric vector of length n, then my suspicion would be that it probably has no discernable affect on the loop time.
Più risposte (1)
Vedere anche
Categorie
Scopri di più su Loops and Conditional Statements in Help Center e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!