Назначение задач ядрам для многоядерного программирования

В этом примере показано, как использовать преимущества выполнения кода на многоядерном процессоре с помощью графического разбиения. Этот пример требует, чтобы Simulink Coder™ сгенерировал многопоточный код.

Введение

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

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

Попробуйте пример

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

slexMulticoreExample

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

Эта модель приложения уже разделена на четыре параллельные задачи через диалоговое окно Параллельное выполнение, к которому можно получить доступ из панели Solvers параметров конфигурации модели. Используйте это диалоговое окно для определения логики, задачи и основных назначений. В этом примере мы разделили прикладную логику как:

Дважды кликните кнопку 'Generate Code and Profile Report', чтобы сгенерировать многопоточный код и профилировать его выполнение. Это действие запускает и измеряет сгенерированный исполняемый файл и выдает как результаты профилирования, так и карту заполнения ядра, последняя проиллюстрирована ниже. Рисунок показывает, как ядра использовались на каждом временном шаге выполнения. В этом примере первое ядро использовали для быстрых скоростей (Task1 и Task2), а второе ядро использовали для более медленных скоростей (Task3 и Task4).

Можно вернуться к диалоговому окну «Параллельное выполнение», чтобы опробовать различные назначения ядра. В частности, вы можете попытаться указать отсутствие родства ядра, оставив свойство 'Affinity' равным '[]'. Это настройка по умолчанию, которая позволяет Simulink™ генерировать многопоточный код, подходящий для динамического планирования на вашем многоядерном процессоре.