Использование 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

Другие вопросы по тегам