matlab parfor比for循环的执行时间更长

matlab parfor比for循环的执行时间更长,matlab,for-loop,Matlab,For Loop,我有一个三维网格,其中对于网格的每个点,我想计算大量时间步长的时间相关函数G(t),然后对每个网格点的G函数求和。使用4 for循环执行时间变得非常大,因此我尝试使用parfor避免这种情况 我的代码的一部分: for i=1:50 for j=1:50 for k=1:25 x_in=i*dx; y_in=j*dy; z_in=k*dz; %dx,dy, dz are som

我有一个三维网格,其中对于网格的每个点,我想计算大量时间步长的时间相关函数G(t),然后对每个网格点的G函数求和。使用4 for循环执行时间变得非常大,因此我尝试使用parfor避免这种情况

我的代码的一部分:

for i=1:50
    for j=1:50
        for k=1:25
            x_in=i*dx;
            y_in=j*dy;
            z_in=k*dz;
            %dx,dy, dz are some fixed values
            r=sqrt((xx-x_in).^2+(yy-y_in).^2+(zz-z_in).^2);
            %xx,yy,zz are 50x50x25 matrices generated from meshgrid
            % r is a 3d matrix which produced from a 3 for-loop, for all the points of grid
            parfor q=1:100
                t=0.5*q;
                G(q)=((a*p)/(t.^1.5)).*(exp(-r.^2/(4*a*t)));
                % a,p are some fixed values
            end
            GG(i,j,k)=sum(G(:));
        end
    end
end
当我使用
parfor
时,执行时间会变长,我不知道为什么会发生这种情况。也许我对parfor循环中的切片变量和索引变量不太熟悉

我的电脑处理器有8个线程和内存ddr3 8GB

任何帮助都会很好


谢谢

正如在一篇文章中所讨论的,
parfor
带来了开销。因此,使用
parfor
时,过于简单的循环将执行得更慢

在您的情况下,解决方案可能是并行化最外层的循环

%# preassign GG
GG = zeros(50,50,25);

%# loop over indices into GG
parfor idx = 1:(50*50*25)
    [i,j,k] = ind2sub([50 50 25],idx);
    x_in=i*dx;
    y_in=j*dy;
    z_in=k*dz;
    %dx,dy, dz are some fixed values

    r=sqrt((xx-x_in).^2+(yy-y_in).^2+(zz-z_in).^2);

    %xx,yy,zz are 50x50x25 matrices generated from meshgrid
    % r is a 3d matrix which produced from a 3 for-loop, for all the points of grid

    for q=1:100
        t=0.5*q;
        G(q)=((a*p)/(t.^1.5)).*(exp(-r.^2/(4*a*t)));
        % a,p are some fixed values
    end
    GG(idx)=sum(G(:));
end

或者,即使是i=1:50的单个参数,如果仍然存在开销,您可以检查开销是否受工人数量的影响。对于一份小工作,更少的工人就足够了。谢谢@Jonas的回答,谢谢大家的评论。我专注于内部循环,而没有考虑最外层的循环。扎马扎洛塔,我试试看。