Чтобы потенциально ускорить выполнение, можно сгенерировать 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), чтобы поддержать общую память, многожильную генерацию кода. Если вы хотите распределенный параллелизм, используйте Параллельные вычисления продукт Toolbox™. По умолчанию MATLAB CODER использует до стольких ядер, сколько он находит доступным. Если вы задаете количество потоков, чтобы использовать, MATLAB CODER использует самое большее, что количество ядер для потоков, даже если дополнительные ядра доступны. Для получения дополнительной информации смотрите parfor
.
Поскольку тело цикла может выполниться параллельно на нескольких потоках, оно должно соответствовать определенным ограничениям. Если программное обеспечение MATLAB Coder обнаруживает циклы, которые не соответствуют спецификациям parfor
, оно производит ошибку. Для получения дополнительной информации см. parfor Ограничения.
parfor
- цикл может обеспечить лучшую скорость выполнения, чем свой аналогичный for
- цикл, потому что несколько потоков могут вычислить одновременно на том же цикле.
Каждое выполнение тела parfor
- цикл называется итерацией. Потоки оценивают итерации в произвольном порядке и друг независимо от друга. Поскольку каждая итерация независима, они не должны синхронизироваться. Если количество потоков равно количеству итераций цикла, каждый поток выполняет одну итерацию цикла. Если существует больше итераций, чем потоки, некоторые потоки выполняют больше чем одну итерацию цикла.
Например, когда цикл 100 итераций работает на 20 потоках, каждый поток выполняет пять итераций цикла одновременно. Если ваш цикл занимает много времени, чтобы запуститься из-за большого количества итераций или отдельных итераций, являющихся длинным, можно значительно уменьшить время выполнения с помощью нескольких потоков. В этом примере вы не можете, однако, получить улучшение 20 раз скорости из-за издержек распараллеливания, таких как создание потока и удаление.
Используйте parfor
, когда вы будете иметь:
Много итераций простого вычисления. parfor
делит итерации цикла на группы так, чтобы каждый поток выполнил одну группу итераций.
Итерация цикла, которая занимает много времени, чтобы выполниться. parfor
выполняет итерации одновременно на различных потоках. Несмотря на то, что это одновременное выполнение не уменьшает время, проведенное на отдельной итерации, это может значительно уменьшить полное время, проведенное на цикле.
Не используйте parfor
когда:
Итерация вашего цикла зависит от других итераций. Выполнение итераций параллельно может привести к ошибочным результатам.
Чтобы помочь вам избегать использования parfor
, когда итерация вашего цикла зависит от других итераций, MATLAB CODER задает твердую классификацию переменных. Для получения дополнительной информации смотрите Классификацию Переменных в циклах parfor. Если MATLAB CODER обнаруживает циклы, которые не соответствуют спецификациям parfor
, он не генерирует код и производит ошибку.
Сокращения являются исключением из правила, что итерации цикла должны быть независимыми. Переменная сокращения накапливает значение, которое зависит от всех итераций вместе, но независимо от порядка итерации. Для получения дополнительной информации смотрите Переменные Сокращения.
Существует только несколько итераций, которые выполняют некоторые простые вычисления.
Для небольшого количества итераций цикла вы не можете ускорить выполнение из-за издержек распараллеливания. Такие издержки включают время, потраченное для создания потока, синхронизации данных между потоками, и распараллеливают удаление.
Для parfor
- цикл, используйте этот синтаксис:
parfor i = InitVal:EndVal parfor (i = InitVal:EndVal)
Чтобы задать максимальное количество потоков, используйте этот синтаксис:
parfor (i = InitVal:EndVal,NumThreads)
Для получения дополнительной информации смотрите 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-файл.
Не используйте следующие построения в теле цикла parfor
: