我在Matlab中使用parfor
进行并行计算。我不熟悉这个命令。如果可以,请查看下面的代码并告诉我是否可以使用parfor
编写代码。
这些错误和警告出现在Matlab编辑器中:
由于使用变量Dat
的方式,无法运行parfor循环。 (当我评论第Dat.normXpj = normXpj(pj,:);
行时,此错误已解决,并出现类似于以下错误的其他错误。
整个数组或结构Bound
是广播变量。这
可能会导致不必要的通信开销。
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
答案 0 :(得分:2)
这里的问题是,我们可以看到您没有以依赖于顺序的方式使用Dat
,但parfor
的静态分析机制无法推断出因为你分配给它的方式。我认为你可以通过为循环的每次迭代创建一个全新的Dat
来解决这个问题,如下所示:
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
答案 1 :(得分:1)
不幸的是,答案是否定的。在线:
Dat.normXpj = normXpj(pj,:);
您为Dat.normXpj
分配了一个值,但您必须知道在parfor循环中可以同时执行多个迭代。那么Dat.normXpj
应该使用什么价值? Matlab无法决定你的错误。
更一般地说,您的代码看起来非常混乱。我想你想使用parfor
来提高执行速度。可能更有效的选择是使用分析器(请参阅profile
)来检测代码中的瓶颈,并在可能的情况下应用更正。
最佳,