В этом примере показано, как задать заменяющие отображения кода, которые заменяют нескалярные маленькие операции над матрицей на специфичные для процессора встроенные функции. Пример задает таблицу, содержащую две заменяющих записи матричного оператора для +
(сложение) оператор и double
тип данных. Пример задает функцию, сопоставляющую программно. В качестве альтернативы можно использовать Code Replacement Tool, чтобы задать то же отображение.
Создайте табличный файл определения, который содержит функциональное определение. Например:
function hTable = crl_table_matrix_add_double
В теле функции составьте таблицу путем вызова функционального RTW.TflTable
.
hTable = RTW.TflTable;
Создайте запись для первого отображения оператора с вызовом RTW.TflCOperationEntry
функция.
% Create table entry for matrix_sum_2x2_double
op_entry = RTW.TflCOperationEntry;
Установите параметры записи оператора с вызовом setTflCOperationEntryParameters
функция. Генератор кода игнорирует насыщение и округление режимов для нескалярного сложения с плавающей точкой и вычитания. Для заменяющих записей кода для нескалярного сложения и операций вычитания, которые не включают данные фиксированной точки в вызове setTflCOperationEntryParameters
, задайте 'RTW_SATURATE_UNSPECIFIED'
для SaturationMode
свойство и {'RTW_ROUND_UNSPECIFIED'}
для RoundingModes
.
setTflCOperationEntryParameters(op_entry, ... 'Key', 'RTW_OP_ADD', ... 'Priority', 30, ... 'SaturationMode', 'RTW_WRAP_ON_OVERFLOW', ... 'ImplementationName', 'matrix_sum_2x2_double', ... 'ImplementationHeaderFile', 'MatrixMath.h', ... 'ImplementationSourceFile', 'MatrixMath.c', ... 'ImplementationHeaderPath', LibPath, ... 'ImplementationSourcePath', LibPath, ... 'AdditionalIncludePaths', {LibPath}, ... 'GenCallback', 'RTW.copyFileToBuildDir', ... 'SideEffects', true);
Создайте концептуальные аргументы y1
, u1
, и u2
. Существует несколько способов настроить концептуальные аргументы. Этот пример использует вызовы createAndAddConceptualArg
функция, чтобы создать и добавить аргумент с одним вызовом функции. Чтобы задать матричный аргумент в вызове функции, используйте класс аргумента RTW.TflArgMatrix
. Задайте базовый тип и размерности, для которых аргумент допустим. Первая запись таблицы задает [2 2]
и вторая запись таблицы задает [3 3]
.
% Specify operands and result createAndAddConceptualArg(op_entry, 'RTW.TflArgMatrix', ... 'Name', 'y1', ... 'IOType', 'RTW_IO_OUTPUT', ... 'BaseType', 'double', ... 'DimRange', [2 2]); createAndAddConceptualArg(op_entry, 'RTW.TflArgMatrix',... 'Name', 'u1', ... 'BaseType', 'double', ... 'DimRange', [2 2]); createAndAddConceptualArg(op_entry, 'RTW.TflArgMatrix',... 'Name', 'u2', ... 'BaseType', 'double', ... 'DimRange', [2 2]);
Создайте аргументы реализации. Существует несколько способов настроить аргументы реализации. Этот пример использует вызовы getTflArgFromString
создать аргументы. Удобные методы setReturn
и addArgument
задайте, является ли аргумент возвращаемым значением или аргументом и добавляет аргумент в массив записи аргументов реализации.
arg = getTflArgFromString(hTable, 'y2', 'void'); arg.IOType = 'RTW_IO_OUTPUT'; op_entry.Implementation.setReturn(arg); arg = getTflArgFromString(hTable, 'u1', ['double' '*']); op_entry.Implementation.addArgument(arg); arg = getTflArgFromString(hTable, 'u2', ['double' '*']); op_entry.Implementation.addArgument(arg); arg = getTflArgFromString(hTable, 'y1', ['double' '*']); arg.IOType = 'RTW_IO_OUTPUT'; op_entry.Implementation.addArgument(arg);
Добавьте запись в заменяющую таблицу кода с вызовом addEntry
функция.
addEntry(hTable, op_entry);
Создайте запись для второго отображения оператора.
% Create table entry for matrix_sum_3x3_double op_entry = RTW.TflCOperationEntry; setTflCOperationEntryParameters(op_entry, ... 'Key', 'RTW_OP_ADD', ... 'Priority', 30, ... 'SaturationMode', 'RTW_WRAP_ON_OVERFLOW', ... 'ImplementationName', 'matrix_sum_3x3_double', ... 'ImplementationHeaderFile', 'MatrixMath.h', ... 'ImplementationSourceFile', 'MatrixMath.c', ... 'ImplementationHeaderPath', LibPath, ... 'ImplementationSourcePath', LibPath, ... 'AdditionalIncludePaths', {LibPath}, ... 'GenCallback', 'RTW.copyFileToBuildDir', ... 'SideEffects', true); % Specify operands and result createAndAddConceptualArg(op_entry, 'RTW.TflArgMatrix', ... 'Name', 'y1', ... 'IOType', 'RTW_IO_OUTPUT', ... 'BaseType', 'double', ... 'DimRange', [3 3]); createAndAddConceptualArg(op_entry, 'RTW.TflArgMatrix',... 'Name', 'u1', ... 'BaseType', 'double', ... 'DimRange', [3 3]); createAndAddConceptualArg(op_entry, 'RTW.TflArgMatrix',... 'Name', 'u2', ... 'BaseType', 'double', ... 'DimRange', [3 3]); % Specify replacement function signature arg = getTflArgFromString(hTable, 'y2', 'void'); arg.IOType = 'RTW_IO_OUTPUT'; op_entry.Implementation.setReturn(arg); arg = getTflArgFromString(hTable, 'u1', ['double' '*']); op_entry.Implementation.addArgument(arg); arg = getTflArgFromString(hTable, 'u2', ['double' '*']); op_entry.Implementation.addArgument(arg); arg = getTflArgFromString(hTable, 'y1', ['double' '*']); arg.IOType = 'RTW_IO_OUTPUT'; op_entry.Implementation.addArgument(arg); addEntry(hTable, op_entry);
Сохраните табличный файл определения. Используйте имя табличной функции определения, чтобы назвать файл.