Набор инструментов Matlab Parallelism: укладка циклов в parfor - PullRequest
2 голосов
/ 17 августа 2011

Я пытаюсь использовать цикл parfor в пакете параллелизма matlab. У меня похожая проблема с этим парнем: MATLAB parfor вопрос нарезки? . Выходная матрица, похоже, не распознается как секционированная переменная. В моем конкретном случае я пытаюсь использовать другие циклы for внутри parfor, и у меня возникают проблемы с применением решения, предложенного в другом потоке, к моей проблеме. Вот фиктивный пример того, что я пытаюсь сделать:

n=175;
matlabpool;

Matred=zeros(n,n);

Matx2Cell = cell(n);

parfor i=1:n
    for j=1:n
        for k=1:n

            Matred(j,k)=exp((j+i+k)/500)
        end;
    end;
    Matx2Cell{i}=Matred;

end;
matlabpool close;

P.S. Я знаю, что было бы полезно поместить parfor в k-цикл вместо i-loop ... Но я все же хотел бы включить его в i-цикл (я полагаю, это будет более эффективным по времени в моем настоящем программа).

Большое спасибо Фредерик Годин

Ответы [ 2 ]

5 голосов
/ 18 августа 2011

Вы можете поместить Matred = zeros(n); в тело parfor, но это очень медленно.Вместо этого определите функцию с Matred = zeros(n); в ней: фактически то же самое, но гораздо быстрее:

function Matred = calcMatred(i,n)
Matred=zeros(n);
for j=1:n
    for k=1:n
        Matred(j,k)=exp((j+i+k)/500);
    end
end

Вот сравнение времени:

matlabpool
n = 175;
Matx2Cell = cell(n,1);

tic
parfor i=1:n
    Matred=zeros(n);
    for j=1:n
        for k=1:n
            Matred(j,k)=exp((j+i+k)/500);
        end
    end
    Matx2Cell{i}=Matred;
end
toc

tic
parfor i=1:n
    Matx2Cell{i}=calcMatred(i,n);
end
toc

matlabpool close

На моей машине это занимает7 секунд для первого и 0,3 секунды для второго.

Также обратите внимание, что я изменил объявление Matx2Cell на cell(n,1), поскольку cell(n) создает массив ячеек n x n.

1 голос
/ 18 августа 2011

Вам нужно переместить Матреда в тело цикла parfor. Это необходимо сделать, потому что для каждой итерации parfor требуется новая копия Matred.

n=175;
matlabpool;

Matx2Cell = cell(n);

parfor i=1:n
    Matred=zeros(n,n);
    for j=1:n
        for k=1:n

            Matred(j,k)=exp((j+i+k)/500)
        end;
    end;
    Matx2Cell{i}=Matred;

end;
matlabpool close;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...