Оптимизируйте сгенерированный код с помощью Model Advisor

Можно использовать Simulink® Model Advisor, который поможет вам сконфигурировать модели с фиксированной точкой для достижения более эффективного проекта и оптимизации сгенерированного кода. Чтобы использовать Model Advisor для проверки моделей с фиксированной точкой:

  1. На вкладке Modeling модели, которую вы хотите проанализировать, нажмите Model Advisor.

  2. В системном селекторе выберите систему для анализа.

  3. На левой панели Model Advisor разверните узел By Product, а затем узел Embedded Coder.

  4. Для генерации кода с фиксированной точкой наиболее важными флажками для выбора являются Identify blocks that generate expensive fixed-point and saturation code, Identify questionable fixed-point operations, Identify blocks that generate expensive rounding code и Check the hardware implementation.

    Чтобы включить все проверки Model Advisor, связанные с выбранным узлом, в меню Model Advisor Edit выберите Select All.

  5. Нажмите Run selected checks. Любые советы по повышению эффективности вашей модели с фиксированной точкой появляются в окне Model Advisor.

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

Идентифицируйте блоки, которые генерируют дорогой код фиксированной точки и насыщения

Идентифицируйте блоки Sum для сомнительных операций с фиксированной точкой

  • Когда вход диапазон блока Sum превышает выход диапазон, возникает ошибка области значений. Вы можете получить любое сложение или вычитание, требуемое вашим приложением, путем вставки блоков преобразования типа данных до и/или после блока Sum.

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

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

Идентифицируйте блоки Min Max для сомнительных операций с фиксированной точкой

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

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

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

Идентифицируйте дискретные блоки Интегратора для сомнительных операций с фиксированной точкой

  • Когда начальное условие для блоков Discrete-Time Integrator используется для инициализации состояния и вывода, выход уравнение генерирует избыточный код, и требуется дополнительная глобальная переменная. Рекомендуется задать параметр Function Block Parameters > Initial condition setting равным State (most efficient).

Идентифицируйте блоки сравнения с константой для сомнительных операций с фиксированной точкой

  • Если тип входных данных блока Compare to Zero не может точно представлять ноль, входной сигнал сравнивается с ближайшим представимым значением нуля, что приводит к переполнению параметра. Чтобы избежать этого переполнения параметра, выберите тип входных данных, который может представлять нуль.

  • Если параметр Constant value Compare to Constant находится вне области значений, которые может представлять тип входных данных, входной сигнал сравнивается с ближайшим представимым значением константы. Это приводит к переполнению параметра. Чтобы избежать этого переполнения параметра, выберите тип входных данных, который может представлять Constant value, или измените Constant value на значение, которое может быть удовлетворено типом входных данных.

Идентифицируйте блоки интерполяционной таблицы для сомнительных операций с фиксированной точкой

Компромиссы эффективности, связанные с данными интерполяционной таблицы, описаны в Эффектах Интервала на Скорости, Ошибке и Использовании Памяти. На основе этих компромиссов Model Advisor определяет блоки, где существует потенциал для повышения эффективности, такие как:

  • Входные данные интерполяционной таблицы не разделены равномерно.

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

  • Входные данные интерполяционной таблицы распределены равномерно, но интервал не является степенью двойки.

Для получения дополнительной информации об оптимизации интерполяционной таблицы см. «Оптимизация интерполяционной таблицы».

Проверяйте настройки оптимизации и аппаратной реализации

  • Целочисленное деление сгенерированного кода содержит защиту от арифметических исключений, таких как деление на нуль, INT_MIN/-1 и LONG_MIN/-1. Если вы создаете модели, делающие невозможным для инициирующих входные комбинации исключений достижение операции деления, код защиты, сгенерированный как часть операции деления, избыточен.

  • Метод поиска по индексу Evenly-spaced points требует операции деления, которая может быть вычислительно дорогой.

