Оптимизация и развертывание на многоядерном объекте

В этом разделе показано, как использовать модель, которая сконфигурирована для параллельного выполнения с помощью явного разбиения и развертывания ее на целевой объект. Чтобы настроить модель для параллельного выполнения, смотрите Сконфигурируйте модель для параллельного выполнения. Чтобы задать целевую архитектуру, см. Раздел «Задание целевой архитектуры». Чтобы использовать явное секционирование в модели, которая настроена для параллельного выполнения, смотрите Раздел Ваша модель Используя явное секционирование.

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

Чтобы сгенерировать код для модели, которая сконфигурирована для параллельного выполнения, на вкладке Apps Simulink® редактор, выберите Simulink Coder. На вкладке C Code выберите Build. Получившийся код включает в себя:

  • Код С для частей модели, которые сопоставлены с задачами и триггерами в диалоговом окне Параллельное выполнение. Для генерации кода C требуется лицензия Simulink Coder™. Для получения дополнительной информации смотрите Генерацию кода (Simulink Coder) и Генерацию кода из моделей Simulink (Embedded Coder).

  • HDL-код для частей модели, которые сопоставлены с аппаратными узлами в диалоговом окне Параллельное выполнение. Для генерации 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 и Embedded Coder® целевые системы предоставляют пример целевого объекта для генерации кода для Windows®, Linux® и операционные системы Mac OS. Он известен как native threads example, который используется для развертывания вашей модели на рабочем столе. Рабочий стол может не быть вашим конечным объектом, но может помочь профилировать и оптимизировать вашу модель, прежде чем развертывать ее на другой цели.

Если вы задали цель Embedded Coder, внесите следующие изменения в диалоговом окне Параметров конфигурации.

  1. Установите флажок Code Generation > Templates > Generate an example main program.

  2. Из списка Code Generation Templates > Target Operating System > выберите NativeThreadsExample.

  3. Нажмите кнопку OK, чтобы сохранить изменения и закрыть диалоговое окно Параметры конфигурации.

  4. Примените эти настройки ко всем ссылочным моделям в модели.

После настройки модели нажмите Ctrl-B, чтобы создать и развернуть ее на рабочем столе. Пример нативных потоков иллюстрирует, как Simulink Coder и Embedded Coder используют специфичные для целевого устройства API и примитивы управления данными, как показано на примере многопоточных API, используемых нативными потоками. Передача данных между одновременно выполняемыми задачами выполняется так, как описано в опциях передачи данных». Продукты кодера используют API на поддерживаемых целях для этого поведения, как описано в примере защиты данных и синхронизации API, используемых собственными потоками.

Пример многопоточных API-интерфейсов, используемых собственными потоками

Аспект параллельного выполненияРеализация LinuxРеализация WindowsРеализация Mac OS

Периодическое триггерное событие

POSIX-таймер

Таймер Windows

Не применяется

Апериодическое триггерное событие

Сигнал POSIX в реальном времени

Событие Windows

Сигнал POSIX не в реальном времени

Апериодический триггер

Для блоков, сопоставленных с апериодической задачей: поток, ожидающий сигнала

Для блоков, сопоставленных с апериодическим триггером: действие сигнала

Поток, ожидающий события

Для блоков, сопоставленных с апериодической задачей: поток, ожидающий сигнала

Для блоков, сопоставленных с апериодическим триггером: действие сигнала

Нити

POSIX®

Windows

POSIX

Приоритет потоков

Назначено на основе шага расчета: самая быстрая задача имеет самый высокий приоритет

Класс приоритета унаследован от родительского процесса.

Назначается на основе шага расчета: самая быстрая задача имеет наивысший приоритет для первых трех самых быстрых задач. Остальные задачи имеют самый низкий приоритет.

Назначено на основе шага расчета: самая быстрая задача имеет самый высокий приоритет

Пример обнаружения переполнения

Да

Да

Нет

Пример API защиты данных и синхронизации, используемых собственными потоками

APIРеализация LinuxРеализация WindowsРеализация Mac OS
API защиты данных
  • pthread_mutex_init

  • pthread_mutex_destroy

  • pthread_mutex_lock

  • pthread_mutex_unlock

  • CreateMutex

  • CloseHandle

  • WaitForSingleObject

  • ReleaseMutex

  • pthread_mutex_init

  • pthread_mutex_destroy

  • pthread_mutex_lock

  • pthread_mutex_unlock

API синхронизации
  • sem_init

  • sem_destroy

  • sem_wait

  • sem_post

  • CreateSemaphore

  • CloseHandle

  • WaitForSingleObject

  • ReleaseSemaphore

  • sem_open

  • sem_unlink

  • sem_wait

  • sem_post

Профилирование и оценка явно секционированных моделей на рабочем столе

