Замена кода оператора сложения и вычитания

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

Опции алгоритма

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

  • Приведение к операции перед операцией (CBO), по умолчанию - перед выполнением операции сложения или вычитания тип алгоритма переводит вход значения в тип выхода. Если тип выходных данных не может точно представлять входные значения, потери могут произойти в результате приведения к выходу. Дополнительные потери могут произойти, когда результат операции будет приведен к конечному типу выхода.

  • Cast-after-operation (CAO) - Алгоритм вычисляет идеальный результат операции сложения или вычитания двух входов. Затем тип алгоритма приводит результат к типу выходных данных. Потеря происходит во время приведения типа. Этот алгоритм ведет себя аналогично языку C, за исключением тех случаев, когда сигнальность операндов не совпадает. Для примера, когда вы добавляете подписанный длинный операнд к неподписанному длинному операнду, стандартные правила языка C преобразуют подписанный длинный операнд в неподписанный длинный операнд. Результатом является значение, которое не идеально.

Классификация алгоритмов

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

  • Только типы с плавающей точкой

    Введите 1 Тип данныхВведите 2 Тип данныхТип данных аккумулятора Выход данныхКлассификация
    doubledoubledoubledoubleCBO, CAO
    doubledoubledoublesingle
    doubledoublesingledouble
    doubledoublesinglesingleCBO
    doublesingledoubledoubleCBO, CAO
    doublesingledoublesingle
    doublesinglesingledouble
    doublesinglesinglesingleCBO
    singlesinglesinglesingleCBO, CAO
    singlesinglesingledouble
    singlesingledoublesingle
    singlesingledoubledoubleCBO, CAO

  • Фиксированные точки при операции немедленного сложения или вычитания

    АлгоритмУсловия
    CBO

    Одно из следующих значений верно:

    • Тип операции double.

    • Тип операции single и входные типы single или с фиксированной точкой.

    Главный администраторТип операции является супермножеством типов входа - то есть выходу тип может представлять значения типов входа без потери данных.

  • Только фиксированные точки

    АлгоритмУсловия
    CBO

    По крайней мере, одно из следующих значений верно:

    • Тип аккумулятора равен типу выхода (Tacc == Tout).

    • Выход тип является супермножеством входа типов (Tacc >= {Tin1, Tin2}) и тип аккумулятора является супермножеством типа выхода (Tacc >= Tout).

    • Операция не несет область значений или потери точности.

    Главный администраторСмещение сети равняется нулю, и типы данных в выражении имеют равные коэффициенты корректировки наклона. Для получения дополнительной информации о смещении сети смотрите «Сложение» или «Вычитание» в замене кода оператора с фиксированной точкой (для MATLAB® код) или замена кода оператора с фиксированной точкой (для Simulink® модели).

Во многих случаях численный результат операции CBO равен результату операции CAO. Для примера, если типы входа и выхода таковы, что операция дает идеальный результат, как в случае int8 + int8 —> int16. Чтобы максимизировать вероятность замены кода, происходящей в таких случаях, установите алгоритм на отсоединение после операции.

