exponenta event banner

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

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

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

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

Параллельное выполнение итераций может значительно повысить скорость выполнения созданного кода. Дополнительные сведения см. в разделе Как Parfor-Loops повысить скорость выполнения.

Примечание

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

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

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

Как Parfor-Loops повышает скорость выполнения

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

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

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

Когда использовать Parfor-Loops

Использовать parfor когда у вас есть:

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

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

Если не использовать Parfor-Loops

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

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

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

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

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

    Примечание

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

Синтаксис parfor-Loop

  • Для parfor-loop, используйте следующий синтаксис:

    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 для создания автономного кода требуется подход, основанный на цепочке инструментов, для создания исполняемых файлов или библиотек. Не изменяйте параметры, которые заставляют генератор кода использовать подход makefile шаблона. См. раздел Проект или конфигурация с использованием Makefile шаблона.

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

    •  Вложенные пакетные циклы

    •  Выписки о разрыве и возврате

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

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

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

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

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

    •  Встроенные функции

    •  Разворот петель

    •  varargin/varargout