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 Требования.