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