Идентифицируйте блоки, которые будут вызывать расчет уклона сети

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

Model Advisor предупреждает вас, когда:

  • Вы устанавливаете параметр оптимизации Use division for fixed-point net slope computation равным ‘On’, но ваше строение модели несовместимо с этим выбором.

  • Ваше строение модели подходит для использования деления для обработки расчетов уклона сети, но вы не устанавливаете параметр оптимизации Use division for fixed-point net slope computation равным ‘On’.

Для получения дополнительной информации см. Раздел «Расчет уклона сети»

Идентифицируйте менее эффективные блоки продуктов

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

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

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

Проверяйте на дорогостоящий код насыщения

Установка параметра Saturate on integer overflow может привести к коду проверки условий, который может не потребоваться вашему приложению.

Проверьте, требуется ли вашему приложению настройка Block Parameters > Signal Attributes > Saturate on integer overflow. В противном случае очистите этот параметр для наиболее эффективной реализации блока в сгенерированном коде.

Идентифицируйте сомнительные операции с фиксированной точкой

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

Проверяйте на наличие многословных операций

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

Проверяйте на дорогостоящий код умножения

  • Таргетинг встраиваемого процессора обсуждает возможности и ограничения встраиваемых процессоров. Design Rules рекомендует, чтобы входы в операцию умножения не имели размеров слова, больших, чем базовый целый тип вашего процессора. Умножение с большими размерами слова всегда можно обрабатывать в программном обеспечении, но этот подход требует гораздо большего количества кода и намного медленнее. Model Advisor определяет блоки, где требуются нежелательные умножения ПО. Визуальный осмотр сгенерированного кода, включая сгенерированные служебные функции умножения, позволит четко определить стоимость этих операций. Настоятельно рекомендуется настроить модель, чтобы избежать этих операций.

  • Правила для арифметических операций обсуждают детали реализации умножения с фиксированной точкой и деления. Значительное увеличение сложности происходит, когда сигналы с ненулевыми смещениями участвуют в умножении и делении. Настоятельно рекомендуется внести изменения, чтобы исключить необходимость в этих сложных операциях. Для реализации умножения требуются дополнительные шаги. Вставка блока Data Type Conversion до и после блока, делающего умножение, позволяет удалить смещения и позволяет пользователю управлять типом данных и масштабированием для промежуточных вычислений. Во многих случаях блоки Data Type Conversion могут быть перемещены на «ребра» (подсистемы). Преобразование выполняется только один раз, и все блоки могут воспользоваться более простой математикой без смещения.

Проверяйте на дорогостоящий код деления

Поведение округления целочисленного деления со знаком не полностью задано стандартами языка C. Поэтому сгенерированный код для деления слишком велик, чтобы обеспечить битово-истинное согласие между симуляцией и генерацией кода. Чтобы избежать слишком большого целого деления кода, в диалоговом окне Параметров конфигурации на панели Hardware Implementation установите рекомендуемое значение параметра Signed integer division rounds to.

Идентифицируйте интерполяционные блоки с неравномерным интервалом точек по оси Х

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

  • Входные данные интерполяционной таблицы не разделены равномерно.

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

  • Входные данные интерполяционной таблицы распределены равномерно, но интервал не является степенью двойки.

Проверяйте наличие дорогих предварительных делений

Для Prelookup или n-D Lookup Table блока Index search method есть Evenly spaced points. Данные точек по оси Х не имеют степени 2 интервала.

Если данные точек по оси Х не являются нетронутыми, рекомендуется настроить данные так, чтобы они имели четную степень 2 интервала. В противном случае в диалоговом окне параметров блоков задайте другое Index search method, чтобы избежать интенсивной вычислений операции деления.

Проверяйте на дорогостоящие преобразования типов данных

Когда блок сконфигурирован таким образом, что он генерирует неэффективный код для преобразования типа данных, Model Advisor генерирует предупреждение и вносит предложения о том, как сделать вашу модель более эффективной.

