Ускорение моделирования алгоритмов обработки сигналов в моделях Simulink
Автор: Акаш Гописетти, MathWorks.
Проекты систем обработки сигналов часто имеют высокую вычислительную сложность из-за задействованных алгоритмов или приложений, требующих большого объема данных. Создание и моделирование таких сложных систем может занять много времени. Функциональное окружение Dataflow в Simulink позволяет сократить время моделирования. Эта функция ускоряет моделирование за счет автоматического разбиения модели на отдельные функциональные группы в Simulink и их параллельное применение с использованием ядер ЦП, доступных на главном компьютере.
В данной статье показано, как настроить Dataflow за три простых шага. Затем продемонстрируем Dataflow в действии на примере радиомодели и сравнивним время моделирования модели с на основе подситемы Dataflow и без неё.
Типы параллелизма, используемые потоком данных
Для разбиения модели на отдельные функциональные элементы и их параллельного выполнения в среде Dataflow использует одну из следующих комбинаций параллелизма данных (рисунок 1):
- Явный параллелизм (Explicit parallelism) обрабатывает разные наборы данных с помощью разных алгоритмов.
- Разветвительный параллелизма (Unfolding parallelism) последовательные кадры потока данных обрабатываются по одному и тому же алгоритму.
- Конвейерный параллелизм (Pipelining parallelism) обрабатывает разные части одних и тех же данных с помощью разных алгоритмов.
Рисунок 1. Типы параллелизма, используемые потоком данных.
Настройка потока данных
Чтобы включить окружение Dataflow в модели Simulink, необходимо сначала добавить соответствующий блок из библиотеки в Simulink.
Рисунок 2. Подсистема потока данных (Dataflow) в библиотеке блоков DSP System Toolbox.
Разместите блоки, моделирующие алгоритм, который вы хотите распараллелить, в подсистеме и настройте Dataflow следующим образом:
- Выберите только что созданную подсистему.
- Выберите Set execution domain (Установить домен выполнения) флажок на вкладке "Execution" Property Inspector.
- Установите Domain (Домен) вариант для потока данных.
Внутри подсистемы значок > в левом нижнем углу указывает, что подсистема настроена на домен потока данных.
Подсистема Dataflow сначала запустит модель, выполняя ее в одном потоке, а затем автоматически разделит подсистему для многопоточного выполнения.
Dataflow в действии
В нашем примере моделm имитируют радиопередатчик и приемник. Он содержит цифровые повышающие и понижающие преобразователи для регулировки частот сигнала, а также модулятор и демодулятор (рисунок 3). Вход - это
запись речи с дискретизацией 8 кГц. Выходы - два анализатора спектра и приемник звука.
Рисунок 3. Модель магнитолы с одноканальным аудиовходом.
Сначала, мы измеряем время, необходимое для моделирования этой модели без использования средств Dataflow.Закомментировав блоки вывода, мы можем сосредоточиться н1а. моделировании непосредственноо алгоритма не учитывая время, необходимое для вычисления спектрограмм и вывода звука.
Такое время можно вычислить используя команду tic- toc
modelname = 'mono_radiomodel';
tic;
simData = sim (modelname);
t = toc
Время выполнения для запуска модели составляет 3,67 секунды.
Теперь задействуем возможности Dataflow. Мы поместим блоки, представляющие алгоритм, в подсистему и установим домен в Dataflow (рисунок 4).
Рисунок 4. Использование Dataflow в модели радио с одноканальным аудиовходом.
Диалоговое окно Dataflow assistant отображает настраиваемые параметры модели (рисунок 5).
Рисунок 5. Dataflow assistant, показывает предлагаемые изменения в настройках модели.
Одно изменение, рекомендованное помощником, - это добавить задержку. Dataflow assistance, в появившемся окне, предложит добавить задержку. Задержка обычно добавляется после того как Dataflow определит возможность параллелизма для увеличения пропускной способности.
Задержки, добавленные вдоль сигнальных линий, обозначены z-label.
Мы принимаем изменения и сохраняем модель с использованием Dataflow под названием mono_radiomodel_dataflow.
Затем мы измеряем время выполнения новой подсистемы
modelname = 'mono_radiomodel_dataflow';
tic;
simData2 = sim (modelname);
t_Dataflow = toc
Время выполнения с использованием Dataflow составляет 2,5 секунды, что в 1,7 раза быстрее, чем при обычном однопоточном выполнении. Ускорение связано с оптимизацией компилятора, изменениями настроек модели и задержкой, добавленной потоком данных.
Однако модель выполнялась только в одном потоке, и ускорение незначительно. Это связано с тем, что большая часть вычислительной нагрузки сосредоточена в блоках повышающего и понижающего преобразователей. Dataflow работает лучше всего, когда вычислительная нагрузка распределяется по модели, предоставляя больше возможностей для создания параллельных потоков. В следующем разделе мы расширимм нашу модель и покажем, как использование Dataflow еще больше улучшает производительность моделирования.
Работа с более крупными моделями
Мы увеличиваем вычислительную сложность модели, вводя многоканальный входной аудиосигнал. Это удваивает объем данных, которые необходимо обработать, и дает Dataflow больше возможностей для оптимизации производительности моделирования. На рисунке 6 показана модель, модифицированная добавлением стереозвука, запуск которой занимает 18,6 секунды. Включив отображение размерности сигнала, мы видим, что входной сигнал действительно имеет два аудиоканала.
Рисунок 6. Радиомодель со стереовходом многоканального аудиосигнала.
После применения Dataflow и повторного запуска модели мы наблюдаем время выполнения 4,5 секунды - почти четырехкратное ускорение - при запуске модели в пяти параллельных потоках (рисунок 7).
Рисунок 7. Dataflow assistant, показывающий необходимую задержку и количество потоков
Генерация многопоточного кода с потоком данных
Dataflow поддерживает генерацию одноядерного и многоядерного кода C/C++ с помощью Simulink Code®.r TM и Embedded Coder. Сначала необходимо Разрешить одновременное выполнение задач на целевом объекте (Allow tasks to be executed concurrently on target) в панели Solver модели Simulink, а затем сгенерировать код, используя Ctrl + B. Код, созданный для целей десктопных решений, является многопоточным через OpenMP. Код, созданный для целей Embedded Coder, является многопоточным через POSIX.
На рисунке 8 показан код OpenMP C, созданный на основе нашей модели радио c параллельной обработкой, созданный на основе Dataflow.
Рисунок 8. Многопоточный код, созданный с помощью Dataflow и OpenMP.
Ограничения использования Dataflow
Хотя поток данных помогает ускорить большинство симуляций, он может быть применим не ко всем моделям - например, к несложным моделям или моделям с вычислительной нагрузкой, сосредоточенной только лишь в небольшом количестве блоков. В этих случаях ускорение, достигаемое применением Dataflow, не компенсирует накладные расходы, необходимые для синхронизации и выполнения модели в параллельных потоках. Как показал пример радиомодели, Dataflow работает лучше всего, когда вычислительная нагрузка равномерно распределяется по модели, поскольку равномерно распределенная нагрузка предоставляет больше возможностей для разделения модели для параллельного выполнения.
Что касается ограничений моделирования, начиная с версии 2020b Dataflow не поддерживает непрерывные блоки, сигналы переменного размера или виртуальные шины Simulink для многопоточного моделирования.
Резюме
Домен Dataflow позволяет вам идентифицировать шаблоны моделирования в модели Simulink, которые могут быть распределены на несколько потоков и выполняться параллельно. Этот подход использует преимущества вычислительной мощности, доступной на центральном процессоре, оптимизирует пропускную способность и сокращает время моделирования модели. Область потока данных наиболее эффективна, когда вычислительная нагрузка распределяется по модели, чтобы можно было ввести параллелизм, и она работает только с дискретными сигналами.
Комментарии