Убедитесь, что 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 Требования.

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

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

Больше о