Проверяйте на сравнения с фиксированной точкой с предопределенными результатами

Когда вы выбираете isInf, isNaN, или isFinite в качестве операции для блока Relational Operator блок переключается в режим с одним входом. В этом режиме, если входной тип входных данных является фиксированной точкой, логической точкой или встроенным целым числом, выход равен FALSE для isInf и isNaN, TRUE для isFinite. Это может привести к мертвому коду, который будет устранен Simulink Coder™.

Проверяйте на дорогие операции двоичного сравнения

  • Когда типы входных данных блока Relational Operator не совпадают, операция преобразования требуется каждый раз, когда блок выполняется. Если один из входов инвариантен, то изменение типа данных и масштабирование инвариантного входа, чтобы соответствовать другому входу, улучшает эффективность модели.

  • Когда входы блока Relational Operator имеют различные диапазоны, будет ошибка области значений при литье и потеря точности каждый раз, когда выполняется преобразование. Можно вставить Data Type Conversion блоки перед блоком Relational Operator, чтобы преобразовать оба входных параметра в общий тип данных, который имеет достаточную область значений и точность, чтобы представлять каждый вход.

  • Когда входы Relational Operator блока имеют различные коэффициенты регулировки наклона, Relational Operator блок требуется выполнить операцию умножения каждый раз, когда вход с меньшей положительной областью преобразуется в тип данных и масштабирование входного сигнала с большей положительной областью значений. Дополнительное умножение требует дополнительного кода, замедляет скорость выполнения и обычно вводит дополнительные потери точности. Регулируя масштабирование входов, можно исключить несоответствующие склоны.

Проверяйте на дорогостоящий код сравнения

Когда ваша модель сконфигурирована так, что сгенерированный код содержит дорогой сравнительный код, Model Advisor генерирует предупреждение.

Проверяйте наличие дорогих типов данных с фиксированной точкой в сгенерированном коде

Когда проект содержит целое число или размеры слова с фиксированной точкой, которые не существуют на вашем целевом компьютере, сгенерированный код может содержать дополнительный код насыщения, сдвиги и многословные операции. Изменив тип данных на тот, который поддерживается вашим целевым компьютером, можно повысить эффективность сгенерированного кода. Model Advisor помечает эти дорогие типы данных в вашей модели. Например, Model Advisor отметит тип данных с фиксированной точкой с размером слова 17, если целевой компьютер был 32 бита.

Идентифицируйте блоки, которые генерируют дорогой округляющий код

Эта проверка предупреждает вас, когда доступны оптимизации округления. Чтобы проверить блоки, которые генерируют дорогой округляющий код, Model Advisor выполняет следующие подконтроли:

  • Проверяйте дорогие операции округления в умножении и делении

  • Проверяйте настройки оптимизации и аппаратной реализации (интерполяционные блоки)

  • Проверяйте на дорогое округление в преобразовании типа данных

  • Проверяйте на дорогие режимы округления в модели

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

Основным исключением из этого правила является поведение округления целочисленного деления со знаком. Стандарт C оставляет это округление неопределенным, но для большинства производственных платформ режим «без усилий» равен нулю. Для беззнакового деления все неотрицательно, поэтому округление до этажа и округление до нуля идентичны. Чтобы улучшить эффективность округления, установите Параметры конфигурации модели > Аппаратная реализация > Детали устройства > Подписанные целочисленные раунды деления, чтобы использовать режим, который использует ваша производственная платформа.

Используйте параметр Integer rounding mode в блоках вашей модели, чтобы симулировать поведение округления компилятора C, который вы используете, чтобы скомпилировать код, сгенерированный из модели. Этот параметр появляется на Signal Attributes панели диалоговых окон параметров блоков, которые могут выполнять арифметику целого числа знаком, например, блока Product. Чтобы получить наиболее эффективный сгенерированный код, измените параметр Integer rounding mode блока на рекомендуемую настройку.

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