Как вложить несколько циклов 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)

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