通过并行MATLAB进行LU分解

时间:2013-04-30 17:25:43

标签: matlab parallel-processing

我正在尝试使用并行工具箱在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来解决它吗?感谢

2 个答案:

答案 0 :(得分:0)

parfor的合同包括以下有些模糊的评论“限制适用于循环体中的STATEMENTS”。这些限制包括阻止其成为embarrassingly parallel的任何内容。在你的情况下,L和U的每个元素将被多个循环修改,这意味着for循环的迭代需要一些协调,这触发了Matlab对parfor命令的使用的安全性检查。

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

要回显先前的注释,内置的lu命令应该非常有效。作为内置函数,它的实现很可能是编译C或Fortan,大量使用最佳的线性代数库。

答案 1 :(得分:0)

正如高性能Mark指出的那样,MATLAB的内置LU是多线程的,因此几乎可以保证在单台机器上击败PARFOR中的任何性能。如果您有多台机器,最好的办法是使用distributed阵列。

matlabpool open mycluster 64
d = distributed.rand(60000);
[l, u] = lu(d);