for-Закольцовывание реализации в коде, созданном с помощью parforПри создании кода C/C + + для модели с использованием функции MATLAB, системы MATLAB и блока подсистемы «Для каждого» по умолчанию генератор кода создает код, реализующий for- петли в одном потоке. Это for-loop можно оптимизировать для блоков MATLAB Function и MATLAB System. Итерации parfor-loop может выполняться параллельно на нескольких ядрах на целевом оборудовании.
Параллельное выполнение итераций может значительно повысить скорость выполнения созданного кода. Дополнительные сведения см. в разделе Как Parfor-Loops повысить скорость выполнения.
Генератор кода реализует for-закольцовывается параллельно с помощью OpenMP.
Программное обеспечение Embedded Coder™ использует интерфейс приложения Open Multi Processing (OpenMP) для поддержки создания многоядерного кода с общей памятью. По умолчанию Embedded Coder использует столько потоков, сколько он найдет доступным. Если указано количество используемых потоков, Embedded Coder использует не более этого числа потоков, даже если доступны дополнительные потоки. Дополнительные сведения см. в разделе parfor.
A parfor-loop может обеспечить лучшую скорость выполнения, чем аналогичный for-закольцовывание, поскольку несколько потоков могут одновременно вычисляться в одном цикле.
Каждое выполнение тела parfor-loop называется итерацией. Потоки вычисляют итерации в произвольном порядке и независимо друг от друга. Поскольку каждая итерация независима, потоки не должны синхронизироваться. Если число потоков равно числу итераций цикла, каждый поток выполняет одну итерацию цикла. Если число итераций больше числа потоков, некоторые потоки выполняют более одной итерации цикла.
Например, когда цикл из 100 итераций выполняется в 20 потоках, каждый поток одновременно выполняет пять итераций цикла. Если цикл выполняется долго из-за большого количества итераций или длительных отдельных итераций, можно значительно сократить время выполнения, используя несколько потоков. В этом примере скорость может не увеличиться в 20 раз из-за накладных расходов на параллелизацию, таких как создание и удаление потоков.
Использовать parfor когда у вас есть:
Множество итераций простого вычисления. parfor разделяет итерации цикла на группы так, что каждый поток выполняет одну группу итераций.
Итерация цикла, выполнение которой занимает много времени. parfor выполняет итерации одновременно в различных потоках. Хотя это одновременное выполнение не сокращает время, затрачиваемое на индивидуальную итерацию, оно может значительно сократить общее время, затрачиваемое на цикл.
Не использовать parfor когда:
Итерация цикла зависит от других итераций. Параллельное выполнение итераций может привести к ошибочным результатам.
Чтобы избежать использования parfor если итерация цикла зависит от других итераций, Embedded Coder задает жесткую классификацию переменных. Дополнительные сведения см. в разделе Классификация переменных в цикле parfor-Loops. Если Embedded Coder обнаруживает петли, которые не соответствуют parfor спецификации не генерируют код и приводят к ошибке.
Сокращения являются исключением из правила, согласно которому итерации цикла должны быть независимыми. Понижающая переменная накапливает значение, которое зависит от всех итераций вместе, но не зависит от порядка итераций. Дополнительные сведения см. в разделе Переменные сокращения.
Существует только несколько итераций, которые выполняют некоторые простые вычисления.
Примечание
Для небольшого числа итераций цикла можно не ускорить выполнение из-за накладных расходов на параллелизацию. Такие накладные расходы включают в себя время, необходимое для создания потока, синхронизации данных между потоками и удаления потока.
Для каждой подсистемы содержит S-функциональный блок. Созданный код не будет содержать parfor.
Для параллельного выполнения циклов в сгенерированном коде запишите код в функцию MATLAB или систему MATLAB с помощью parfor.
Создайте модель Simulink™.
Добавьте в модель функцию MATLAB или системный блок MATLAB.
Добавьте код к функции MATLAB или системному блоку MATLAB.
function y = access3a(u) %#codegen % Copyright 2010 The MathWorks, Inc. persistent pA; if isempty(pA) pA = 0; end A = ones(20,50); t = 0; parfor (i = 1:10,4) A(i,1) = A(i,1) + 1; end y = A(1,4) + u + t + pA;
На панели «Оптимизация» выберите Maximize execution speed из выпадающего списка Приоритет. Автоматически выбирается параметр «Генерировать параллельные контуры». Параметр позволяет компилятору вычислять циклы параллельно.
Подключите блоки.

Создайте модель и создайте код.
В сгенерированном коде прагматика предписывает компилятору выполнять циклы в OpenMP parallel for-loops посредством многопоточности:
#pragma omp parallel for num_threads(4 >
omp_get_max_threads() ? omp_get_max_threads() : 4)Число 4 указывает количество потоков обработки.
Поскольку тело цикла может выполняться параллельно на нескольких потоках, оно должно соответствовать определенным ограничениям. Если программное обеспечение Embedded Coder обнаруживает петли, которые не соответствуют parfor спецификации, это приводит к ошибке. Дополнительные сведения см. в разделе раздел Ограничения.