В этом разделе показано, как использовать модель, настроенную для параллельного выполнения с использованием явного разбиения, и развернуть ее на целевом объекте. Чтобы настроить модель для параллельного выполнения, см. раздел Настройка модели для параллельного выполнения. Сведения о задании целевой архитектуры см. в разделе Указание целевой архитектуры. Сведения об использовании явного разбиения в модели, настроенной для параллельного выполнения, см. в разделе Разбиение модели с помощью явного разбиения.
Чтобы создать код для модели, настроенной для параллельного выполнения, на вкладке Приложения редактора Simulink ® выберите Coder Simulink. На вкладке C Code выберите Build. Результирующий код включает:
Код C для частей модели, сопоставленных с задачами и триггерами в диалоговом окне Параллельное выполнение (Concurrent Execution). Для создания кода C требуется лицензия Simulink Coder™. Дополнительные сведения см. в разделах Создание кода (Simulink Coder) и Создание кода на основе моделей Simulink (Embedded Coder).
Код HDL для частей модели, сопоставленных аппаратным узлам в диалоговом окне «Одновременное выполнение». Для создания кода HDL требуется лицензия HDL Coder™. Дополнительные сведения см. в разделе Создание кода HDL от Simulink (кодер HDL).
Код для обработки передачи данных между параллельными задачами и триггерами и для взаимодействия с аппаратными и программными компонентами.
Созданный код C содержит одну функцию для каждой задачи или триггера, определенного в системе. Задача и триггер определяют имя функции:
void <TriggerName>_TaskName(void);
Содержимое для каждой такой функции состоит из целевого независимого кода C, за исключением:
Код, соответствующий блокам, реализующим целевые функциональные возможности
Настройки, в том числе полученные из пользовательских классов хранения (см. раздел Организация данных параметров в структуру с использованием класса хранения Struct (встроенный кодер)) или библиотеки замены кода (Simulink Coder)
Код, генерируемый для обработки переноса данных между задачами. В частности, Simulink Coder использует целевые реализации примитивов взаимного исключения и семафоров синхронизации данных для реализации передачи данных, как описано в следующей таблице псевдокода.
| Передача данных | Инициализация | Читатель | Писатель |
|---|---|---|---|
Только целостность данных | BufferIndex = 0; Initialize Buffer[1] with IC | Begin mutual exclusion Tmp = 1 - BufferIndex; End mutual exclusiton Read Buffer[ Tmp ]; | Write Buffer[ BufferIndex ]; Begin mutual exclusion BufferIndex = 1 - BufferIndex; End mutual exclusion |
Обеспечить детерминизм (максимальная задержка) | WriterIndex = 0; ReaderIndex = 1; Initialize Buffer[1] with IC | Read Buffer[ ReaderIndex ]; ReaderIndex = 1 - ReaderIndex; | Write Buffer[ WriterIndex ] WriterIndex = 1 - WriterIndex; |
Обеспечение детерминизма (минимальная задержка) | Н/Д | Wait dataReady; Read data; Post readDone; | Wait readDone; Write data; Post dataReady; |
Только целостность данных Интерфейс C-HDL | Продукты Simulink Coder и HDL Coder используют преимущества целевых коммуникационных реализаций и устройств для управления передачей данных между аппаратными и программными компонентами. | ||
Сгенерированный код HDL содержит один проект HDL для каждого узла оборудования.
Цели Simulink Coder и Embedded Coder ® представляют собой пример цели для создания кода для операционных систем Windows ®, Linux ® и Mac OS. Он известен как собственный пример потоков, который используется для развертывания модели на рабочем столе. Возможно, рабочий стол не является конечной целью, но может помочь профилировать и оптимизировать модель перед развертыванием на другой цели.
Если указан целевой объект встроенного кодера, внесите следующие изменения в диалоговом окне «Параметры конфигурации».
Установите флажок Создание кода > Шаблоны > Создание примера основной программы.
В списке «Создание кода» > «Шаблоны» > «Целевая операционная система» выберите NativeThreadsExample.
Нажмите кнопку ОК, чтобы сохранить изменения и закрыть диалоговое окно Параметры конфигурации (Configuration Parameters).
Примените эти настройки ко всем ссылочным моделям в модели.
После настройки модели нажмите Ctrl-B, чтобы создать и развернуть ее на рабочем столе. Пример собственных потоков иллюстрирует, как Simulink Coder и Embedded Coder используют целевые API-интерфейсы многопоточности и примитивы управления данными, как показано в разделе Пример многопоточных API-интерфейсов, используемых собственными потоками. Передача данных между одновременно выполняемыми задачами выполняется так, как описано в разделе Параметры передачи данных. Продукты кодера используют API на поддерживаемых целевых устройствах для этого поведения, как описано в разделе Пример API защиты и синхронизации данных, используемых собственными потоками.
| Аспект параллельного выполнения | Реализация Linux | Реализация Windows | Реализация Mac OS |
|---|---|---|---|
Периодическое инициирующее событие | Таймер POSIX | Таймер Windows | Неприменимо |
Апериодическое запускающее событие | Сигнал POSIX в реальном времени | Событие Windows | Сигнал POSIX не в реальном времени |
Апериодический триггер | Для блоков, сопоставленных апериодической задаче: поток ожидает сигнала Для блоков, сопоставленных с апериодическим триггером: действие сигнала | Поток, ожидающий события | Для блоков, сопоставленных апериодической задаче: поток ожидает сигнала Для блоков, сопоставленных с апериодическим триггером: действие сигнала |
Нити | POSIX ® | Windows | POSIX |
Приоритет потоков | Назначается на основе времени выборки: самая быстрая задача имеет наивысший приоритет | Класс приоритета, унаследованный от родительского процесса. Назначается на основе времени выборки: самая быстрая задача имеет наивысший приоритет для первых трёх самых быстрых задач. Остальные задачи имеют наименьший приоритет. | Назначается на основе времени выборки: самая быстрая задача имеет наивысший приоритет |
Пример обнаружения переполнения | Да | Да | Нет |
| API | Реализация Linux | Реализация Windows | Реализация Mac OS |
|---|---|---|---|
| API защиты данных |
|
|
|
| API синхронизации |
|
|
|
Выполните профилирование выполнения кода на многоядерном целевом компьютере с помощью панели Отчет о профиле (Profile Report) диалогового окна Параллельное выполнение (Concurrent Execution). Для профилирования можно использовать цели Simulink Coder (GRT) и Embedded Coder (ERT). Профилирование помогает определить области модели, которые являются узкими местами выполнения. Можно проанализировать время выполнения каждой задачи и найти задачу, которая занимает большую часть времени выполнения. Например, можно сравнить среднее время выполнения задач. Если задача требует больших вычислений или не удовлетворяет требованиям и перерасходам в реальном времени, ее можно разбить на задачи, которые менее интенсивны и могут выполняться одновременно.
При создании отчета по профилю программное обеспечение:
Построение модели.
Создает код для модели.
Добавляет инструменты в созданный код для сбора данных.
Выполняет созданный код на целевом объекте и собирает данные.
Сопоставляет данные, создает HTML-файл (model_name_ProfileReport.html) в текущей папке и отображает этот HTML-файл на панели «Отчет о профиле» диалогового окна «Параллельное выполнение».
Примечание
Если для модели существует отчет о профиле HTML, этот файл отображается на панели Отчет о профиле (Profile Report). Для создания нового отчета по профилю нажмите.![]()
| Раздел | Описание |
|---|---|
Резюме | Суммирует статистику выполнения модели, например, общее время выполнения и время создания отчета профиля. В нем также указано общее количество ядер на хост-машине. |
Время выполнения задачи | Отображает время выполнения в микросекундах для каждой задачи в цвете круговой диаграммы, закодированном задачей. Отображается для платформ Windows, Linux и Mac OS. |
Аффинитизация задач к процессорным ядрам | Зависит от платформы. Для каждого временного шага и задачи Simulink отображает номер ядра процессора, который задача начала выполнять на этом временном шаге, цвет, закодированный процессором. Если задача не запланирована для определенного временного шага, Отображается для платформ Windows и Linux. |
После анализа отчета о профиле рассмотрите возможность изменения сопоставления блоков модели для эффективного использования параллелизма, доступного в многоядерной системе (см. Сопоставление блоков с задачами, триггерами и узлами).
В этом разделе предполагается, что предварительно настроенная модель готова к профилированию для параллельного выполнения. Дополнительные сведения см. в разделе Настройка модели для параллельного выполнения.
В диалоговом окне «Одновременное выполнение» выберите узел отчета «Профиль».
Инструмент профиля выполняет поиск файла с именем model_name_ProfileReport.html. Если такой файл не существует для текущей модели, на панели Отчет о профиле (Profile Report) отображается следующее.

