【问题标题】:Variable is indexed but not sliced变量已编入索引但未切片
【发布时间】:2014-01-08 19:24:21
【问题描述】:

我将下面的代码并行化,但仿真时间实际上是串行代码的 400-500 倍。我能想到的唯一原因是消息'变量 x 已编入索引但未在 parfor 循环中切片,'变量 p 已编入索引但未在 parfor 循环中切片。任何人都可以验证这是模拟时间大幅增加的原因还是我并行化代码的方式。

p=(1,i) 和 x(1,i) 是预先设置值的矩阵。

nt=1;
nc=32;
time(1,1) = 0.0;

for t=dt:dt:0.1

    nt=nt+1;
    time(1,nt) = t;

    disp(t);

    for ii=2:nc

        mytemp=zeros(1,ii);      
        dummy=0.0;

        parfor jj=1:nc+1                               

            if ii==jj % skipped
              continue;
            end

            dxx = x(1,jj) - x(1,ii);
            rr=abs(dxx);

            if rr < re
                dummy(jj) = (p(nt-1,jj)-p(nt-1,ii))*kernel(rr,re,ktype)*rr;
                mytemp(jj) =  kernel(rr,re,ktype)*rr;
                %sumw(1,ii) = sumw(1,ii) + kernel(rr,re,1);        
            end

        end

        mysum = sum(dummy);
        zeta(1,ii)=sum(mytemp);
        lapp(1,ii) = 2.0*dim*mysum/zeta(1,ii);
        p(nt,ii) = p(nt-1,ii) + dt*lapp(1,ii);

    end   

    % update boundary value
    p(nt,1) = function_phi(0,t);
    p(nt,nc+1) = function_phi(1,t);

end

【问题讨论】:

    标签: matlab for-loop parallel-processing parfor


    【解决方案1】:

    不能确定是不是这个原因,但如果代码的某些部分最终被并行化,而其他部分则不能,这将产生大量开销而没有任何加速。有关切片的更详细讨论,请参见 Q&A here

    基本上,如果您有一个带有变量jjparfor,那么在右侧使用jj 的每个语句也应该在左侧使用jj - 这样, “作业”可以在不同的处理器之间划分,每个处理器并行处理阵列的一部分。只要不发生这种情况,例如在您的台词中

    dxx = x(1,jj) - x(1,ii);
    rr=abs(dxx);
    

    你打破了范式。慢 400 倍?我不知道——但警告很清楚。

    顺便说一句,前两行可以通过计算 rr(jj) 来合并(尽管您不需要数组):

    rr(jj) = abs(x(1,jj) - x(1,ii));
    

    然后在循环后面使用该值而不是 rr。这有点像循环的每个副本都有一个 private 变量(我认为 Matlab 没有这个概念 - 但 exists in OMP )。

    我看不到 pparfor 循环中的索引位置……它似乎是在内部循环之外更新的,它应该无关紧要。

    您可能会发现使用并行分析器 http://www.mathworks.com/help/distcomp/profiling-parallel-code.html 分析您的代码会很有帮助 - 这会很有启发性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-18
      • 2017-11-29
      • 1970-01-01
      • 2015-12-13
      • 1970-01-01
      • 2021-12-31
      • 2018-07-29
      • 1970-01-01
      相关资源
      最近更新 更多