Гарантируйте, Что parfor - Итерации цикла Независимы

Если вы получаете ошибку, когда вы преобразовываете for - циклы к parfor - циклы, гарантируете, что ваш parfor - итерации цикла независимы. parfor - итерации цикла не имеют никакого гарантируемого порядка, в то время как порядок итерации в for - циклы последователен. Также parfor - итерации цикла выполняются на различных рабочих MATLAB® в параллельном пуле, так, чтобы не было никакого обмена информацией между итерациями. Поэтому один parfor - итерация цикла не должна зависеть от результата предыдущей итерации. Единственное исключение к этому правилу должно накопить значения в цикле с помощью Переменных Сокращения.

Следующий пример приводит к эквивалентным результатам, с помощью for - циклу слева и parfor - цикл справа. Попробуйте пример в своем Окне Команды MATLAB:

clear A
for i = 1:8
   A(i) = i;
end
A
A =

     1     2     3     4     5     6     7     8
clear A
parfor i = 1:8
   A(i) = i;
end
A
A =

     1     2     3     4     5     6     7     8

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

Примечание

По умолчанию parfor автоматически запускает параллельный пул рабочих, если вы уже не запустили тот. parfor создает пул с помощью кластерного профиля по умолчанию, если вы установили свои параллельные настройки соответственно.

В примере элементы массива доступны в клиентской рабочей области после parfor - цикла, точно как с for - цикл.

Теперь используйте неиндексируемую переменную в цикле или переменную, индексация которой не зависит от переменной цикла i. Попробуйте эти примеры и отметьте значения d и i позже:

clear A
d = 0; i = 0;
for i = 1:4
   d = i*2;
   A(i) = d;
end
A
d
i
A =

     2     4     6     8

d =

     8

i =

     4
clear A
d = 0; i = 0;
parfor i = 1:4
   d = i*2;
   A(i) = d;
end
A
d
i
A =

     2     4     6     8

d =

     0

i =

     0

Несмотря на то, что элементы A являются тем же самым в обоих примерах, значение d не. В for - цикл, итерации выполняются последовательно, поэтому позже d имеет значение, которое это содержало в последней итерации цикла. В parfor - цикл, однако, итерации выполняется параллельно, таким образом, невозможно присвоить d заданное значение в конце цикла. Эта ситуация также применяется к переменной цикла i. Поэтому parfor - поведение цикла задано так, чтобы это не влияло на значения d и i вне цикла. Их значения остаются то же самое до и после цикла. Если переменные в вашем parfor - цикл весьма зависим, то вы можете получить различные ответы от тех в for - цикл. Таким образом, parfor - цикл требует, чтобы каждая итерация была независима от других итераций. Весь код, который следует за оператором parfor, не должен зависеть от последовательности итерации цикла.

Анализатор кода может помочь диагностировать, зависят ли итерации цикла. Код в примере показывает итерации, заданные с точки зрения предыдущей итерации:

   parfor k = 2:10
    x(k) = x(k-1) + k;
   end
Ищите сообщения Анализатора кода в редакторе MATLAB. В этом случае Анализатор кода сообщает о проблеме зависимости.

В других случаях, однако, Анализатор кода не может отметить зависимости.

Для справки с другими общими проблемами parfor смотрите Вложенный parfor и циклы for и Другие parfor Требования.

Смотрите также

Связанные примеры

Больше о