Using parfor in a sparse setting
3 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Hi there
I have been solving a problem using a parfor loop. However it has come to my attention that occasionally a large number of serial entries do not in fact have to be run, and I suspect that it reduces the advantage of the parfor loop, relative to a normal for-loop, whenever it has to deal with lots of "non-entries". As an example here is an illustration of a hypothetical situation, and process, which needs to be solved.
A=[1;2;3;4;nan;nan;nan;nan;nan;10;11];
B=nan(size(A));
parfor ii=1:length(A)
if ~isnan(A(ii))
B(ii)=A(ii); %process
end
end
As you can see, 5 out of the 11 entries do not need to be run and so the parfor skips those accordingly (for the actual case the ratio is often more like 1/10 which is why I am exploring alternative solutions). However I wanted to explore a quick solution which would make the parfor loop inherently only evaluate real entries. My problematic code is shown here:
A=[1;2;3;4;nan;nan;nan;nan;nan;10;11];
B=nan(size(A));
ix=find(~isnan(A));
parfor ii2=1:length(ix)
ii=ix(ii2);
B(ii)=A(ii); %process
end
Matlab doesn't allow this. Veterans will likely look at this and go "obviously this is not possible" but I don't understand why, and more importantly, I don't understand how I might otherwise make a similar simple workaround (i.e.: not rebuild the entire actual process within the parfor loop) that would only evaluate the right numbers.
Can anyone help me out?
Thanks in advance!
Cheers
Jakob
3 commentaires
Jan
le 23 Nov 2019
@Jakob: Thanks for sharing the error message. I cannot copy&paste&run the code without having the Parallel Computing Toolbox installed at home.
Réponse acceptée
Jan
le 23 Nov 2019
Modifié(e) : Jan
le 23 Nov 2019
The help page "Troubleshoot Variables in parfor-Loops" explains the problem:
A = [1;2;3;4;nan;nan;nan;nan;nan;10;11];
B = nan(size(A));
ix = find(~isnan(A));
parfor ii2 = 1:length(ix)
ii = ix(ii2);
B(ii) = A(ii); % Problem: Usage of B not clear
end
Matlab cannot know if ii is unique, so it is possible that 2 workers access B(1) at the same time.
Solution:
A = [1;2;3;4;nan;nan;nan;nan;nan;10;11];
B = nan(size(A));
ix = find(~isnan(A));
BB = nan(numel(ix), 1);
parfor ii2 = 1:numel(ix)
ii = ix(ii2);
BB(ii2) = A(ii); % No problem: no collisions possible
end
B(ix) = BB
Plus de réponses (0)
Voir également
Catégories
En savoir plus sur Loops and Conditional Statements dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!