Matlab Parallelism工具箱:在parfor中堆叠循环

时间:2011-08-17 19:40:45

标签: for-loop parallel-processing matlab

我正在尝试在matlab并行度包中使用parfor循环。 我和这个家伙有类似的问题:MATLAB parfor slicing issue?。输出矩阵似乎不被识别为切片变量。在我的具体情况下,我正在尝试在parfor中堆叠使用其他for循环,并且我无法将其他线程中提出的解决方案应用于我的问题。以下是我正在尝试做的一个虚拟示例:

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-loop而不是i-loop上是有效的...但是我仍然想把它放在i-loop上(我相信它会更真实地节省我的时间)程序)。

非常感谢 FrédéricGodin

2 个答案:

答案 0 :(得分:5)

你可以将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 :(得分:1)

您需要将Matred移动到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;