exponenta event banner

Убедитесь, что 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-loop работает, поскольку каждый элемент определяется только индексированной переменной цикла и не зависит от других переменных. for-циклы с независимыми задачами являются идеальными кандидатами для parfor-контуры.

Примечание

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

В примере элементы массива доступны в рабочей области клиента после parfor-loop, точно как с 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-loop, итерации выполняются последовательно, поэтому после d имеет значение, сохраненное в последней итерации цикла. В parfor-loop, однако, итерации выполняются параллельно, поэтому невозможно назначить d определенное значение в конце цикла. Эта ситуация также относится к переменной цикла i. Поэтому parforПоведение -loop определяется таким образом, чтобы оно не влияло на значения d и i вне контура. Их значения остаются прежними до и после цикла. Если переменные в parfor-loop не независимы, тогда вы можете получить ответы, отличные от ответов в for-луп. Таким образом, a parforПараметр -loop требует, чтобы каждая итерация была независимой от других итераций. Весь код, следующий за parfor оператор не должен зависеть от последовательности итерации цикла.

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

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

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

Для справки по другим обычным parfor проблемы см. в разделах Вложенная часть для и для петель и Другие части для требований.

См. также

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

Подробнее