Интерактивная разработка библиотеки замещения кода

  1. Откройте Code Replacement Tool (crtool) из командной строки MATLAB с помощью следующей команды:

    >>crtool
  2. Составьте таблицу.

    1. В контекстном меню crtool выберите File > New Table.

    2. На правой панели назовите таблицу crl_table_addition. Нажмите Apply.

  3. Создайте запись. В контекстном меню crtool выберите File > New entry > Math Operation.

  4. Создайте параметры входа. В раскрывающемся списке Function выберите Addition. Информация об алгоритме появляется в crtool. В данном примере выберите параметр, который будет Cast before operation.

  5. Создайте концептуальное представление. Концептуальное представление описывает сигнатуру функции, которую вы хотите заменить. В Conceptual function подразделе crtool задайте возвращаемый аргумент y1 с Data Type uint8 и Argument Type Скаляра, входные параметры, u1 и u2 с Data Type uint16 и Argument Type Скаляра.

  6. Создайте представление реализации. Представление реализации описывает сигнатуру оптимизационной функции. В данном примере, чтобы указать, что аргументы реализации имеют тот же порядок и свойства, что и концептуальные аргументы, установите флажок Make conceptual and implementation argument types the same.

    Задайте Name для функции замены под Function prototype.

  7. Укажите сведения о сборке. Перейдите на вкладку Build Information, чтобы открыть панель Requirements к сборке. Укажите файлы (источник, заголовок, объект), которые требуется генератору кода для замены кода. В данном примере вам не нужно указывать информацию о сборке.

  8. Проверьте и сохраните таблицу. На вкладке Mapping Information нажмите Validate entry. В контекстном меню crtool выберите File > Save table > Save.

  9. Зарегистрируйте библиотеку замещения кода. Регистрация создает библиотеку, состоящую из заданных таблиц. Выберите File > Generate registration file. В диалоговом окне Сгенерировать файл регистрации заполните следующие поля:

    Чтобы использовать библиотеку замены кода, обновите текущий сеанс работы с MATLAB командой:

    >>sl_refresh_customizations

  10. Проверьте библиотеку замещения кода. Из командной строки MATLAB откройте библиотеку с помощью Code Replacement Viewer и проверьте, что таблица и запись заданы правильно. Дополнительные сведения см. в разделе Проверка библиотеки замещения кода. Сконфигурируйте модель, чтобы использовать библиотеку замены кода, сгенерировать код и проверить, что замена происходит должным образом. Если происходит непредвиденное поведение, исследуйте журналы попадания и пропуска, чтобы устранить проблемы.

