exponenta event banner

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

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

Параметры алгоритма

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

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

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

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

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

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

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

  • Типы с плавающей и фиксированной точками в операции немедленного сложения или вычитания

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

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

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

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

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

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

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

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

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

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

    • Работа не приводит к потере дальности или точности.

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

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

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

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

    >>crtool
  2. Создайте таблицу.

    1. В контекстном меню crtool выберите «Файл» > «Новая таблица».

    2. На правой панели присвойте таблице имя crl_table_addition. Нажмите кнопку «Применить».

  3. Создайте запись. В контекстном меню crtool выберите «Файл» > «Новая запись» > «Математическая операция».

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

  5. Создайте концептуальное представление. Концептуальное представление описывает подпись функции, которую требуется заменить. В подразделе «Концептуальная функция» crtool укажите возвращаемый аргумент y1 с типом данных uint8 и тип аргумента скаляра, входные аргументы u1 и u2 с типом данных uint16 и Тип аргумента скаляра.

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

    Укажите имя для функции замены в разделе Прототип функции.

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

  8. Проверьте и сохраните таблицу. На вкладке Информация о сопоставлении щелкните Проверить запись. В контекстном меню crtool выберите «Файл» > «Сохранить таблицу» > «Сохранить».

  9. Зарегистрируйте библиотеку замены кода. При регистрации создается библиотека, состоящая из указанных таблиц. Выберите «Файл» > «Создать файл регистрации». В диалоговом окне Создать файл регистрации заполните следующие поля:

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

    >>sl_refresh_customizations

  10. Проверьте библиотеку замены кода. В командной строке MATLAB откройте библиотеку с помощью средства просмотра замены кода и убедитесь, что таблица и запись указаны правильно. Дополнительные сведения см. в разделе Проверка библиотеки замены кода. Настройте модель так, чтобы она использовала библиотеку замены кода, создавала код и проверяла, что замена происходит так, как ожидалось. Если происходит непредвиденное поведение, проверьте попадание и пропустите журналы, чтобы устранить неполадки.

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

  1. Откройте программный интерфейс в меню MATLAB, выбрав Создать > Функция.

  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. Создайте запись. Поскольку этот пример заменяет функцию, создайте запись замены кода в таблице, вызвав функцию записи. 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 сохраните этот файл настройки, выбрав «Файл» > «Сохранить». В командной строке проверьте таблицу библиотеки замены кода, вызвав ее:

    >> 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 откройте библиотеку с помощью средства просмотра замены кода и убедитесь, что таблица и запись указаны правильно. Дополнительные сведения см. в разделе Проверка библиотеки замены кода. Настройте модель так, чтобы она использовала библиотеку замены кода, создавала код и проверяла, что замена происходит так, как ожидалось. Если происходит непредвиденное поведение, проверьте попадание и пропустите журналы, чтобы устранить неполадки.

Ограничения

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

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

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

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