for
- Реализация Цикла в Коде, Сгенерированном при помощи parforКогда вы генерируете код C/C++ для модели при помощи функции MATLAB, Системы MATLAB, и Для Каждого блока подсистемы, по умолчанию, генератор кода производит код, который реализует for
- циклы в одном потоке. Этот for
- цикл может быть оптимизирован для функции MATLAB и Системных блоков MATLAB. Итерации parfor
- цикл могут запуститься параллельно на нескольких ядрах на целевом компьютере.
Выполнение итераций параллельно может значительно улучшить скорость выполнения сгенерированного кода. Для получения дополнительной информации смотрите, Как циклы parfor Улучшают Скорость Выполнения.
Генератор кода реализует for
- циклы параллельно при помощи OpenMP.
Программное обеспечение Embedded Coder™ использует интерфейс приложения Open Multiprocessing (OpenMP), чтобы поддержать общую память, многожильную генерацию кода. По умолчанию Embedded Coder использует столько потоков, сколько он находит доступным. Если вы задаете количество потоков, чтобы использовать, Embedded Coder использует самое большее, что количество потоков, даже если дополнительные потоки доступны. Для получения дополнительной информации смотрите parfor
.
parfor
- цикл может обеспечить лучшую скорость выполнения, чем ее аналогичный for
- цикл, потому что несколько потоков могут вычислить одновременно на том же цикле.
Каждое выполнение тела parfor
- цикл называется итерацией. Потоки оценивают итерации в произвольном порядке и друг независимо от друга. Поскольку каждая итерация независима, потоки не должны синхронизироваться. Если количество потоков равно количеству итераций цикла, каждый поток выполняет одну итерацию цикла. Если количество итераций больше, чем количество потоков, некоторые потоки выполняют больше чем одну итерацию цикла.
Например, когда цикл 100 итераций работает на 20 потоках, каждый поток одновременно выполняет пять итераций цикла. Если ваш цикл занимает много времени, чтобы запуститься из-за большого количества итераций или длинных отдельных итераций, можно значительно уменьшать время выполнения при помощи нескольких потоков. В этом примере вы не можете получить улучшение 20 раз скорости из-за издержек распараллеливания, таких как создание потока и удаление.
Используйте parfor
, когда вы будете иметь:
Много итераций простого вычисления. parfor
делит итерации цикла на группы так, чтобы каждый поток выполнил одну группу итераций.
Итерация цикла, которая занимает много времени, чтобы выполниться. parfor
выполняет итерации одновременно на различных потоках. Несмотря на то, что это одновременное выполнение не уменьшает время, проведенное на отдельной итерации, это может значительно уменьшать полное время, проведенное на цикле.
Не используйте parfor
когда:
Итерация вашего цикла зависит от других итераций. Выполнение итераций параллельно может привести к ошибочным результатам.
Чтобы помочь вам избегать использования parfor
, когда итерация вашего цикла зависит от других итераций, Embedded Coder задает твердую классификацию переменных. Для получения дополнительной информации смотрите Классификацию Переменных в циклах parfor (MATLAB Coder). Если Встроено циклы Coderdetects, которые не соответствуют спецификациям parfor
, это не генерирует код и производит ошибку.
Сокращения являются исключением из правила, что итерации цикла должны быть независимыми. reduction variable накапливает значение, которое зависит от всех итераций вместе, но независимо от порядка итерации. Для получения дополнительной информации смотрите Переменные Сокращения (MATLAB Coder).
Существует только несколько итераций, которые выполняют некоторые простые вычисления.
Для небольшого количества итераций цикла вы не можете ускорить выполнение из-за издержек распараллеливания. Такие издержки включают время, потраченное для создания потока, синхронизации данных между потоками, и распараллеливают удаление.
Чтобы запустить циклы for параллельно в сгенерированном коде, запишите код в функции MATLAB или Систему MATLAB, блок с помощью parfor
.
Создайте модель Simulink™.
Добавьте функцию MATLAB или блок MATLAB System к модели.
Добавьте код в функцию MATLAB или блок MATLAB System.
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;
В Optimization панель выбирают опцию Maximize execution speed
из Приоритета (Simulink Coder) выпадающий список. Параметр Генерирует параллельные циклы for (Simulink Coder), автоматически выбран. Параметр позволяет компилятору вычислить циклы параллельно.
Соедините блоки.
Создайте модель и сгенерируйте код.
В сгенерированном коде прагма дает компилятору команду выполнять цикличное выполнение в циклах for параллели OpenMP посредством многопоточности:
#pragma omp parallel for num_threads(4 > omp_get_max_threads() ? omp_get_max_threads() : 4)
Номер 4
указывает на количество обработки потоков.
Поскольку тело цикла может выполниться параллельно на нескольких потоках, оно должно соответствовать определенным ограничениям. Если программное обеспечение Embedded Coder обнаруживает циклы, которые не соответствуют спецификациям parfor
, оно производит ошибку. Для получения дополнительной информации см. parfor Ограничения (MATLAB Coder).