exponenta event banner

Оптимизация и развертывание на многоядерном целевом компьютере

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

Создать код

Чтобы создать код для модели, настроенной для параллельного выполнения, на вкладке Приложения редактора 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. Он известен как собственный пример потоков, который используется для развертывания модели на рабочем столе. Возможно, рабочий стол не является конечной целью, но может помочь профилировать и оптимизировать модель перед развертыванием на другой цели.

Если указан целевой объект встроенного кодера, внесите следующие изменения в диалоговом окне «Параметры конфигурации».

  1. Установите флажок Создание кода > Шаблоны > Создание примера основной программы.

  2. В списке «Создание кода» > «Шаблоны» > «Целевая операционная система» выберите NativeThreadsExample.

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

  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) диалогового окна Параллельное выполнение (Concurrent Execution). Для профилирования можно использовать цели Simulink Coder (GRT) и Embedded Coder (ERT). Профилирование помогает определить области модели, которые являются узкими местами выполнения. Можно проанализировать время выполнения каждой задачи и найти задачу, которая занимает большую часть времени выполнения. Например, можно сравнить среднее время выполнения задач. Если задача требует больших вычислений или не удовлетворяет требованиям и перерасходам в реальном времени, ее можно разбить на задачи, которые менее интенсивны и могут выполняться одновременно.

При создании отчета по профилю программное обеспечение:

  1. Построение модели.

  2. Создает код для модели.

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

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

  5. Сопоставляет данные, создает HTML-файл (model_name_ProfileReport.html) в текущей папке и отображает этот HTML-файл на панели «Отчет о профиле» диалогового окна «Параллельное выполнение».

    Примечание

    Если для модели существует отчет о профиле HTML, этот файл отображается на панели Отчет о профиле (Profile Report). Для создания нового отчета по профилю нажмите.

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

Резюме

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

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

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

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

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

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

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

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

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

Создать отчет о профиле

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

  1. В диалоговом окне «Одновременное выполнение» выберите узел отчета «Профиль».

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

    Примечание

    Если для модели существует отчет о профиле HTML, этот файл отображается на панели Отчет о профиле (Profile Report). Для создания нового отчета по профилю нажмите.

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

  3. Нажмите кнопку Создать отчет о профиле выполнения задачи.

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

    Отчет о профилировании показывает сводку, время выполнения для каждой задачи и сопоставление каждой задачи ядрам процессора. Мы видим, что задачи 1 и 2 выполняются на ядре 0, а задачи 3 и 4 - на ядре 1. В разделе «Время выполнения задачи» отчета указано, что задача 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, как описано в разделе Целевая разработка (Embedded Coder). В дополнение к этим возможностям настройки, для многоядерных и разнородных целей можно дополнительно настроить созданный код следующим образом:

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

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

Связанные примеры

Подробнее