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

Fré*_*din 2 parallel-processing matlab for-loop

我正在尝试在matlab并行度包中使用parfor循环.我对这个人有类似的问题:MATLAB parfor切片问题?.输出矩阵似乎不被识别为切片变量.在我的具体情况下,我正在尝试在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;
Run Code Online (Sandbox Code Playgroud)

PS我知道它可以将parfor放在k-loop而不是i-loop ......但是我仍然想把它放在i-loop上(我相信它会更节省时间)真实的节目).

非常感谢FrédéricGodin

Ram*_*nka 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
Run Code Online (Sandbox Code Playgroud)

这是一个时间比较:

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
Run Code Online (Sandbox Code Playgroud)

在我的机器上,第一个需要7秒,第二个需要0.3秒.

另外请注意,我已经改变了申报的Matx2Cell,以cell(n,1)因为cell(n)让一个n x n单元阵列.

  • @Amro:简短的回答是我不知道.我认为这是因为MATLAB不必考虑`Matred`是循环,切片,广播,缩小还是临时变量,因为它只在函数的工作空间中.当我在准备我的答案时看到减速时,我想这样做; 在过去,我发现最好通过调用函数使`parfor`的内容变得非常简单,因为依赖关系是显而易见的.在函数中你有很大的灵活性,例如你可以调用脚本,因为函数有自己的工作区. (3认同)