Matlab Parfor приводит к большему времени выполнения, чем цикл for - PullRequest
3 голосов
/ 28 февраля 2012

У меня есть трехмерная сетка, в которой для каждой точки сетки я хочу вычислить зависящую от времени функцию G (t) для большого количества временных шагов, а затем суммировать функцию G для каждой точки сетки.Используя 4 для циклов, время выполнения становится очень большим, поэтому я пытаюсь избежать этого, используя 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

Любая помощь будет отличной.

Спасибо

1 Ответ

6 голосов
/ 28 февраля 2012

Как уже обсуждалось в предыдущем вопросе , 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...