Оптимизация циклов MATLAB

С помощью оптимизации цикла можно транслировать или развернуть циклы в сгенерированном коде. Потоковая передача цикла является оптимизацией площади, а размотка цикла является оптимизацией скорости. Чтобы оптимизировать циклы для MATLAB® код, который находится внутри блока MATLAB Function, используйте MATLAB Function архитектура. Когда вы используете MATLAB Datapath архитектура, генератор кода разворачивает циклы независимо от настройки оптимизации цикла.

Потоковая передача циклов

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

Если вы транслируете цикл, преимущество заключается в уменьшении использования аппаратных ресурсов, потому что тело цикла создается меньше раз. Недостатком является то, что аппаратная реализация выполняется с меньшей скоростью.

Вы можете частично потоковать цикл. Частично потоковый цикл создает тело цикла более одного раза, поэтому он использует больше области, чем полностью потоковый цикл. Однако частично потоковый цикл также использует меньшую избыточную дискретизацию, чем полностью потоковый цикл.

Цикл

HDL Coder разворачивает цикл путем создания экземпляров нескольких образцов тела цикла в сгенерированном коде. Можно также частично развернуть цикл. Сгенерированный код использует оператор цикла, который содержит несколько образцы исходного тела цикла и меньше итераций, чем исходный цикл.

Распределённая конвейеризация и совместное использование ресурсов могут оптимизировать неуправляемый код. Распределённая конвейеризация может увеличить скорость. Совместное использование ресурсов может уменьшить площадь.

Когда размотка цикла создает несколько образцы, эти образцы, вероятно, увеличат площадь. Разворачивание цикла также затрудняет чтение кода.

Как оптимизировать циклы MATLAB

Можно задать оптимизацию глобального цикла с помощью HDL Workflow Advisor или в командной строке.

Можно также задать локальную оптимизацию цикла для определенного цикла при помощи coder.hdl.loopspec прагма в коде MATLAB. Если вы задаете и глобальную, и локальную оптимизацию цикла, оптимизация локального цикла переопределяет глобальную настройку.

Оптимизация глобального цикла

Чтобы задать оптимизацию цикла в Workflow Advisor:

  1. На левой панели HDL Workflow Advisor выберите HDL Workflow Advisor > HDL Code Generation.

  2. На вкладке Optimizations для Loop Optimizations выберите None, Unroll Loops или Stream Loops.

Чтобы задать оптимизацию цикла в командной строке в рабочем процессе MATLAB to HDL, задайте LoopOptimization свойство coder.HdlConfig объект. Для примера, для coder.HdlConfig объект, hdlcfgвведите одну из следующих команд:

hdlcfg.LoopOptimization = 'UnrollLoops'; % unroll loops
hdlcfg.LoopOptimization = 'StreamLoops'; % stream loops
hdlcfg.LoopOptimization = 'LoopNone'; % no loop optimization

Оптимизация локального цикла

Чтобы узнать, как оптимизировать определенный цикл MATLAB, см. coder.hdl.loopspec.

Примечание

Если вы задаете coder.unroll прагма, эта прагма имеет приоритет над coder.hdl.loopspec. coder.hdl.loopspec не имеет эффекта.

Ограничения для оптимизации цикла MATLAB

HDL Coder не может передать цикл, если:

  • Индекс цикла отсчитывается. Индекс цикла должен увеличиться на 1 при каждой итерации.

  • Существует два или более вложенных циклов на том же уровне иерархии в другом цикле.

  • Любая конкретная постоянная переменная обновляется как внутри, так и вне цикла.

  • Постоянная переменная, которая инициализирована до ненулевого значения, обновляется внутри цикла.

HDL Coder может транслировать цикл, когда постоянная переменная:

  • Обновлен внутри цикла и считан вне цикла.

  • Считайте в цикле и обновляйте вне цикла.

Вы не можете использовать coder.hdl.loopspec('stream') прагма:

  • В подфункции. Его необходимо задать в функции проекта MATLAB верхнего уровня.

  • Для цикла, который вложен в другой цикл.

  • Для цикла, содержащего вложенный цикл, если коэффициент потоковой передачи не равен количеству итераций.

См. также