Как вложить несколько циклов 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
что я ищу? Есть ли удобныйидиоматическая картина что кто то придумал?