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