Ускорение алгоритма с использованием параллельных циклов для циклов (parfor)

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

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

A parfor-цикл, как и стандартный MATLAB for-loop, выполняет серию операторов (тело цикла) над областью значений значений. В отличие от 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 улучшают скорость выполнения

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

Каждое выполнение тела 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 Ограничения

  • The 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 переменные

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

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

    •  Функции встраивания

    •  Размотка циклов

    •  varargin/ varargout