Лучшие практики преобразования с одной точностью

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

В MATLAB® код, который вы хотите преобразовать в одинарную точность, это лучшая практика, чтобы использовать целые числа для индексных переменных. Однако, если код не использует целые числа для индексных переменных, по возможности одноточное преобразование с использованием codegen с -double2single пытается обнаружить индексные переменные и выбрать int32 типы для них.

Предельное Использование assert Операторы

  • Не используйте assert операторы для определения свойств входных параметров.

  • Не используйте assert операторы для тестирования типа переменной. Для примера не используйте

    assert(isa(a, 'double'))

Инициализация свойств класса MATLAB в конструкторе

Не инициализируйте свойства класса MATLAB в properties блок. Вместо этого используйте конструктор, чтобы инициализировать свойства класса.

Предоставьте тестовый файл, который вызывает вашу функцию MATLAB

Отделите свой основной алгоритм от другого кода, который вы используете для тестирования и проверки результатов. Создайте тестовый файл, который вызывает ваш алгоритм MATLAB с двойной точностью. Можно использовать тестовый файл для:

  • Автоматически задайте свойства входных параметров функции верхнего уровня.

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

  • Сравните поведение версии алгоритма с одной точностью с базовой линией с двойной точностью.

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

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

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

Чтобы помочь вам идентифицировать неподдерживаемые функции или конструкции в коде MATLAB, добавьте %#codegen прагма в верхнюю часть файла MATLAB. При редактировании кода в редакторе MATLAB КОД MATLAB Analyzer помечает функции и конструкции, которые не поддерживаются для генерации кода. См. раздел «Проверка кода» в анализаторе кода. Когда вы используете приложение MATLAB Coder™, приложение просматривает ваш код на предмет готовности генерации кода. В функциональной линии можно использовать Генерацию кода Инструмента Readiness. См. Раздел «Проверка кода при помощи инструмента подготовки генерации кода».

Проверьте код двойной точности перед преобразованием с одной точностью

Прежде чем вы начнете процесс преобразования с одной точностью, проверьте, что вы можете успешно сгенерировать код из вашего кода MATLAB с двойной точностью. Сгенерируйте и запустите версию MEX своего кода MATLAB с двойной точностью, чтобы вы могли:

  • Обнаружение и устранение проблем с компиляцией.

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

Смотрите, зачем тестировать MEX-функции в MATLAB?.

Лучшие практики для генерации кода C/C + + с одной точностью

Когда вы генерируете одноточный код C/C + + с помощью приложения MATLAB Coder илиcodegen с -singleC опция, следуйте этим лучшим практикам:

Используйте C99 стандартную математическую библиотеку

Когда вы генерируете библиотеки или исполняемые файлы C/C + +, по умолчанию генератор кода использует стандартную математическую библиотеку C99 (ISO). Если вы генерируете одноточный код C/C + + с помощью библиотеки C89/C90 (ANSI), генератор кода предупреждает вас, если функция в этой библиотеке использует двойную точность. Чтобы избежать этого предупреждения, установите стандартную математическую библиотеку на C99 (ISO). Смотрите Предупреждения от Преобразования в Одноточный Код C/C + +.

Приведение большой двойной константы к целому числу

Для константы, больше 2^24, в вашей исходной функции MATLAB двойной точности, приведите константу к целому типу, который достаточно велик для постоянного значения. Для примера:

a = int32(2^24 + 1);

Сгенерируйте и запустите MEX с одной точностью перед генерацией кода C/C + + с одной точностью

Прежде чем вы сгенерируете Код С с одной точностью, сгенерируйте и запустите версию MEX кода MATLAB с одной точностью. Когда вы следуете этой практике, можно обнаружить и исправить проблемы компилятора. Можно проверить, что MEX-функция с одной точностью имеет те же функциональные возможности, что и код MATLAB.

Если вы используете codegen с -singleC:

  1. Сгенерируйте MEX с одной точностью.

  2. Звонить coder.runTest чтобы запустить тестовый файл, заменив вызовы кода MATLAB с двойной точностью вызовами кода MEX с одной точностью.

Если вы используете приложение MATLAB Coder, выполните Check for Run-Time Issues шаг с включенным преобразованием с одной точностью.

Лучшие практики для генерации кода MATLAB с одной точностью

Когда вы используете codegen с -double2single опция для генерации кода MATLAB с одной точностью, следуйте этим лучшим практикам:

Используйте -args Опция для задания входных свойств

Когда вы генерируете код MATLAB с одной точностью, если вы задаете тестовый файл, вы не должны задавать свойства аргумента с -args опция. В этом случае генератор кода запускает тестовый файл, чтобы определить свойства входных типов. Однако выполнение тестового файла может замедлить генерацию кода. Это лучшая практика, чтобы определить входные свойства один раз с coder.getArgTypes. Затем передайте свойства в -args опция. Для примера:

types = coder.getArgTypes('myfun_test', 'myfun');
scfg = coder.config('single');
codegen -double2single scfg -args types myfun -report

Когда вы повторяете генерацию кода в том же сеансе работы с MATLAB, эта практика экономит ваше время.

Тестовые числа и логарифмические данные ввода-вывода

Когда вы используете codegen с функцией -double2single опция для генерации кода MATLAB с одной точностью, включения числовой проверки и ввода-вывода регистрации данных для графиков сравнения. Чтобы использовать проверку с цифрами, вы должны предоставить тестовый файл, который вызывает вашу функцию MATLAB. Чтобы включить проверку цифр и логгирование данных ввода-вывода, создайте coder.SingleConfig объект. Установите TestBenchName, TestNumerics, и LogIOForComparisonPlotting свойства. Для примера:

scfg = coder.config('single');
scfg.TestBenchName = 'mytest';
scfg.TestNumerics = true;
scfg.LogIOForComparisonPlotting = true;

Похожие темы