Reputation: 345
I am using parfor
for parallel computing in Matlab. I am not familiar with this command. If that is possible, please look at my code below and tell me if I can write it with parfor
.
These errors and warnings are appear in Matlab Editor:
The parfor loop cannot be run due to the way variable Dat
is used. (when I comment line Dat.normXpj = normXpj(pj,:);
This error is solved and other errors similar to the following error is appeared.
The entire array or structure Bound
is broadcast variable. This
might result in unnecessary communication overhead.
parfor pj = 1:size(normXpj,1)
Dat.normXpj = normXpj(pj,:);
if size(Dat.InitialGuess)==0
X = (Bound(:,1)+(Bound(:,2)-Bound(:,1)).*rand(Nvar,1))';
else
X = Dat.InitialGuess;
end
[Xsqp, ~, FLAG,Options] = mopOPT(X,Dat);
FEVALS = Options.funcCount;
FES = FES+FEVALS;
PSet(pj,:) = Xsqp;
PFront(pj,:) = mop(Xsqp,Dat,0);
if FLAG==-2
disp('.......... Algo paso...');
else
F = PFront(pj,:);
if Nobj==2
plot(F(1,1),F(1,2),'*r'); grid on; hold on;
elseif Nobj==3
end
end
end
Upvotes: 0
Views: 469
Reputation: 25160
The problem here is that it we can see that you're not using Dat
in a way that is order-dependent, but the static analysis machinery of parfor
cannot deduce that because of the way you're assigning into it. I think you can work around this by instead creating a whole new Dat
for each iteration of the loop, like so:
Dat = struct('normXpj', rand(10,1), 'InitialGuess', 3);
normXpj = rand(10);
parfor idx = 1:10
tmpDat = struct('normXpj', normXpj(:,idx), 'InitialGuess', Dat.InitialGuess);
% use 'tmpDat'
disp(tmpDat);
end
Upvotes: 2
Reputation: 5188
The answer is no, unfortunately. At line:
Dat.normXpj = normXpj(pj,:);
you assign a value to Dat.normXpj
, but you have to know that in a parfor loop there can be multiple iterations executing at the same time. So what value should be used for Dat.normXpj
? Matlab cannot decide, hence your error.
More generally, your code looks quite messy. I suppose you want to use parfor
to increase execution speed. Probably a more efficient option would be to use the profiler (see profile
) to detect the bottlenecks in your code, and apply a correction if that's possible.
Best,
Upvotes: 1