exponenta event banner

Новообращенный for-Закольцовывает в parfor- Петли

В некоторых случаях необходимо изменить код для преобразования for-закольцовывает в parfor-контуры. В этом примере показано, как диагностировать и исправить parfor-закольцовывание проблем с использованием простого вложенного for-луп. Запустите этот код в MATLAB ® и проверьте результаты.

for x = 0:0.1:1
    for y = 2:10
        A(y) = A(y-1) + y;
    end
end

Чтобы ускорить код, попробуйте преобразовать for-закольцовывает в parfor-контуры. Обратите внимание, что этот код приводит к ошибкам.

parfor x = 0:0.1:1
    parfor y = 2:10
        A(y) = A(y-1) + y;
    end
end

В этом случае нельзя просто преобразовать for-закольцовывает в parfor-контуры без изменений. Чтобы это сработало, необходимо изменить код в нескольких местах. Для диагностики проблем найдите сообщения анализатора кода в редакторе MATLAB.

Этот код показывает распространенные проблемы при попытке преобразования for-закольцовывает в parfor-контуры.

Для решения этих проблем необходимо изменить код для использования parfor. Тело parfor-loop выполняется в параллельном пуле с использованием нескольких работников MATLAB в недетерминированном порядке. Следовательно, вы должны соответствовать этим требованиям для тела parfor-loop:

  1. Тело parfor-loop должен быть независимым. Одна итерация цикла не может зависеть от предыдущей итерации, поскольку итерации выполняются параллельно в недетерминированном порядке. В примере:

    A(y) = A(y-1) + y;
    не является независимым, и поэтому вы не можете использовать parfor. Дальнейшие шаги по решению проблем независимости см. в разделе Обеспечение независимости итераций Parfor-Loop.

  2. Нельзя вложить parfor-закольцовывание внутри другого parfor-луп. В примере есть два вложенных for-циклы, поэтому можно заменить только один for-закольцовывание с помощью parfor-луп. Вместо этого можно вызвать функцию, использующую parfor-закольцовывание внутри тела другого parfor-луп. Однако такие вложенные parfor-циклы не дают вычислительной выгоды, так как все работники используются для параллелизма самого внешнего цикла. Дополнительные сведения о вложенных контурах см. в разделах Вложенные контуры для и для контуров и Другие контуры для требований.

  3. parforПеременные -loop должны быть последовательными увеличивающимися целыми числами. В примере:

    parfor x = 0:0.1:1
    имеет не целочисленные переменные цикла, поэтому нельзя использовать parfor здесь. Эту проблему можно решить, изменив значение переменной цикла на целочисленные значения, требуемые алгоритмом. Для выполнения следующих действий по устранению неполадок parfor-loop переменные, см. раздел Убедитесь, что переменные parfor-Loop являются последовательными увеличивающимися целыми числами.

  4. Вы не можете вырваться из parfor-закольцовывать рано, как можно в for-луп. Не включать оператор возврата или разрыва в тело parfor-луп. Без связи другие экземпляры MATLAB, выполняющие цикл, не знают, когда следует остановиться. В качестве альтернативы рассмотрим parfeval.

    Если по-прежнему возникают проблемы с преобразованием for-закольцовывает в parfor-контуры см. в разделе Устранение неполадок переменных в элементах parfor-Loops.

Совет

Можно профилировать parfor-циклы с использованием tic и toc для измерения ускорения по сравнению с соответствующим for-луп. Использовать ticBytes и tocBytes для измерения объема данных, переносимых к работникам и от них в параллельном пуле. Дополнительные сведения и примеры см. в разделе Профилирование циклов parefor.

См. также

| |

Связанные темы