2013-04-04 2 views
2

Я работаю над методом решетчатой ​​болтцман, и я написали код matlab. Я хотел бы распараллелить некоторые части кода, но я новичок в этом, поэтому я был бы признателен за вашу помощь. Я хотел бы знать, если это возможно, использовать parfor для этой части (оператор столкновений):использование parfor в matlab для кода решетки boltszmann

for i=1:lx 
    for j=1:ly 
     fork=1:9 
      f(k,i,j)=f(k,i,j) .* (1 - omega) + omega .* feq(k,i,j); 

     end 
    end 
end  

Я пытался заменить удаленные от центра цикл с parfor, но код, кажется медленнее.

любые предложения?

заранее спасибо

+0

Какова ценность 'lx' и' ly'? Я мог представить, что parfor будет на самом деле медленнее из-за накладных расходов, когда цикл for не является таким большим – Michiel

+0

lx и ly в коде установлены на 400. Я пытался использовать более высокие значения, но время итерации возрастает все больше и больше. – andylbm

+0

Я только что протестировал его на 1000x1000, а 'parfor' все еще медленнее, но относительно приближается к' for'. Однако я заметил, что 'parfor' полностью наводняет мою память этим циклом, вероятно, потому, что он пропускает большие матрицы вокруг. Может, в этом и проблема ?! – Michiel

ответ

2

Вы должны быть в состоянии сделать всю эту операцию с одной строки кода без петель:

f = f.*(1 - omega) + omega .* feq; 

На моем компьютере с 2 ядрами и, начиная с:

f = rand(9,400,400); 
feq = rand(9,400,400); 

[lx,ly,lz] = size(f); 

omega = rand(1); 

Ваша петля занимает 0.087933 секунды, цикл parfor занимает 1.166662 секунды, и этот метод принимает 0.009388 секунд. Если можете, всегда вектурируйте свой код.

+0

Большое вам спасибо за ваш ответ. Я уже вектурировал свой код и получаю ту же производительность, что и в вашем случае. Но я хотел бы знать, почему parfor занимает так много времени, чтобы сделать это вычисление. – andylbm

+0

Я думаю, что это накладные расходы. Поскольку фактическая операция в центре цикла выполняется очень быстро, все время берется в общении с пулом, поэтому нет никакой пользы для распараллеливания. Если бы операция была чем-то гораздо более облагаемым налогом, тогда накладные расходы на разговоры с пулом были бы одинаковыми, но медленная операция будет выполняться параллельно, и вы увидите общее улучшение скорости. – craigim

+0

Я думал, что это так, как вы говорите, я пытался использовать большие значения lx и ly, но время, затрачиваемое на вычисление, было больше и больше. не могли бы вы показать мне свой код с parfor, пожалуйста, чтобы я мог сравнить с моим? – andylbm