Поиск потенциальных проблем с типами данных в сгенерированном коде

Обзор проблем с типом данных

Когда вы генерируете код С из MATLAB® код, можно выделить потенциальные проблемы типа данных в Генерацию кода C отчете. В отчете описывается код MATLAB, который требует одинарной точности, двойной точности или дорогих операций с фиксированной точкой. Для дорогих операции с фиксированной точкой требуется Fixed-Point Designer™.

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

    Для строго-одинарного проекта точности задайте стандартную математическую библиотеку, которая поддерживает реализации с одной точностью. Чтобы изменить библиотеку для проекта, во время шага Сгенерировать код, в диалоговом окне параметров проекта, на вкладке Custom Code, установите Standard math library равным C99 (ISO).

  • Проверка с одной точностью подсвечивает выражения, которые приводят к одной операции.

  • Дорогая проверка операций с фиксированной точкой идентифицирует возможности оптимизации для кода с фиксированной точкой. В нем выделены выражения в коде MATLAB, которые требуют громоздкого умножения или деления, дорогого округления, дорогого сравнения или многословных операций. Для получения дополнительной информации об оптимизации сгенерированного кода с фиксированной точкой смотрите Советы по повышению эффективности сгенерированного кода (Fixed-Point Designer).

Включите подсветку потенциальных проблем с типами данных

Включите опцию подсветки с помощью приложения MATLAB Coder

  1. На странице Generate Code, чтобы открыть диалоговое окно Generate, щелкните стрелу Generate.

  2. Установите Build type в одно из следующих значений:

    • Source Code

    • Static Library (.lib)

    • Dynamic Library (.dll)

    • Executable (.exe)

  3. Нажмите More Settings.

  4. На вкладке Debugging установите флажки Always create a report и Highlight potential data type issues.

Включите опцию подсветки с помощью интерфейса командной строки

  1. Создайте объект строения встроенного кода для 'lib', 'dll', или 'exe':

    cfg = coder.config('lib','ecoder',true); % or dll or exe
    

  2. Установите GenerateReport и HighlightPotentialDataTypeIssues свойства объекта строения в true:

    cfg.GenerateReport = true;
    cfg.HighlightPotentialDataTypeIssues = true;

Поиск и адресация обременительных операций

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

Этот пример требует Embedded Coder® и Fixed-Point Designer. Целевой размер слова для процессора в этом примере - 64.

  1. Создайте функцию myMul.

    function out = myMul(in1, in2)
        out = fi(in1*in2, 1, 64, 0);
    end
    

  2. Сгенерируйте код для myMul.

    cfg = coder.config('lib');
    cfg.GenerateReport = true;
    cfg.HighlightPotentialDataTypeIssues = true;
    fm = fimath('ProductMode', 'SpecifyPrecision', 'ProductWordLength', 64);
    codegen -config cfg myMul -args {fi(1, 1, 64, 4, fm), fi(1, 1, 64, 4, fm)}

  3. Нажмите View report.

  4. В отчете генерации кода перейдите на вкладку Code Insights.

  5. Разверните раздел Potential data type issues. Затем разверните раздел Expensive fixed-point operations.

    Отчет помечает выражение in1 * in2. Чтобы решить проблему, измените типы данных in1 и in2 так что размер слова продукта не превышает целевой размер слова 64.

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

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

Этот пример требует Embedded Coder и Fixed-Point Designer.

  1. Создайте функцию myRounding.

    function [quot] = myRounding(in1, in2)
       quot = in1 / in2;
    end

  2. Сгенерируйте код для myRounding.

    cfg = coder.config('lib');
    cfg.GenerateReport = true;
    cfg.HighlightPotentialDataTypeIssues = true;
    codegen -config cfg myRounding -args {fi(1, 1, 16, 2), fi(1, 1, 16, 4)}

  3. Нажмите View report.

  4. В отчете генерации кода перейдите на вкладку Code Insights.

  5. Разверните раздел Potential data type issues. Затем разверните раздел Expensive fixed-point operations.

    Операция деления in1/in2 использует метод округления по умолчанию, nearest. Изменение метода округления на Floor обеспечивает более эффективную реализацию.

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

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

Этот пример требует Embedded Coder и Fixed-Point Designer.

  1. Создайте функцию myRelop.

    function out = myRelop(in1, in2)
        out = in1 > in2;
    end

  2. Сгенерируйте код для myRelop.

    cfg = coder.config('lib');
    cfg.GenerateReport = true;
    cfg.HighlightPotentialDataTypeIssues = true;
    codegen -config cfg myRelop -args {fi(1, 1, 14, 3, 1), fi(1, 0, 14, 3, 1)}

  3. Нажмите View report.

  4. В отчете генерации кода перейдите на вкладку Code Insights.

  5. Разверните раздел Potential data type issues. Затем разверните раздел Expensive fixed-point operations.

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

    Измените сигнальность и масштабирование одного из входов, чтобы сгенерировать более эффективный код.

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

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

Этот пример требует Embedded Coder и Fixed-Point Designer. В этом примере целевого размера слова равен 64.

  1. Создайте функцию myMul.

    function out = myMul(in1, in2)
        out = in1 * in2;
    end

  2. Сгенерируйте код для myMul.

    cfg = coder.config('lib');
    cfg.GenerateReport = true;
    cfg.HighlightPotentialDataTypeIssues = true;
    codegen -config cfg myMul -args {fi(1, 1, 33, 4), fi(1, 1, 32, 4)}

  3. Нажмите View report.

  4. В отчете генерации кода перейдите на вкладку Code Insights.

  5. Разверните раздел Potential data type issues. Затем разверните раздел Expensive fixed-point operations.

    Отчет помечает in1 * in2 операция в линии 2 myMul.

  6. В области кода перейдите на паузу in1, in2, и выражение in1 * in2. Вы видите, что:

    • Область размера слова in1 33 бита и размер слова in2 32 бита.

    • Значение размера слова выражения in1 * in2 составляет 65 бит.

    Программное обеспечение обнаруживает операцию с несколькими словами, поскольку размер слова 65 больше целевого размера слова 64.

  7. Чтобы решить эту проблему, измените типы данных in1 и in2 чтобы размер слова продукта не превышала целевого размера слова. Кроме того, задайте ProductMode свойство местного fimath (Fixed-Point Designer) объект.

Похожие темы