Этот пример показов, как развернуть приложение шумоподавления на многоядерный целевой компьютер с помощью Dataflow
Чтобы запустить этот пример, вы должны установить и настроить следующее программное и оборудование:
Пакет поддержки Embedded Coder для платформы Xilinx Zynq
Плата Zynq
Для получения дополнительной информации об установке пакета поддержки и настройке оборудования Zynq см. раздел «Установка поддержки платформы Xilinx Zynq» (Пакет поддержки Embedded Coder для платформы Xilinx Zynq).
Область выполнения dataflow позволяет вам использовать несколько ядер на целевом компьютере для вычислительно интенсивных систем обработки сигналов.
В этом примере показано, как задать dataflow как область выполнения подсистемы и улучшить эффективность путем генерации многоядерного кода. Пример использует симуляцию цикл (PIL) для развертывания приложения на центральном процессоре ARM в аппаратном оборудовании Zynq и профилирование во время выполнения для измерения эффективности.
Модель в этом примере использует два блока БИХ Переменной полосы пропускания, сконфигурированных как lowpass и верхних частот, соответственно. Фильтры соединяются последовательно в Подсистеме Dataflow, чтобы совместно сформировать систему шумовой фильтрации полосы пропускания. Исходным сигналом является случайный шум. Откройте модель dataflowzynq.
Сконфигурируйте модель, чтобы сгенерировать код для оборудования на основе Zynq. Этот пример использует Zynq-7000 SoC ZC702 Evaluation Kit и выполняет симуляцию процессор в цикле (PIL) на целевом компьютере.
Сконфигурируйте модель, чтобы сгенерировать блок PIL, когда код генерируется для подсистемы. Это позволяет вам измерить время, необходимое для блока Dataflow Subsystem на целевом компьютере. Для получения дополнительной информации о конфигурировании PIL симуляции с блоками PIL, смотрите Simulation with Блоки Subsystem (Embedded Coder).
Включите профилирование времен выполнения функции для подсистем. Для получения дополнительной информации о профилировании с помощью PIL, смотрите Профилирование выполнения кода с SIL и PIL (Embedded Coder).
Создайте блок Dataflow Subsystem. Этот шаг генерирует блок PIL из Подсистемы Dataflow.
Замените блок Dataflow Subsystem в исходной модели на сгенерированный блок PIL.
Симулируйте модель и измерьте среднее время выполнения подсистемы с помощью результатов профилирования, полученных в конце PIL симуляции. Среднее время выполнения может быть получено путем деления общего времени выполнения подсистемы на количество вызовов подсистемы. Это число вычисляется и показано ниже.
Average execution time of generated code for single-core = 5.6 ms
Области Dataflow автоматически разделяют вашу модель и генерируют код с несколькими потоками для многоядерных объектов. В Simulink вы задаете dataflow в качестве области выполнения для подсистемы путем установки параметра Domain на Dataflow с помощью Property Inspector. Можно просмотреть Property Inspector для подсистемы, сначала выбрав подсистему и затем выбрав View > Property Inspector. В Property Inspector можно задать значение области dataflow, выбрав Set области спецификации а затем выбрав «Dataflow» для Области настройки. Можно также использовать блок Dataflow Subsystem из библиотеки Dataflow DSP System toolbox, чтобы получить подсистему, которая предварительно сконфигурирована с областью выполнения dataflow.
Чтобы увеличить пропускную способность системы, может быть выгодно увеличить задержку системы. Задайте значение Latency на вкладке Execution Property Inspector. Установка значения задержки 1 добавит задержку трубопровода, чтобы разорвать зависимость между блоками фильтра и активирует область dataflow для достижения параллелизма.
Чтобы включить генерацию многоядерного кода, необходимо выбрать Разрешить задачи для параллельного выполнения на целевом параметре в панели Solver параметров конфигурации в разделе Solver details.
Перестроите блок Dataflow Subsystem, чтобы сгенерировать многоядерную версию блока PIL.
После завершения генерации кода для подсистемы можно наблюдать сгенерированные функции для каждого параллельного потока, созданного областью dataflow, и то, как они запускаются во время выполнения функции шага модели.
Блок Dataflow Subsystem генерирует две функции потока, Dataflow_ThreadFcn0 и Dataflow_ThreadFcn1.
Функции потока регистрируются как потоки POSIX при инициализации модели и запускаются во время каждого шага модели. Последовательные вызовы триггера и функции ожидания реализуют шаблон вилочного соединения для потоков dataflow.
Симулируйте модель с многоядерной версией блока PIL и повторите измерение для времени выполнения подсистемы.
Average execution time of generated code for multicore = 3.9 ms
Actual speedup with dataflow: 1.44x
Копирайт 2020 The MathWorks, Inc.