Оптимизируйте и развернитесь на многожильной цели

Эта тема показывает вам, как использовать модель, которая сконфигурирована для параллельного выполнения с помощью явного разделения, и разверните его на цель. Чтобы настроить вашу модель для параллельного выполнения, смотрите, Конфигурируют Вашу Модель для Параллельного выполнения. Чтобы задать целевую архитектуру, смотрите, Задают Целевую архитектуру. Чтобы использовать явное разделение в модели, которая настраивается для параллельного выполнения, смотрите Раздел Ваша Модель Используя Явное Разделение.

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

Чтобы сгенерировать код для модели, которая сконфигурирована для параллельного выполнения в редакторе 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);

Содержимое для каждой такой функции состоит из независимого от цели кода С, за исключением:

Передача данныхИнициализацияЧитательСредство записи

Целостность данных только

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. Это известно the native threads example, который используется, чтобы развернуть вашу модель на настольной цели. Рабочий стол не может быть вашей итоговой целью, но может помочь профилировать и оптимизировать вашу модель, прежде чем вы развернете его на другой цели.

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

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

  2. От Code Generation> Templates> список Target Operating System, выберите NativeThreadsExample.

  3. Нажмите OK, чтобы сохранить ваши изменения и закрыть диалоговое окно Configuration Parameters.

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

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

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

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

Периодическое инициирующее событие

Таймер POSIX

Таймер Windows

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

Апериодическое инициирующее событие

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

Событие Windows

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

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

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

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

Распараллельте ожидание события

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

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

Потоки

POSIX®

Windows

POSIX

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

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

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

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

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

Пример превышенного обнаружения

Да

Да

Нет

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

APIРеализация LinuxWindows ImplementationРеализация 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 в панели Profile Report диалогового окна Concurrent Execution.

    Примечание

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

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

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

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

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

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

Видимый для Windows, Linux и платформ Mac OS.

Задача Affinitization к ядрам процессора

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

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

Видимый для Windows и платформ Linux.

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

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

Эта тема принимает ранее сконфигурированную модель, готовую профилироваться для параллельного выполнения. Для получения дополнительной информации смотрите, Конфигурируют Вашу Модель для Параллельного выполнения.

  1. В диалоговом окне Concurrent Execution кликните по узлу 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, как описано в Целевой Разработке (Embedded Coder). В дополнение к тем возможностям настройки для многожильных и неоднородных целей можно далее настроить сгенерированный код можно следующим образом:

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

  • Можно задать пользовательский файл целевой архитектуры, который позволяет вам задавать целевые определенные свойства для задач и триггеров в диалоговом окне Concurrent Execution. Для получения дополнительной информации смотрите, Задают Пользовательский Файл Архитектуры.

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

Больше о