Профилируйте выполнение кода на многоядерном целевом устройстве с помощью панели Profile Report диалогового окна Параллельное выполнение. Профилировать можно с помощью Simulink Coder (GRT) и Embedded Coder (ERT) целевых устройств. Профилирование помогает вам идентифицировать области в модели, которые являются узкими местами выполнения. Можно проанализировать время выполнения каждой задачи и найти задачу, которая занимает большую часть времени выполнения. Для примера можно сравнить средние времена выполнения задач. Если задача является интенсивной в расчетах или не удовлетворяет требованиям реального времени и переполнениям, можно разбить ее на задачи, которые менее интенсивны в расчетах и которые могут запускаться одновременно.

Когда вы генерируете отчет профиля, программное обеспечение:

  1. Создает модель.

  2. Генерирует код для модели.

  3. Добавляет тулинг к сгенерированному коду для сбора данных.

  4. Выполняет сгенерированный код на цели и собирает данные.

  5. Собирает данные, генерирует HTML файла (model_name_ProfileReport.html) в текущей папке и отображениях, который HTML файла в панели Profile Report диалогового окна Параллельное выполнение.

    Примечание

    Если для модели существует отчет профиля HTML, на панели Profile Report отображается этот файл. Чтобы сгенерировать новый отчет профиля, щелкните.

РазделОписание

Сводные данные

Суммирует статистику выполнения модели, такую как общее время выполнения и время создания отчета профиля. В нем также указывается общее количество ядер на хост-машине.

Время выполнения задачи

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

Отображается для платформ Windows, Linux и Mac OS.

Аффинитизация задачи к ядрам процессора

Зависящая от платформы. Для каждого временного шага и задачи Simulink отображает номер ядра процессора, на котором задача начала выполняться в то время шаг, закодированный процессором.

Если задача не запланирована на конкретный временной шаг, NR отображается.

Отображается для платформ Windows и Linux.

После анализа отчета профиля рассмотрите изменение отображения блоков Model для эффективного использования параллелизма, доступного в многоядерной системе (см. «Сопоставление блоков с задачами», «Триггеры» и «Узлы»).

Сгенерируйте отчет профиля

В этой теме подразумевается, что предварительно сконфигурированная модель готова к профилированию для параллельного выполнения. Для получения дополнительной информации смотрите Настройте модель для параллельного выполнения.

  1. В диалоговом окне Параллельное выполнение щелкните узел Profile report.

    Инструмент профиля ищет файл с именем model_name_ProfileReport.html. Если такой файл не существует для текущей модели, на панели Profile Report отображается следующее.

    Примечание

    Если для модели существует отчет профиля HTML, на панели Profile Report отображается этот файл. Чтобы сгенерировать новый отчет профиля, щелкните.

  2. Введите количество временных шагов, для которых профилировщик должен собирать данные для выполнения модели.

  3. Нажмите кнопку Generate task execution profile report.

    Это действие строит модель, генерирует код, добавляет тулинг набора данных в код и выполняет его на целевом объекте, который также генерирует отчет профиля HTML. Этот процесс может занять несколько минут. Когда процесс завершен, содержимое отчета профиля появляется на панели Profile Report. Для примера:

    В отчете о профилировании показаны сводные данные, время выполнения каждой задачи и отображение каждой задачи с ядрами процессора. Мы видим, что задачи 1 и 2 выполняются на ядре 0, где задачи 3 и 4 выполняются на ядре 1. Раздел Task Execution Time отчета указывает, что задача 1 и задача 3 занимают больше всего времени для выполнения. Обратите внимание, что период задачи 3 в два раза больше, чем период задачи 1 и задачи 2, и период задачи 4 в два раза больше, чем период задачи 3.

  4. Анализ отчета по профилю. При необходимости создайте и измените свою модель или отображение задач и перегенерируйте отчет профиля.

Сгенерируйте отчет профиля в командной строке.  Кроме того, можно сгенерировать отчет профиля для модели, настроенной для параллельного выполнения в командной строке. Используйте Simulink.architecture.profile функция.

Например, чтобы создать отчет профиля для модели slexMulticoreSolverExample:

Simulink.architecture.profile('slexMulticoreSolverExample');

Чтобы создать отчет профиля с определенным количеством выборок (100) для модели slexMulticoreSolverExample:

Simulink.architecture.profile('slexMulticoreSolverExample',120);

Функция создает отчет профиля с именем slexMulticoreSolverExample_ProfileReport.html в текущей папке.

Настройка сгенерированного кода C

Сгенерированный код подходит для многих различных приложений и сред разработки. Для удовлетворения ваших потребностей можно настроить сгенерированный код C, как описано в Target Development (Embedded Coder). В дополнение к этим возможностям индивидуальной настройки, для многоядерных и неоднородных целей можно дополнительно настроить сгенерированный код следующим образом:

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

  • Можно задать пользовательский файл целевой архитектуры, который позволяет задавать целевые специфические свойства для задач и триггеров в диалоговом окне Параллельное выполнение. Для получения дополнительной информации см. раздел «Определение пользовательского файла архитектуры».

Похожие примеры

Подробнее о