exponenta event banner

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

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

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

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

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

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

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

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

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

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

  2. Установите один из следующих типов построения:

    • Source Code

    • Static Library (.lib)

    • Dynamic Library (.dll)

    • Executable (.exe)

  3. Щелкните Дополнительные параметры.

  4. На вкладке Отладка установите флажки Всегда создавать отчет и Выделить возможные проблемы типа данных.

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

  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. Щелкните Просмотр отчета.

  4. В отчете о создании кода перейдите на вкладку Анализ кода.

  5. Разверните раздел Потенциальные проблемы с типами данных. Затем разверните раздел Дорогостоящие операции с фиксированной точкой.

    Отчет помечает выражение 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. Щелкните Просмотр отчета.

  4. В отчете о создании кода перейдите на вкладку Анализ кода.

  5. Разверните раздел Потенциальные проблемы с типами данных. Затем разверните раздел Дорогостоящие операции с фиксированной точкой.

    Операция дивизии 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. Щелкните Просмотр отчета.

  4. В отчете о создании кода перейдите на вкладку Анализ кода.

  5. Разверните раздел Потенциальные проблемы с типами данных. Затем разверните раздел Дорогостоящие операции с фиксированной точкой.

    Первый входной аргумент, 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. Щелкните Просмотр отчета.

  4. В отчете о создании кода перейдите на вкладку Анализ кода.

  5. Разверните раздел Потенциальные проблемы с типами данных. Затем разверните раздел Дорогостоящие операции с фиксированной точкой.

    Отчет помечает in1 * in2 работа в строке 2 myMul.

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

    • Длина слова in1 33 бита и длина слова in2 32 бита.

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

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

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

Связанные темы