Моделирование параллельного выполнения для симметричных многоядерных процессорных платформ

Используйте основанное на времени Simulink ® многозадачное планирование, чтобы симулировать и сгенерировать код для алгоритма приложения, захваченного в одной иерархии модели. Модель разработана и сконфигурирована для встраиваемой системы, предназначенной для выполнения на симметричной многоядерной многозадачной платформе.

Периодическая многоскоростная модель для многозадачного параллельного выполнения

Откройте пример модели rtwdemo_concurrent_execution. Модель сконфигурирована так, чтобы отображать закодированные в цвете шаги расчета с аннотациями. Чтобы увидеть их, после открытия модели обновите схему нажатием Ctrl + D. Для отображения легенды нажмите Ctrl + J.

Simulink поддерживает симуляцию параллельного выполнения задачи путем назначения разделов модели задачам, которые вы обозначаете, чтобы запускаться одновременно на многоядерном оборудовании. Используйте неявный или явный подход к обозначению разделов.

Неявное разбиение Simulink:

  • Разделяет модель на основе шагов расчета, заданных в модели.

  • Присваивает задачу каждой частоте дискретизации и определяет, что задачи выполняются одновременно.

  • Управляет зернистостью разбиений. Для примера вы не можете разделить частоту дискретизации на несколько задач.

  • Не накладывает ограничения моделирования.

  • Предоставляет готовые к использованию аппаратные решения, такие как решения, которые производит продукт Real-Time™ Simulink ®.

  • Не относится к автономной генерации производственного кода из-за отсутствия контроля над детализацией разбиений.

Явное разбиение:

  • Используйте Модель и Блоки Subsystem, чтобы разбить модель.

  • Создайте произвольное количество задач.

  • Simulink присваивает каждый раздел задаче.

  • Simulink накладывает ограничения моделирования.

  • Управляйте зернистостью перегородок.

  • Разделите частоту дискретизации на несколько задач.

  • Присвойте разделы различным процессорным ядрам.

  • Является для автономной генерации производственного кода из-за уровня управления, который у вас есть для гранулярности разделов.

Этот пример показывает явное разбиение.

Примите во внимание следующую периодическую многоскоростную модель, которая настроена для выполнения в многозадачном режиме.

  • Шаги расчета для блоков Inport In1_1s и In2_2s устанавливаются равные 1 и 2 секунды, соответственно.

  • Чтобы обеспечить четкое разбиение скоростей, шаги расчета для моделей SS1 и SS2 имеют значение 1.

  • Блок Rate Transition явно моделирует переход скорости.

Чтобы поддержать параллельное выполнение задач в многоядерном окружении во время выполнения, предыдущая модель была изменена:

  • Блок Integrator находится в блоке Model, сконфигурированном с дискретным решателем с фиксированным шагом и размером шага в две секунды.

  • Подсистемы SS1 и SS2 были преобразованы в блоки Model, сконфигурированные с помощью дискретного решателя с фиксированным шагом и размером шага в одну секунду.

  • Блок Sum находится в блоке Model, сконфигурированном с дискретным решателем с фиксированным шагом и размером шага в одну секунду. Другой опцией для блока Sum является размещение его в SS1 или SS2 и вычислите его значение, совпадающее с блоком Model. Для параллельного выполнения задач только блоки соединений, блоки Model и блоки Subsystem могут быть на корневом уровне модели.

  • Блок Rate Transition был удален.

Соответствующие настройки параметра конфигурации модели

  • Введите set Fixed-step.

  • Для решателя задано значение discrete (no continuous states).

  • Обрабатывайте каждую дискретную скорость как отдельную выбранную задачу.

  • Автоматический указатель перехода скорости для выбранной передачи данных. Необходимо, так как был удален блок Rate Transition.

  • Разрешить выполнение задач одновременно с выбранным целевым объектом.

Настройки параметров параллельного выполнения

Откройте диалоговое окно Параллельное выполнение путем нажатия Настроить задачи на панели Параметров конфигурации Решателя. Выбор параметра Разрешить одновременное выполнение задач на целевом объекте включает кнопку Настроить задачи.

Когда выбран, параметр Включить явное разбиение модели на разделы для параллельного поведения включает опции параллельного выполнения для модели верхнего уровня.

Щелкните Задачи и сопоставление, чтобы просмотреть задачи и отображение.

Simulink создает отображение по умолчанию для каждого раздела (блок Model), присваивая каждый раздел отдельной задаче. Simulink определяет, что каждый раздел выполняется одновременно, и моделирует эффекты задержки, которые накладывает передача данных между ядрами процессора. В этом диалоговом окне отображается отображение, состоящее из разделов, распределенных между двумя независимыми периодическими триггерами: SS1, SS2, и Sum сопоставлен с периодическими триггерами 1 и Integrator сопоставлен с периодическим триггером 2.

Планирование

