【问题标题】:Is it possible to use use `parfor` for parallel computing in Matlab in these codes?是否可以在这些代码中使用“parfor”在 Matlab 中进行并行计算?
【发布时间】:2015-03-04 17:49:26
【问题描述】:

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

【问题讨论】:

  • 嗯,没人帮忙吗? :(
  • 你能用Dat 发布确切的错误信息吗?
  • 当我将鼠标悬停在 parfor 上时,这是我在 Matlab 编辑器窗口中得到的:由于使用变量 Dat 的方式,无法运行 parfor 循环 @CrazyRat
  • 好的。这与我的回答一致。
  • 所以,真的不行吗? :((@CrazyRat

标签: matlab parallel-processing parfor


【解决方案1】:

这里的问题是,我们可以看到您没有以依赖于顺序的方式使用 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

【讨论】:

  • 为什么你认为Dat 是一个结构而不是一个对象?例如,由于您不知道 mopOPT(X,Dat)mop(Xsqp,Dat,0) 内部的内容,因此很难说在每次迭代中创建一个新的 Dat 是解决方案。
  • OP 的新问题仍然不依赖于顺序,因此它可以在parfor 中运行。您只需一次将一整行分配给A1,如下所示:A1 = zeros(SG,Nvar); parfor i = 1:SG, row = zeros(1, Nvar); row([i, SG + i]) = [1, -1]; A1(i, :) = row; end
  • 毫无疑问,它的速度要慢得多,因为它没有做足够的工作使parfor 有价值——它一直在来回移动数据。对于覆盖Dat 的整个值的更改,我对在您原来的问题中仍然不起作用的内容感到困惑。
  • 嗯,可能会出现数值差异,因为parforworkers 在单计算线程模式下运行 - 但通常这只会导致非常小的差异。听起来好像还有其他问题。
  • 要打开一个“默认”大小的并行池 - 即具有与核心相同数量的工人 - 只需调用 parpool('local') (前提是您没有修改您的 local 配置文件) .我会删除pause,我看不出有任何帮助的原因。
【解决方案2】:

很遗憾,答案是否定的。在线:

Dat.normXpj = normXpj(pj,:);

您为Dat.normXpj 赋值,但您必须知道在parfor 循环中可以同时执行多个迭代。那么Dat.normXpj 应该使用什么值呢? Matlab 无法决定,因此您的错误。

更一般地说,您的代码看起来很混乱。我想您想使用parfor 来提高执行速度。可能更有效的选择是使用分析器(请参阅profile)来检测代码中的瓶颈,并在可能的情况下进行更正。

最好的,

【讨论】:

  • Dat.normXpj 是一个 3*55 矩阵,在程序中保持不变。这个外观运行了 55 次,并在那里运行了 fmincon 的优化问题。所以这是整个代码中最耗时的部分。 @疯狂老鼠
  • 好吧,如果Dat.normXpj 是常量,为什么要在循环的每次迭代中重新定义它?请提供一些连贯的信息。
  • 这是一个错误。它每次迭代都会改变,只有循环大小(normXpj,1)的大小保持不变。 @CrazyRat
  • :(((糟糕的时候,谢谢你的帮助@crazyrat
  • Edric 回答有效,也感谢您的帮助。 @CrazyRat
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-04
  • 2015-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多