Примечание
Если для модели существует отчет о профиле HTML, этот файл отображается на панели Отчет о профиле (Profile Report). Для создания нового отчета по профилю нажмите.![]()
Введите количество временных шагов, для которых профилировщик должен собирать данные для выполнения модели.
Нажмите кнопку Создать отчет о профиле выполнения задачи.
Это действие создает модель, создает код, добавляет средства сбора данных к коду и выполняет его в целевом объекте, который также создает отчет о профиле HTML. Этот процесс может занять несколько минут. По завершении процесса содержимое отчета о профиле отображается на панели Отчет о профиле. Например:

Отчет о профилировании показывает сводку, время выполнения для каждой задачи и сопоставление каждой задачи ядрам процессора. Мы видим, что задачи 1 и 2 выполняются на ядре 0, а задачи 3 и 4 - на ядре 1. В разделе «Время выполнения задачи» отчета указано, что задача 1 и задача 3 занимают наибольшее количество времени для выполнения. Следует отметить, что период задачи 3 в два раза превышает период задач 1 и 2, а период задачи 4 в два раза превышает период задачи 3.
Проанализируйте отчет по профилю. При необходимости создайте и измените сопоставление модели или задачи и повторно создайте отчет профиля.
Создать отчет о профиле в командной строке. Кроме того, в командной строке можно создать отчет о профиле для модели, настроенной для параллельного выполнения. Используйте Simulink.architecture.profile функция.
Например, создание отчета по профилю для модели slexMulticoreSolverExample:
Simulink.architecture.profile('slexMulticoreSolverExample');Создание отчета по профилю с определенным количеством образцов (100) для модели slexMulticoreSolverExample:
Simulink.architecture.profile('slexMulticoreSolverExample',120);Функция создает отчет о профиле с именем slexMulticoreSolverExample_ProfileReport.html в текущей папке.
Созданный код подходит для различных приложений и сред разработки. Для удовлетворения потребностей можно настроить созданный код C, как описано в разделе Целевая разработка (Embedded Coder). В дополнение к этим возможностям настройки, для многоядерных и разнородных целей можно дополнительно настроить созданный код следующим образом:
Можно зарегистрировать предпочтительную реализацию примитивов взаимного исключения и синхронизации данных с помощью библиотеки замены кода.
В диалоговом окне «Одновременное выполнение» можно определить пользовательский файл целевой архитектуры, который позволяет указать целевые свойства для задач и триггеров. Дополнительные сведения см. в разделе Определение файла пользовательской архитектуры.