Маленькая операция над матрицей к замене процессора кода

В этом примере показано, как задать заменяющие отображения кода, которые заменяют нескалярные маленькие операции над матрицей на специфичные для процессора встроенные функции. Пример задает таблицу, содержащую две заменяющих записи матричного оператора для + (сложение) оператор и double тип данных. Пример задает функцию, сопоставляющую программно. В качестве альтернативы можно использовать Code Replacement Tool, чтобы задать то же отображение.

  1. Создайте табличный файл определения, который содержит функциональное определение. Например:

    function hTable = crl_table_matrix_add_double
    
  2. В теле функции составьте таблицу путем вызова функционального RTW.TflTable.

    hTable = RTW.TflTable;
    
  3. Создайте запись для первого отображения оператора с вызовом RTW.TflCOperationEntry функция.

    % Create table entry for matrix_sum_2x2_double
    op_entry = RTW.TflCOperationEntry;
  4. Установите параметры записи оператора с вызовом 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);
    
  5. Создайте концептуальные аргументы 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]);
    
  6. Создайте аргументы реализации. Существует несколько способов настроить аргументы реализации. Этот пример использует вызовы 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);
    
  7. Добавьте запись в заменяющую таблицу кода с вызовом addEntry функция.

    addEntry(hTable, op_entry);
    
  8. Создайте запись для второго отображения оператора.

    % 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);
  9. Сохраните табличный файл определения. Используйте имя табличной функции определения, чтобы назвать файл.

Похожие темы