MATLAB Answers

Can I avoid this broadcast variable?

27 views (last 30 days)
Adam
Adam on 22 Feb 2019
Edited: Matt J on 22 Feb 2019
Hello,
I had two nested for loops that I would like to parallelise. It looked like this
for k = 1:size(S,2)
for j = 1:length(b)
fun(S(:,k),b(j));
end
end
Here S is large (10^5 x 10^2), and b is not large (1 x 10).
Since all of the loops are independent I found the following solution
parfor i = 1:size(S,2)*length(b)
k = ceil(i/length(b)); %S
j = i-(k-1)*length(b); %b
fun(S(:,k),b(j));
end
The problem is that S and b are broadcast variables.
Is there a way to eliminate S as a broadcast variable (b does not matter much)?
Thank you!

  0 Comments

Sign in to comment.

Accepted Answer

Matt J
Matt J on 22 Feb 2019
Edited: Matt J on 22 Feb 2019
Why not this?
parfor k = 1:size(S,2)
tmp=S(:,k);
for j = 1:length(b)
fun(tmp,b(j));
end
end

  2 Comments

Adam
Adam on 22 Feb 2019
Hi Matt, because this way the computational time will be longer. My solution increases the number of CPUs length(b)-fold and yields overall shorter computational time. Am I correct?
Matt J
Matt J on 22 Feb 2019
You would need a parpool with N>100=size(S,2) labs in order for the work per lab to be any less in your strategy than what I propose.
Method 1: parallelize over k only. The busiest lab will perform ceil(size(S,2)/N)*length(b) serial calls to fun.
Method 2: parallelize all calls to fun. The busiest lab will perform ceil(size(S,2)*length(b)/N) serial calls.
Both are therefore nearly the same unless N>size(S,2)

Sign in to comment.

More Answers (0)

Categories

Community Treasure Hunt

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

Start Hunting!