Как вложить несколько циклов parfor

parfor это удобный способ распределить независимые итерации интенсивных вычислений среди нескольких «рабочих». Одно значимое ограничение заключается в том, чтоparfor- циклы не могут быть вложенными, и это неизменно является ответом на подобные вопросы:там а такжетам.

Почему распараллеливание через границы цикла так желательно

Рассмотрим следующий фрагмент кода, где итерации занимают очень переменное количество времени на машине, которая позволяет 4 работникам. Оба цикла повторяют более 6 значений, которые трудно разделить между 4.

for row = 1:6
    parfor col = 1:6
        somefun(row, col);
    end
end

Кажется хорошей идеей выбрать внутренний цикл дляparfor потому что отдельные звонкиsomefun являются более переменными, чем итерации внешнего цикла. Но что, если время выполнения для каждого вызоваsomefun очень похоже? Что, если во время выполнения есть тренды и у нас есть три вложенных цикла? Эти вопросы регулярно возникают, и людикрайности.

Шаблон, необходимый для объединения петель

Идеально,somefun работает для всех парrow а такжеcolи работники должны быть заняты независимо от того, какая из них меняется. Решение должно выглядеть так

parfor p = allpairs(1:6, 1:6)
    somefun(p(1), p(2));
end

К сожалению, даже если бы я знал, какая встроенная функция создает матрицу со всеми комбинациямиrow а такжеcol, MATLAB пожаловался бы с ошибкойДиапазон оператора parfor должен быть вектором строки. Все же,for не будет жаловаться и красиво перебирать столбцы. Простой обходной путь - создать эту матрицу и затем проиндексировать ееparfor:

p = allpairs(1:6, 1:6);
parfor k = 1:size(pairs, 2)
    row = p(k, 1);
    col = p(k, 2);
    somefun(row, col);
end

Что такое встроенная функция вместоallpairs что я ищу? Есть ли удобныйидиоматическая картина что кто то придумал?

Ответы на вопрос(3)

Ваш ответ на вопрос