В этом примере показано, как разработать заменяющую библиотеку кода, чтобы оптимизировать производительность операторов сложения и операторов вычитания путем предоставления информации о том, как задать замену кода для addition
оператор. Чтобы разработать заменяющую библиотеку кода используют или интерактивный или программируемый подход. Для получения дополнительной информации смотрите, Разрабатывают Заменяющую Библиотеку Кода.
При создании заменяющей записи таблицы кода для оператора сложения или оператора вычитания, сначала определите тип алгоритма, который реализует библиотечная функция.
Бросок перед операцией (CBO), значение по умолчанию — До выполнения операции сложения или операции вычитания, тип алгоритма бросает входные значения к выходному типу. Если тип выходных данных не может точно представлять входные значения, потери могут произойти в результате броска с выходным типом. Дополнительная потеря может произойти, когда результат операции брошен к типу окончательного результата.
Бросок после операции (CAO) — алгоритм вычисляет идеальный результат операции сложения или операции вычитания двух входных параметров. Алгоритм затем вводит, бросает результат к типу выходных данных. Потеря происходит во время броска типа. Этот алгоритм ведет себя так же на язык C кроме тех случаев, когда со знаком из операндов не соответствует. Например, когда вы добавляете длинный операнд со знаком в длинный операнд без знака, стандартные правила языка C преобразуют длинный операнд со знаком в длинный операнд без знака. Результатом является значение, которое не идеально.
Во время генерации кода генератор кода исследует операции сложения и операции вычитания, включая смежные операции броска типа, чтобы определить тип алгоритма, чтобы вычислить результат выражения. На основе типов данных в выражении и типе аккумулятора (тип раньше содержал результат операции сложения или операции вычитания), генератор кода использует эти правила.
Типы с плавающей точкой только
Введите 1 тип данных | Введите 2 типа данных | Тип данных аккумулятора | Тип выходных данных | Классификация |
---|---|---|---|---|
double | double | double | double | CBO, ГЛАВНЫЙ АДМИНИСТРАТОР |
double | double | double | single | — |
double | double | single | double | — |
double | double | single | single | CBO |
double | single | double | double | CBO, ГЛАВНЫЙ АДМИНИСТРАТОР |
double | single | double | single | — |
double | single | single | double | — |
double | single | single | single | CBO |
single | single | single | single | CBO, ГЛАВНЫЙ АДМИНИСТРАТОР |
single | single | single | double | — |
single | single | double | single | — |
single | single | double | double | CBO, ГЛАВНЫЙ АДМИНИСТРАТОР |
С плавающей точкой и фиксированные точки на мгновенном сложении или операции вычитания
Алгоритм | Условия |
---|---|
CBO |
Одно из следующего верно:
|
Главный администратор | Тип операции является надмножеством входных типов — то есть, выходной тип может представлять значения входных типов без потери данных. |
Фиксированные точки только
Алгоритм | Условия |
---|---|
CBO |
По крайней мере одно из следующего верно:
|
Главный администратор | Сетевое смещение является нулем, и типы данных в выражении имеют равные наклонные поправочные коэффициенты. Для получения дополнительной информации о сетевом смещении см. “Сложение” или “Вычитание” в Замене Оператора неподвижной точки Кода (для кода MATLAB®) или Замене Оператора неподвижной точки Кода (для моделей Simulink®). |
Во многих случаях числовой результат операции CBO равен той из операции CAO. Например, если типы ввода и вывода таковы, что операция приводит к идеальному результату, как в случае int8 + int8 —> int16
. Чтобы максимизировать вероятность замены кода, происходящей в таких случаях, установите алгоритм на бросок после операции.
Откройте Code Replacement Tool (crtool) из командной строки MATLAB со следующей командой:
>>crtool
Составление таблицы.
Из crtool контекстного меню выберите File> New Table.
На правой панели назовите таблицу crl_table_addition
. Нажмите Apply.
Создайте запись. Из crtool контекстного меню выберите File> New entry> Math Operation.
Создайте параметры записи. В Function выпадающий список выберите Addition
. Информация об алгоритме появляется в crtool. В данном примере выберите параметр к Cast before operation
.
Создайте концептуальное представление. Концептуальное представление описывает подпись функции, которую вы хотите заменить. В подразделе Conceptual function crtool задайте возвращаемый аргумент, y1, с Data Type uint8
и Argument Type Скаляра, входных параметров, u1 и u2 с Data Type uint16
и Argument Type Скаляра.
Создайте представление реализации. Представление реализации описывает подпись оптимизационной функции. В данном примере, чтобы указать, что аргументы реализации имеют тот же порядок и свойства в качестве концептуальных аргументов, установите флажок Make conceptual and implementation argument types the same.
Задайте Name для заменяющей функции под Function prototype.
Укажите информацию сборки. Кликните по вкладке Build Information, чтобы открыть панель Requirements сборки. Задайте файлы (источник, заголовок, объект), которого генератор кода требует для замены кода. В данном примере вы не должны указывать информацию сборки.
Подтвердите и сохраните таблицу. Во вкладке Mapping Information нажмите Validate entry. В crtool контекстном меню выберите File> Save table> Save.
Укажите заменяющую библиотеку кода. Регистрация создает библиотеку, состоявшую из таблиц, которые вы задаете. Выберите File> Generate registration file. В Сгенерировать регистрационном диалоговом окне файла заполните эти поля:
Чтобы пользоваться вашей заменяющей библиотекой кода, обновите свой текущий сеанс работы с MATLAB с командой:
>>sl_refresh_customizations
Проверьте заменяющую библиотеку кода. Из командной строки MATLAB откройте библиотеку при помощи Code Replacement Viewer и проверьте, что таблица и запись правильно заданы. Для получения дополнительной информации смотрите, Проверяют Заменяющую Библиотеку Кода. Сконфигурируйте свою модель, чтобы пользоваться заменяющей библиотекой кода, сгенерировать код и проверить, что замена происходит как ожидалось. Если неожиданное поведение происходит, исследуйте журналы удачи и неудачи, чтобы диагностировать проблемы.
Откройте программируемый интерфейс в меню MATLAB путем выбора New> Function.
Составление таблицы.
Создайте функцию с именем вашей заменяющей таблицы библиотеки кода, которая не имеет аргументов и возвращает объект таблицы. Можно использовать эту функцию, чтобы вызвать заменяющую таблицу библиотеки кода.
Создайте объект таблицы путем вызова 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;
Создайте запись. Поскольку этот пример заменяет функцию, создайте заменяющую запись кода в своей таблице путем вызывания функции записи 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;
Создайте параметры записи. Поскольку это, примеры заменяют функцию, создают параметры записи путем вызова функционального 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');
Создайте концептуальное представление. Концептуальное представление описывает подпись функции, которую вы хотите заменить. Чтобы явным образом задать свойства аргумента, вызовите функциональный 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 );
Создайте представление реализации. Представление реализации описывает подпись оптимизационной функции. Чтобы указать, что аргументы реализации имеют тот же порядок и свойства в качестве концептуальных аргументов, вызовите функциональный 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);
Укажите информацию сборки. В параметрах записи задайте файлы (заголовок, источник, объект), в котором генератор кода нужен для замены кода. В данном примере создайте информацию, не требуется.
Подтвердите и сохраните файл настройки. В меню MATLAB сохраните этот файл настройки путем выбора File> Save. Из командной строки подтвердите заменяющую таблицу библиотеки кода путем вызова его:
>> hTable = make_cbo_add_crl_table
Укажите заменяющую библиотеку кода. Регистрация создает заменяющую библиотеку кода путем определения имени библиотеки, заменяющих таблиц кода и другой информации. Создайте регистрационный файл (новый файл функции) с этими техническими требованиями:
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
Проверьте заменяющую библиотеку кода. Из командной строки MATLAB откройте библиотеку при помощи Code Replacement Viewer и проверьте, что таблица и запись правильно заданы. Для получения дополнительной информации смотрите, Проверяют Заменяющую Библиотеку Кода. Сконфигурируйте свою модель, чтобы пользоваться заменяющей библиотекой кода, сгенерировать код и проверить, что замена происходит как ожидалось. Если неожиданное поведение происходит, исследуйте журналы удачи и неудачи, чтобы диагностировать проблемы.
Генератор кода не заменяет операции на ненулевое сетевое смещение.
При классификации операции как операцию CAO генератор кода включает смежные броски в выражение, когда выражение включает только фиксированные точки. В противном случае генератор кода классифицирует и заменяет только мгновенное сложение или операцию вычитания. Броски, которые генератор кода исключает из классификации, появляются в сгенерированном коде.
Чтобы позволить генератору кода включать несколько операций броска, которые следуют за сложением или вычитанием данных фиксированной точки в классификации выражения, округляющимся режимом должен быть simplest
или floor
. Считайте выражение y=(cast A)(cast B)(u1+u2)
. Если округляющийся режим (cast A)
, (cast B)
, и оператор сложения (+) установлен в simplest
или floor
, генератор кода учитывает (cast A)
и (cast B)
при классификации выражения и выполнении замены только.