0

我正在尝试使用并行工具箱在 MATLAB 中计算 NxN 矩阵的 LU 分解。我想使用 parfor 但有一个问题。for 循环中的步骤是依赖的。这是我的 LU 分解(列)的示例:

function[L, U] = LU_col(A)  

n=size(A,1);
L=eye(n);
U=A    

for k=1:n-1
 L(k+1:n,k) = U(k+1:n,k)/U(k,k);
 for j=k+1:n
   U(k+1:n,j) = U(k+1:n,j) - L(k+1:n,k)*U(k,j);
 end
end

end

你知道如何用 parfor 解决它吗?谢谢

4

2 回答 2

0

正如 High Performance Mark 所指出的,MATLAB 的内置 LU 是多线程的,因此几乎可以保证在单台机器上击败您在 PARFOR 中尝试的任何东西的性能。如果您有几台机器,最好的选择是使用分布式阵列。

matlabpool open mycluster 64
d = distributed.rand(60000);
[l, u] = lu(d);
于 2013-05-01T07:34:04.043 回答
0

的合同parfor包括以下有点模糊的评论“限制适用于循环体中的声明”。这些限制包括任何阻止这种尴尬平行的东西。在您的情况下,L 和 U 的每个元素都将被多个循环修改,这意味着 for 循环的迭代需要一些协调,这会触发 Matlab 对parfor命令使用的安全检查。

如果您能找到解决方法,而无需对算法进行重大更改,我会感到非常惊讶。

为了回应先前的评论,内置lu命令应该非常有效。作为一个内置的,它的实现很可能是编译的 C 或 Fortan,大量使用了一流的线性代数库。

于 2013-04-30T17:57:08.077 回答