for
-Циклы в parfor
- ЦиклыВ некоторых случаях необходимо изменить код для преобразования for
-циклы к parfor
-циклы. В этом примере показано, как диагностировать и исправить parfor
-цикл задачи с использованием простого вложенного for
-цикл. Запустите этот код в MATLAB® и изучить результаты.
for x = 0:0.1:1 for y = 2:10 A(y) = A(y-1) + y; end end
Чтобы ускорить код, попробуйте преобразовать for
-циклы к parfor
-циклы. Заметьте, что этот код вызывает ошибки.
parfor x = 0:0.1:1 parfor y = 2:10 A(y) = A(y-1) + y; end end
В этом случае вы не можете просто преобразовать for
-циклы к parfor
-циклы без изменений. Чтобы это сработало, необходимо изменить код в нескольких местах. Чтобы диагностировать проблемы, найдите сообщения анализатора кода в редакторе MATLAB.
Этот код показывает общие проблемы, когда вы пытаетесь преобразовать for
-циклы к parfor
-циклы.
Чтобы решить эти проблемы, вы должны изменить код, который нужно использовать parfor
. Тело parfor
-цикл выполняется в параллельном пуле с использованием нескольких работники MATLAB в недетерминированном порядке. Поэтому вы должны соответствовать этим требованиям к телу parfor
-цикл:
Тело parfor
-цикл должен быть независимым. Одна итерация цикла не может зависеть от предыдущей итерации, потому что итерации выполняются параллельно в недетерминированном порядке. В примере,
A(y) = A(y-1) + y;
parfor
. Для следующих шагов в решении проблем независимости смотрите Убедитесь, что циклы parfor являются Независимыми.Вы не можете гнездить a parfor
-цикл внутри другого parfor
-цикл. Пример имеет два вложенных for
-циклы, и поэтому можно заменить только один for
-цикл с a parfor
-цикл. Вместо этого можно вызвать функцию, которая использует parfor
-цикл внутри тела другого parfor
-цикл. Однако такие вложенные parfor
-циклы не дают вам вычислительных преимуществ, потому что все работники используются для параллелизации самого внешнего цикла. Для получения справки по работе с вложенными циклами смотрите Вложенные parfor и for-Loops и Другие требования parfor.
parfor
Циклы должны быть последовательными увеличивающимися целыми числами. В примере,
parfor x = 0:0.1:1
parfor
здесь. Можно решить эту проблему, изменив значение переменной цикла на целочисленные значения, требуемые алгоритмом. Для следующих шагов в поиске и устранении проблем parfor
-цикл переменные, см., Гарантируйте, что переменные parfor-Loop являются последовательными увеличивающимися целыми числами.Вы не можете вырваться из parfor
-цикл рано, как вы можете в for
-цикл. Не включайте возврат или break в тело своего parfor
-цикл. Без связи другие образцы MATLAB, выполняющие цикл, не знают, когда остановить. В качестве альтернативы рассмотрим parfeval
.
Если у вас все еще есть проблемы с преобразованием for
-циклы к parfor
-циклы, см. «Поиск и устранение проблем с переменными в циклах parfor».
Совет
Вы можете профилировать a parfor
-циклы, использующие tic
и toc
для измерения скорости по сравнению с соответствующим for
-цикл. Использовать ticBytes
и tocBytes
для измерения объема данных, передаваемых работникам параллельного пула. Для получения дополнительной информации и примеров смотрите Профилирование циклов parfor.