是否可以在这些代码中使用'parfor`在Matlab中进行并行计算?

时间:2015-03-04 17:49:27

标签: matlab parallel-processing parfor

我在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
    

2 个答案:

答案 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)来检测代码中的瓶颈,并在可能的情况下应用更正。

最佳,