Программно разрабатывайте библиотеку замещения кода

  1. Откройте программный интерфейс из меню MATLAB, выбрав New > Function.

  2. Составьте таблицу.

    1. Создайте функцию с именем таблицы библиотеки замещения кода, которая не имеет аргументов и возвращает объект таблицы. Можно использовать эту функцию для вызова таблицы библиотеки замещения кода.

    2. Создайте объект таблицы путем вызова RTW.TflTable.

    function hTflTable = make_cbo_add_crl_table
    % Create a function to call the code replacement library table 
    
    %% Create a table object
    hTflTable = RTW.TflTable;
  3. Создайте запись. Поскольку этот пример заменяет функцию, создайте запись замены кода в вашей таблице, вызвав функцию entry RTW.TflCOperationEntry.

    function hTflTable = make_cbo_add_crl_table
    % Create a function to call the code replacement library table 
    
    %% Create a table object
    hTflTable = RTW.TflTable;
    
    %% Create an entry
    hEntry = RTW.TflCOperationEntry;
    
  4. Создайте параметры входа. Поскольку эти примеры заменяют функцию, создайте параметры входа путем вызова функции setTflCOperationEntryParameters.

    function hTflTable = make_cbo_add_crl_table
    % Create a function to call the code replacement library table 
    
    %% Create a table object
    hTflTable = RTW.TflTable;
    
    %% Create an entry
    hEntry = RTW.TflCOperationEntry;
    
    
    %% Create entry parameters
    hEntry.setTflCOperationEntryParameters(...
                       'Key',                      'RTW_OP_ADD', ...
                       'EntryInfoAlgorithm',       'RTW_CAST_BEFORE_OP', ...
                       'ImplementationName',       'u8_add_cao_u16_u16');
    
  5. Создайте концептуальное представление. Концептуальное представление описывает сигнатуру функции, которую вы хотите заменить. Чтобы явным образом задать свойства аргумента, вызовите функцию getTflArgFromString.

    function hTflTable = make_cbo_add_crl_table
    % Create a function to call the code replacement library table 
    
    %% Create a table object
    hTflTable = RTW.TflTable;
    
    %% Create an entry
    hEntry = RTW.TflCOperationEntry;
    
    
    %% Create entry parameters
    hEntry.setTflCOperationEntryParameters(...
                       'Key',                      'RTW_OP_ADD', ...
                       'EntryInfoAlgorithm',       'RTW_CAST_BEFORE_OP', ...
                       'ImplementationName',       'u8_add_cao_u16_u16');
    
    %% Create the conceptual representation
    arg = getTflArgFromString(hTflTable, 'y1', 'uint8');
    arg.IOType = 'RTW_IO_OUTPUT';
    addConceptualArg(hEntry, arg);
    
    arg = getTflArgFromString(hTflTable, 'u1', 'uint16');
    addConceptualArg(hEntry, arg );
    
    arg = getTflArgFromString(hTflTable, 'u2', 'uint16');
    addConceptualArg(hEntry, arg );
    
    
  6. Создайте представление реализации. Представление реализации описывает сигнатуру оптимизационной функции. Чтобы указать, что аргументы реализации имеют тот же порядок и свойства, что и концептуальные аргументы, вызовите функцию copyConceptualArgsToImplementation. Добавьте полную запись в таблицу путем вызова функции addEntry.

    function hTflTable = make_cbo_add_crl_table()
    % Create a function to call the code replacement library table 
    
    %% Create a table object
    hTflTable = RTW.TflTable;
    
    %% Create an entry
    hEntry = RTW.TflCOperationEntry;
    
    
    %% Create entry parameters
    hEntry.setTflCOperationEntryParameters(...
                       'Key',                      'RTW_OP_ADD', ...
                       'EntryInfoAlgorithm',       'RTW_CAST_BEFORE_OP', ...
                       'ImplementationName',       'u8_add_cao_u16_u16');
    
    %% Create the conceptual representation
    arg = getTflArgFromString(hTflTable, 'y1', 'uint8');
    arg.IOType = 'RTW_IO_OUTPUT';
    addConceptualArg(hEntry, arg);
    
    arg = getTflArgFromString(hTflTable, 'u1', 'uint16');
    addConceptualArg(hEntry, arg );
    
    arg = getTflArgFromString(hTflTable, 'u2', 'uint16');
    addConceptualArg(hEntry, arg );
    
    %% Create the Implementation Representation
    copyConceptualArgsToImplementation(hEntry);
    
    %% Add the entry to the table
    addEntry(hTflTable, hEntry);
    
  7. Укажите сведения о сборке. В параметрах входа укажите файлы (заголовок, источник, объект), которые нужны генератору кода для замены кода. В данном примере информация о сборке не требуется.

  8. Проверьте и сохраните файл индивидуальной настройки. В меню MATLAB сохраните этот файл индивидуальной настройки, выбрав File > Save. В командной строке проверьте таблицу библиотеки замещения кода, вызвав ее:

    >> hTable = make_cbo_add_crl_table
  9. Зарегистрируйте библиотеку замещения кода. Регистрация создает библиотеку замещения кода путем определения имени библиотеки, таблиц замещения кода и другой информации. Создайте файл регистрации (новый файл функции) с этими спецификациями:

    function rtwTargetInfo(cm)
     
    cm.registerTargetInfo(@loc_register_crl);
    end
     
    function this = loc_register_crl 
     
    this(1) = RTW.TflRegistry; 
    this(1).Name = 'CRL for addition subtraction operator replacement’;
    this(1).TableList = {'make_cbo_add_crl_table.m'}; % table created in this example
    this(1).TargetHWDeviceType = {'*'};
    this(1).Description = 'Example code replacement library';
    
    end
    

    Чтобы использовать библиотеку замены кода, обновите текущий сеанс работы с MATLAB командой:

    >>sl_refresh_customizations

  10. Проверьте библиотеку замещения кода. Из командной строки MATLAB откройте библиотеку с помощью Code Replacement Viewer и проверьте, что таблица и запись заданы правильно. Дополнительные сведения см. в разделе Проверка библиотеки замещения кода. Сконфигурируйте модель, чтобы использовать библиотеку замены кода, сгенерировать код и проверить, что замена происходит должным образом. Если происходит непредвиденное поведение, исследуйте журналы попадания и пропуска, чтобы устранить проблемы.

Ограничения

  • Генератор кода не заменяет операции ненулевым смещением сети.

  • При классификации операции как операции CAO генератор кода включает смежные приведения в выражение, когда выражение включает только фиксированные точки. В противном случае генератор кода классифицирует и заменяет только операцию немедленного сложения или вычитания. Утверждения, которые генератор кода исключает из классификации, появляются в сгенерированном коде.

  • Чтобы позволить генератору кода включать несколько операций приведения, которые следуют за сложением или вычитанием данных с фиксированной точкой, в классификацию выражения, режим округления должен быть simplest или floor. Рассмотрим выражение y=(cast A)(cast B)(u1+u2). Если режим округления (cast A), (cast B), и оператор сложения (+) установлены в simplest или floorгенератор кода учитывает (cast A) и (cast B) при классификации выражения и выполнении только замены.

Похожие темы