Эта тема показывает вам, как использовать модель, которая сконфигурирована для параллельного выполнения с помощью явного разделения, и разверните его на цель. Чтобы настроить вашу модель для параллельного выполнения, смотрите, Конфигурируют Вашу Модель для Параллельного выполнения. Чтобы задать целевую архитектуру, смотрите, Задают Целевую архитектуру. Чтобы использовать явное разделение в модели, которая настраивается для параллельного выполнения, смотрите Раздел Ваша Модель Используя Явное Разделение.
Чтобы сгенерировать код для модели, которая сконфигурирована для параллельного выполнения в редакторе Simulink® окно, выбирают Code> C/C ++ Code> Build Model. Получившийся код включает:
Код С для частей модели, которые сопоставлены с задачами и триггерами в диалоговом окне Concurrent Execution. Генерация кода C требует лицензии Simulink Coder™. Для получения дополнительной информации смотрите Генерацию кода (Simulink Coder) и Генерация кода от Моделей Simulink (Embedded Coder).
HDL-код для частей модели, которые сопоставлены с аппаратными узлами в диалоговом окне Concurrent Execution. Генерация HDL-кода требует HDL лицензия Coder™. Для получения дополнительной информации смотрите генерацию HDL-кода от Simulink (HDL Coder).
Код, чтобы обработать передачу данных между параллельными задачами и триггерами и взаимодействовать через интерфейс с аппаратными и программными компонентами.
Сгенерированный код C содержит одну функцию для каждой задачи или триггера, заданного в системе. Задача и триггер определяют имя функции:
void <TriggerName>_TaskName(void);
Содержимое для каждой такой функции состоит из независимого от цели кода С, за исключением:
Соответствие кода блокируется, которые реализуют целевую функциональность
Индивидуальные настройки, включая выведенных от пользовательских классов памяти (см., Применяют Пользовательские Классы памяти к Отдельному Сигналу, состоянию и Элементам данных Параметра (Embedded Coder)), или Заменяющие Библиотеки Кода (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 и Встроенные цели Coder® обеспечивают цель в качестве примера, чтобы сгенерировать код для Windows®, Linux® и операционных систем Mac OS. Это известно как нативный пример потоков, который используется, чтобы развернуть вашу модель на настольной цели. Рабочий стол не может быть вашей итоговой целью, но может помочь профилировать и оптимизировать вашу модель, прежде чем вы развернете его на другой цели.
Если вы задали цель Embedded Coder, внесите следующие изменения в диалоговом окне Configuration Parameters.
Выберите Генерацию кода>, Шаблоны> Генерируют пример основной флажок программы.
От Генерации кода> Шаблоны> Целевой список Операционных систем, выберите NativeThreadsExample
.
Нажмите ОК, чтобы сохранить ваши изменения и закрыть диалоговое окно Configuration Parameters.
Примените эти настройки ко всем моделям, на которые ссылаются, в вашей модели.
Если вы настроили свою модель, нажмите Ctrl-B, чтобы создать и развернуть ее на вашем рабочем столе. Нативный пример потоков иллюстрирует, как Simulink Coder и Embedded Coder используют целевые API поточной обработки и примитивы управления данными, как показано в Поточной обработке API, Используемых Нативным Примером Потоков. Передача данных между одновременно выполняющимися задачами ведет себя, как описано в Опциях Передачи данных. Продукты кодера используют API на поддерживаемых целях для этого поведения, как описано в API Защиты данных и Синхронизации, Используемых Нативным Примером Потоков.
Аспект параллельного выполнения | Реализация Linux | Windows Implementation | Реализация Mac OS |
---|---|---|---|
Периодическое инициирующее событие | Таймер POSIX | Таймер Windows | Не применяется |
Апериодическое инициирующее событие | POSIX сигнал в реальном времени | Событие Windows | POSIX сигнал нев реальном времени |
Апериодический триггер | Для блоков, сопоставленных с апериодической задачей: распараллельте ожидание сигнала Для блоков, сопоставленных с апериодическим триггером: действие сигнала | Распараллельте ожидание события | Для блоков, сопоставленных с апериодической задачей: распараллельте ожидание сигнала Для блоков, сопоставленных с апериодическим триггером: действие сигнала |
Потоки | POSIX® | Windows | POSIX |
Приоритет потоков | Присвоенный на основе частоты дискретизации: самая быстрая задача имеет самый высокий приоритет | Класс приоритета наследован от родительского процесса. Присвоенный на основе частоты дискретизации: самая быстрая задача имеет самый высокий приоритет для первых трех самых быстрых задач. Остальная часть задач совместно использует самый низкий приоритет. | Присвоенный на основе частоты дискретизации: самая быстрая задача имеет самый высокий приоритет |
Пример превышенного обнаружения | Да | Да | Нет |
API | Реализация Linux | Windows Implementation | Реализация Mac OS |
---|---|---|---|
API защиты данных |
|
|
|
API синхронизации |
|
|
|
Профилируйте выполнение своего кода по многожильной цели с помощью панели Отчета Профиля диалогового окна Concurrent Execution. Можно профилировать Simulink Coder использования (GRT) и Embedded Coder (ERT) цели. Профилирование помогает вам идентифицировать области в своей модели, которые являются узкими местами выполнения. Можно анализировать время выполнения каждой задачи и найти задачу, которая занимает большую часть времени выполнения. Например, можно сравнить средние времена выполнения задач. Если задача является интенсивным вычислением, или не удовлетворяет требования в реальном времени и переполнения, можно повредить его в задачи, которые являются меньшим количеством интенсивного вычисления, и это может запуститься одновременно.
Когда вы генерируете отчет профиля, программное обеспечение:
Создает модель.
Генерирует код для модели.
Добавляют инструменты к сгенерированному коду, чтобы собрать данные.
Выполняет сгенерированный код на цели и собирает данные.
Сопоставляет данные, генерирует файл HTML (model_name_ProfileReport.html
) в текущей папке и отображения что файл HTML в панели Отчета Профиля диалогового окна Concurrent Execution.
Если отчет профиля HTML существует для модели, отображения панели Отчета Профиля тот файл. Чтобы сгенерировать новый отчет профиля, щелкнуть.
Раздел | Описание |
---|---|
Сводные данные | Обобщает образцовую статистику выполнения, такую как общее время выполнения и время создания отчета профиля. Это также перечисляет общее количество ядер на хост-машине. |
Время выполнения задачи | Отображает время выполнения, в микросекундах, для каждой задачи в цвете круговой диаграммы, закодированном задачей. Видимый для Windows, Linux и платформ Mac OS. |
Задача Affinitization к ядрам процессора | Зависимый платформы. Для каждого временного шага и задачи, отображается Simulink, ядро процессора нумеруют задачу, запущенную выполниться на в то время шаге, цвет, закодированный процессором. Если нет никакой задачи, запланированной для шага определенного времени, Видимый для Windows и платформ Linux. |
После того, как вы будете анализировать доклад профиля, будете полагать, что изменение отображения Блоков модели эффективно использует параллелизм, доступный в вашей многожильной системе (см. Блоки Карты к Задачам, Триггерам и Узлам).
Эта тема принимает ранее сконфигурированную модель, готовую профилироваться для параллельного выполнения. Для получения дополнительной информации смотрите, Конфигурируют Вашу Модель для Параллельного выполнения.
В диалоговом окне Concurrent Execution кликните по узлу отчета Профиля.
Инструмент профиля ищет файл с именем model_name_ProfileReport.html
. Если такой файл не существует для текущей модели, панель Отчета Профиля отображает следующее.
Если отчет профиля HTML существует для модели, отображения панели Отчета Профиля тот файл. Чтобы сгенерировать новый отчет профиля, щелкнуть.
Введите номер временных шагов, для которых вы хотите, чтобы профилировщик собрал данные для образцового выполнения.
Нажмите кнопку отчета профиля выполнения задачи Generate.
Это действие создает модель, генерирует код, добавляет инструменты сбора данных к коду и выполняет его на цели, которая также генерирует отчет профиля HTML. Этот процесс может занять несколько минут. Когда процесс завершен, содержимое отчета профиля появляется в панели Отчета Профиля. Например:
Профильный отчет показывает сводные данные, время выполнения для каждой задачи и отображение каждой задачи к ядрам процессора. Мы видим, что задачи 1 и 2 работают на базовом 0, где задачи 3 и 4 работают на базовом 1. Раздел Task Execution Time отчета указывает, что задача 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). В дополнение к тем возможностям настройки для многожильных и неоднородных целей можно далее настроить сгенерированный код можно следующим образом:
Можно указать предпочтительную реализацию взаимного исключения и примитивов синхронизации данных, пользующихся заменяющей библиотекой кода.
Можно задать пользовательский файл целевой архитектуры, который позволяет вам задавать целевые определенные свойства для задач и триггеров в диалоговом окне Concurrent Execution. Для получения дополнительной информации смотрите, Задают Пользовательский Файл Архитектуры.