Использование parfor в matlab для вложенных циклов
Я хочу распараллелить block2 для каждого block1 и параллелизовать внешний цикл тоже.
предыдущий код:
for i=rangei <block1> for j=rangej <block2> dependent on <block1> end end
изменил код:
parfor i=rangei <block1> parfor j=rangej <block2> dependent on <block1> end end
насколько эффективно это может быть получено, и будет ли измененный код делать правильные вещи? Является ли измененный код действительным для моих требований?
4 ответа
В MATLAB, parfor
не может быть вложенным. Что означает, что в вашем коде вы должны заменить один parfor
по for
(внешняя петля скорее всего). В целом, я советую вам посмотреть этот урок на parfor.
parfor
не может быть вложенным. Во вложенных parfor
заявления, только самый внешний вызов parfor
паралеллизирован, что означает, что внутренний вызов parfor
только добавляет ненужные накладные расходы.
Чтобы получить высокую эффективность с parfor
количество итераций должно быть намного больше, чем количество рабочих (или точное кратное число, если каждая итерация занимает одно и то же время), и вы хотите, чтобы одна итерация занимала более нескольких миллисекунд, чтобы избежать ощущения издержек от паралеллизации,
parfor i=rangei
<block1>
for j=rangej
<block2> dependent on <block1>
end
end
может действительно соответствовать этому описанию, в зависимости от размера rangei
, В качестве альтернативы вы можете попытаться развернуть вложенный цикл в один цикл, где вы выполняете итерации по линейным индексам.
Следующий код использует один parfor
цикл, чтобы неявно управлять двумя вложенными циклами. loop1_index
а также loop2_index
диапазоны, а loop1_counter
а также loop2_counter
фактические итераторы цикла. Кроме того, итераторы располагаются в обратном порядке, чтобы обеспечить лучший баланс нагрузки, потому что обычно нагрузка с более высокими значениями диапазона больше, чем с меньшими значениями.
loop1_index = [1:5]
loop2_index = [1:4]
parfor temp_label_parfor = 1 : numel(loop1_index) * numel(loop2_index)
[loop1_counter, loop2_counter] = ind2sub([numel(loop1_index), numel(loop2_index)], temp_label_parfor)
loop1_counter = numel(loop1_index) - loop1_counter + 1;
loop2_counter = numel(loop2_index) - loop2_counter + 1;
end
Вы не можете использовать вложенный parfor, из вашего вопроса кажется, что вы работаете над матрицей (с параметром i,j), попробуйте использовать blockproc, перейдите по этой ссылке, как только blockproc