与'for'循环相比,MATLAB'parfor'循环非常慢

时间:2017-10-13 10:00:05

标签: matlab loops parfor

我有一个我正在运行的脚本,有一次我对 n 对象进行了循环,我希望n相当大。< / p>

我可以访问服务器,因此我输入了 parfor 循环。但是,与标准的for循环相比,这是非常慢的。

例如,使用35位工作人员的 parfor循环运行某个配置(下面的那个)需要68秒,而for循环需要 2.3秒

我知道有些事情与数组广播有关,可能会导致问题,但我对此并不了解。

n = 20;
r = 1/30;

tic

X = rand([2,n-1]);
X = [X,[0.5;0.5]];
D = sq_distance(X,X);
A = sparse((D < r) - eye(n));

% Infected set I
I = n;
[S,C] = graphconncomp(A);
compnum = C(I);
I_new = find(C == compnum);
I = I_new;

figure%('visible','off')
gplot(A,X')
hold on
plot(X(1,I),X(2,I),'r.')
hold off
title('time = 0')
axis([0,1,0,1])

time = 0;
t_max = 10; t_int = 1/100;
TIME = 1; T_plot = t_int^(-1) /100;

loops = t_max / T_plot;
F(loops) = struct('cdata',[],'colormap',[]);
F(1) = getframe;

% Probability of healing in interval of length t_int
heal_rate = 1/3; % (higher number is faster heal)
p_heal = t_int * heal_rate;
numhealed = 0;

while time < t_max
    time = time+t_int;
    steps = poissrnd(t_int,[n,1]);
    parfor k = 1:n
        for s = 1:steps(k)
            unit_vec = unif_unitvector;
            X_new = X(:,k) + unit_vec*t_int;
            if (   X_new <  1 == ones(2,1) ) ...
               & ( X_new >  0 == ones(2,1) )
                   X(:,k) = X_new;
            end
        end
    end
    D = sq_distance(X,X);
    A = sparse((D < r) - eye(n));
    [S,C] = graphconncomp(A);

    particles_healed = binornd(ones(length(I),1),p_heal);
    still_infected = find(particles_healed == 0);
    I = I(still_infected);
    numhealed = numhealed + sum(particles_healed);

    I_new = I;
%     compnum = zeros(length(I),1);
    for i = 1:length(I)
       compnum = C(I(i));
       I_new = union(I_new,find(C == compnum));
    end
    I = I_new;

    if time >= T_plot*TIME        
        gplot(A,X')
        hold on
        plot(X(1,I),X(2,I),'r.')
        hold off
        title(sprintf('time = %1g',time))
        axis([0,1,0,1])

%         fprintf('number healed = %1g\n',numhealed)
        numhealed = 0;

        F(TIME) = getframe;
        TIME = TIME + 1;
    end
end

toc

0 个答案:

没有答案