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