MATLAB Answers

# Using parfor in a sparse setting

10 views (last 30 days)
Jakob Sievers on 23 Nov 2019
Commented: Jakob Sievers on 23 Nov 2019
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 CommentsShowHide 2 older comments
Jan on 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.

Sign in to comment.

### Accepted Answer

Jan on 23 Nov 2019
Edited: Jan on 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
##### 1 CommentShowHide None
Jakob Sievers on 23 Nov 2019
Ah ok, that makes sense. And the solution seems very reasonable. I will try this out. Thank you for your help!

Sign in to comment.

R2019a

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!