Simulink ® моделирует модель на основе строения модели. Код, сгенерированный из модели, реализует ту же семантику выполнения. Simulink распространяет и использует шаги расчета блоков Inport, чтобы упорядочить выполнение блоков на основе многоядерной многозадачной платформы выполнения .

Для этой модели легенда шага расчета показывает неявную группировку скоростей. Красный цвет представляет самую быструю дискретную скорость. Green представляет вторую самую быструю дискретную скорость.

Сгенерированный код планирует субрейты в модели. В этом примере скорость для блока Inport In2_2s, зеленая скорость, является субрейтом. Сгенерированный код правильно переносит данные между тарифами.

Преимущества неявной группировки скорости Simulink:

  • Simulink не накладывает архитектурные ограничения на модель. Создайте модель, не накладывая в ней ограничений программной архитектуры.

  • Ваша среда выполнения не требует подробных сведений об базовом планировании функций и переносах данных между скоростями. Поэтому требования к интерфейсам модели упрощены. Среда выполнения использует сгенерированный код интерфейса, чтобы записать вход, вызвать функцию шага модели и считать выход.

  • Генератор кода оптимизирует код через скорости на основе семантики выполнения многозадачности.

Simulink применяет ограничения передачи данных:

  • Передача данных происходит между одной задачей чтения и одной задачей записи.

  • Задачи выполняются на одном процессоре.

  • Процессы не останавливаются и не перезапускаются, особенно во время передачи данных между задачами.

  • Использования чтения и записи переменных размером в байт являются атомарными.

Ваша среда выполнения может общаться с внешними устройствами для чтения и записи входов модели. Для примера модели внешние устройства с помощью блоков Simulink S-Function. Сгенерируйте код для этих блоков с остальной частью алгоритма.

Сгенерируйте код и отчет

Сгенерируйте код и отчет генерации кода. Пример модели генерирует отчет.

Просмотр сгенерированного кода

Из отчета генерации кода проверьте сгенерированный код.

  • ert_main.c является примером основной программы (среды выполнения) для модели. Этот код управляет выполнением кода модели путем косвенного вызова функций точки входа PeriodicTrigger1_OneSecond_step, PeriodicTrigger1_TwoSecond_step, и PeriodicTrigger2_OneSecond_step с функцией rtwdemo_concurrent_execution_step. Используйте этот файл в качестве начальной точки для кодирования среды выполнения.

  • rtwdemo_concurrent_execution.c содержит точки входа для кода, который реализует алгоритм модели. Этот файл включает скорость и код планирования задач.

  • rtwdemo_concurrent_execution.h объявляет структуры данных моделей и открытый интерфейс для точек входа модели и структур данных.

  • model_reference_types.h содержит определения типов мостов синхронизации. Эти определения типов генерируются для цели модели-ссылки или модели, содержащей блоки Model.

  • rtw_windows.h объявляет прототипы функций mutex и semaphore, которые используются сгенерированным кодом для параллельного выполнения на платформах Microsoft ® Windows ®.

  • rtwtypes.h определяет типы данных, структуры и макросы, которые требуются сгенерированному коду.

Интерфейс кода

Откройте и проверьте отчет по интерфейсам кода. Используйте информацию в этом отчете, чтобы записать код интерфейса для вашей среды выполнения:

  1. Включите сгенерированный заголовочный файл путем добавления директивы #include rtwdemo_concurrent_execution.h.

  2. Запишите входные данные в сгенерированный код для блоков Inport модели.

  3. Вызовите сгенерированные функции точки входа.

  4. Считайте данные из сгенерированного кода для блоков Outport модели.

Входные порты:

  • In1_1s типа данных real_T с размерностью 1

  • In2_2s типа данных real_T с размерностью 1

Функции точки входа:

  • Инициализация функции точки входа, void rtwdemo_concurrent_execution_initialize(void). При запуске вызовите эту функцию один раз.

  • Выход и обновление функции точки входа (шага), void PeriodicTrigger1_OneSecond_step(void). Периодически вызывайте эту функцию для одной из двух задач, которые требуют планирования с самой быстрой скоростью в модели. Для этой модели вызывайте функцию каждую секунду.

  • Выход и обновление функции точки входа, void PeriodicTrigger1_TwoSecond_step(void). Периодически вызывайте эту функцию на второй самой быстрой скорости в модели. Для этой модели вызывайте функцию каждые две секунды.

  • Выход и обновление функции точки входа, void PeriodicTrigger2_OneSecond_step(void). Периодически вызывайте эту функцию для второй задачи, которая требует планирования с самой быстрой скоростью в модели. Для этой модели вызывайте функцию каждую секунду.

Чтобы достичь выполнения в реальном времени, задайте задачу или поток для каждой функции шага точки входа. Триггерное выполнение каждой функции на основе таймера, который имеет ту же скорость, что и заданная функция. Операционная система динамически планирует задачи между ядрами или на основе отображения задач с ядрами.

Выходные порты:

  • Out1_1s типа данных real_T с размерностью 1

  • Out2_1s типа данных real_T с размерностью 1

Подробнее о