Ускорение алгоритма Используя параллельные циклы for (parfor)

Параллельные циклы for (parfor) в сгенерированном коде

Чтобы потенциально ускорить выполнение, можно сгенерировать MEX-функции или код C/C++ из кода MATLAB®, который содержит параллельные циклы for (parfor- циклы).

parfor- цикл, как стандартный MATLAB for- цикл, выполняет серию операторов (тело цикла) в области значений значений. В отличие от for- цикл, однако, итерации parfor- цикл может запуститься параллельно на нескольких ядрах на целевом компьютере.

Выполнение итераций параллельно может значительно улучшить скорость выполнения сгенерированного кода. Для получения дополнительной информации смотрите, Как циклы parfor Улучшают Скорость Выполнения.

Примечание

Параллельное выполнение происходит только в сгенерированных MEX-функциях или коде C/C++; не оригинальный код MATLAB. Чтобы ускорить ваш код MATLAB, сгенерируйте MEX-функцию от parfor- цикл. Затем вызовите MEX-функцию из своего кода. Для получения дополнительной информации смотрите Рабочий процесс для Ускорения алгоритмов MATLAB.

Программное обеспечение MATLAB Coder™ использует интерфейс приложения Open Multiprocessing (OpenMP), чтобы поддержать общую память, многожильную генерацию кода. Если вы хотите распределенный параллелизм, используйте продукт Parallel Computing Toolbox™. По умолчанию MATLAB Coder использует до стольких ядер, сколько он находит доступным. Если вы задаете количество потоков, чтобы использовать, MATLAB Coder использует самое большее, что количество ядер для потоков, даже если дополнительные ядра доступны. Для получения дополнительной информации смотрите parfor.

Поскольку тело цикла может выполниться параллельно на нескольких потоках, оно должно соответствовать определенным ограничениям. Если программное обеспечение MATLAB Coder обнаруживает циклы, которые не соответствуют parfor технические требования, это производит ошибку. Для получения дополнительной информации см. parfor Ограничения.

Как циклы parfor Улучшают Скорость Выполнения

parfor- цикл может обеспечить лучшую скорость выполнения, чем ее аналогичный for- цикл, потому что несколько потоков могут вычислить одновременно на том же цикле.

Каждое выполнение тела parfor- цикл называется итерацией. Потоки оценивают итерации в произвольном порядке и друг независимо от друга. Поскольку каждая итерация независима, они не должны синхронизироваться. Если количество потоков равно количеству итераций цикла, каждый поток выполняет одну итерацию цикла. Если существует больше итераций, чем потоки, некоторые потоки выполняют больше чем одну итерацию цикла.

Например, когда цикл 100 итераций работает на 20 потоках, каждый поток выполняет пять итераций цикла одновременно. Если ваш цикл занимает много времени, чтобы запуститься из-за большого количества итераций или отдельных итераций, являющихся длинным, можно значительно уменьшать время выполнения с помощью нескольких потоков. В этом примере вы не можете, однако, получить улучшение 20 раз скорости из-за издержек распараллеливания, таких как создание потока и удаление.

Когда Использовать циклы parfor

Использование parfor когда вы имеете:

  • Много итераций простого вычисления. parfor делит итерации цикла на группы так, чтобы каждый поток выполнил одну группу итераций.

  • Итерация цикла, которая занимает много времени, чтобы выполниться. parfor выполняет итерации одновременно на различных потоках. Несмотря на то, что это одновременное выполнение не уменьшает время, проведенное на отдельной итерации, это может значительно уменьшать полное время, проведенное на цикле.

Если не Использовать циклы parfor

Не использовать parfor когда:

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

    Помочь вам избегать использования parfor когда итерация вашего цикла зависит от других итераций, MATLAB Coder задает твердую классификацию переменных. Для получения дополнительной информации смотрите Классификацию Переменных в циклах parfor. Если MATLAB Coder обнаруживает циклы, которые не соответствуют parfor технические требования, это не генерирует код и производит ошибку.

    Сокращения являются исключением из правила, что итерации цикла должны быть независимыми. reduction variable накапливает значение, которое зависит от всех итераций вместе, но независимо от порядка итерации. Для получения дополнительной информации смотрите Переменные Сокращения.

  • Существует только несколько итераций, которые выполняют некоторые простые вычисления.

    Примечание

    Для небольшого количества итераций цикла вы не можете ускорить выполнение из-за издержек распараллеливания. Такие издержки включают время, потраченное для создания потока, синхронизации данных между потоками, и распараллеливают удаление.

Синтаксис цикла parfor

  • Для parfor- цикл, используйте этот синтаксис:

    parfor i = InitVal:EndVal 
    parfor (i = InitVal:EndVal) 
    

  • Чтобы задать максимальное количество потоков, используйте этот синтаксис:

    parfor (i = InitVal:EndVal,NumThreads) 
    

Для получения дополнительной информации смотрите parfor.

Ограничения parfor

  • parfor цикл не поддерживает синтаксис:

    parfor (i=initVal:step:endVal) 
    parfor i=initVal:step:endVal

  • Необходимо использовать компилятор, который поддерживает интерфейс приложения Open Multiprocessing (OpenMP). См. Поддерживаемые Компиляторы. Если вы используете компилятор, который не поддерживает OpenMP, MATLAB Coder обрабатывает parfor- циклы как for- циклы. В сгенерированной MEX-функции или коде C/C++, итерации цикла работают на одном потоке.

  • Интерфейс приложения OpenMP не совместим с компиляцией JIT MEX. Смотрите, что JIT-компиляция Не Поддерживает OpenMP.

  • Тип индекса цикла должен быть представимым целочисленным типом на целевом компьютере. Используйте тип, который не требует типа многословного в сгенерированном коде.

  • parfor поскольку автономная генерация кода требует подхода набора инструментальных средств для создания исполняемых файлов или библиотек. Не изменяйте настройки, которые заставляют генератор кода использовать подход make-файла шаблона. См. Проект, или Настройка Использует Make-файл Шаблона.

  • Не используйте следующие построения в теле a parfor цикл:

    •  Вложенные циклы parfor

    •  Операторы завершения и операторы возврата

    •  Глобальные переменные

    •  Сокращения на классах MATLAB

    •  Сокращения на char переменные

    •  Сокращения с помощью внешнего кода С

    •  Внешние вызовы функции

    •  Встраивание функций

    •  Разворачивание циклов

    •  vararginvarargout