2013-04-30 2 views
0

MATLAB에서 병렬 도구 상자를 사용하여 NxN 행렬의 LU 분해를 계산하려고합니다. 나는 parfor를 사용하고 싶지만 문제가있다. for 루프의 단계는 종속적입니다. 당신은 어떤 생각이 어떻게 parfor으로 해결해야합니까병렬 MATLAB에 의한 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 

: 이것은 내 LU 분해의 예 (열)인가? 감사합니다

+4

왜 ['lu()'] (http://www.mathworks.co.uk/help/matlab/ref/lu.html)하지 않습니까? – Oleg

+2

본질적으로'lu'를 사용하는 것이 좋습니다. 멀티 쓰레드로 멀티 코어 컴퓨터에서 병렬로 실행됩니다. –

답변

0

parfor에 대한 계약은 다음과 같은 다소 모호한 주석 "루프 본문의 STATEMENTS에 적용됩니다"를 포함합니다. 이러한 제한에는 embarrassingly parallel이되지 못하게하는 모든 내용이 포함됩니다. 귀하의 경우, L과 U의 각 요소는 다중 루프에 의해 수정됩니다. 이는 for 루프의 반복이 어떤 조정을 필요로하므로 parfor 명령 사용에 대한 Matlab의 안전성 검사를 트리거합니다.

알고리즘을 크게 변경하지 않고도이 문제를 해결할 수 있다면 매우 놀랄 것입니다.

이전 의견을 반영하려면 내장 된 lu 명령이 매우 효율적이어야합니다. 빌트인으로 구현하면 클래스 선형 대수 라이브러리에서 가장 많이 사용되는 컴파일 된 C 또는 Fortan이 가장 적합합니다.

0

고성능 마크가 지적한대로 MATLAB의 내장 LU는 멀티 스레드이므로 단일 시스템에서 PARFOR로 시도 할 수있는 성능을 훨씬 능가합니다. 여러 대의 기계를 가지고 있다면 가장 좋은 방법은 distributed 배열을 사용하는 것입니다.

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