是否可以在这些代码中使用 `parfor` 在 Matlab 中进行并行计算?
Is it possible to use use `parfor` for parallel computing in Matlab in these codes?
我正在使用 parfor
在 Matlab 中进行并行计算。我不熟悉这个命令。如果可能的话,请看下面我的代码并告诉我是否可以用 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
不幸的是,答案是否定的。在行:
Dat.normXpj = normXpj(pj,:);
你给Dat.normXpj
赋值,但是你要知道在一个parfor循环中是可以同时执行多个迭代的。那么 Dat.normXpj
应该使用什么值呢? Matlab 无法决定,因此你的错误。
更一般地说,您的代码看起来很乱。我想您想使用 parfor
来提高执行速度。可能更有效的选择是使用探查器(请参阅 profile
)来检测代码中的瓶颈,并在可能的情况下进行更正。
最佳,
这里的问题是,我们可以看到您没有以依赖于顺序的方式使用 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
我正在使用 parfor
在 Matlab 中进行并行计算。我不熟悉这个命令。如果可能的话,请看下面我的代码并告诉我是否可以用 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
不幸的是,答案是否定的。在行:
Dat.normXpj = normXpj(pj,:);
你给Dat.normXpj
赋值,但是你要知道在一个parfor循环中是可以同时执行多个迭代的。那么 Dat.normXpj
应该使用什么值呢? Matlab 无法决定,因此你的错误。
更一般地说,您的代码看起来很乱。我想您想使用 parfor
来提高执行速度。可能更有效的选择是使用探查器(请参阅 profile
)来检测代码中的瓶颈,并在可能的情况下进行更正。
最佳,
这里的问题是,我们可以看到您没有以依赖于顺序的方式使用 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