2013-04-30 4 views
0

Я пытаюсь вычислить LU-разложение матрицы NxN в MATLAB с помощью параллельного инструментария. Я хотел бы использовать parfor, но есть проблема. Шаги для цикла зависят. Это пример моего разложения LU (столбцы):LU разложение параллельным MATLAB

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

Почему бы не ['lu()'] (http://www.mathworks.co.uk/help/matlab/ref/lu.html)? – Oleg

+2

Я бы рекомендовал использовать встроенный 'lu', который, я считаю, многопоточен и будет выполняться параллельно на многоядерной машине. –

ответ

0

В контракте на parfor содержится следующий несколько смутный комментарий «Ограничения распространяются на ЗАЯВЛЕНИЯ в теле цикла». Эти ограничения включают в себя все, что мешает этому быть embarrassingly parallel. В вашем случае каждый элемент L и U будет модифицирован несколькими циклами, что означает, что итерации цикла for потребуют некоторой координации, которая запускает проверки безопасности Matlab при использовании команд parfor.

Я был бы очень удивлен, если бы вы могли найти обходное решение для этого, не внеся существенного изменения в алгоритм.

Чтобы повторить предыдущие комментарии, встроенная команда lu должна быть очень эффективной. Как встроенный, его реализация, скорее всего, скомпилирована C или Fortan с интенсивным использованием лучших в классе библиотек линейной алгебры.

0

Как отмечает High Performance Mark, встроенный LU MATLAB многопоточен и, следовательно, почти гарантированно превосходит производительность любого, что вы можете попробовать в PARFOR на одной машине. Если у вас несколько машин, лучше всего использовать массив distributed.

matlabpool open mycluster 64 
d = distributed.rand(60000); 
[l, u] = lu(d); 
Смежные вопросы