exponenta event banner

Замена кода малой матрицы на код процессора

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

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

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

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

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

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

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

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

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

  6. Создайте представление реализации. Представление реализации описывает сигнатуру функции оптимизации. Для этого примера, чтобы указать, что аргументы реализации имеют тот же порядок и те же свойства, что и концептуальные аргументы, установите флажок Сделать концептуальный и аргумент реализации типами одного и того же типа. Укажите возвращаемый аргумент y1, u1 и u2, с типом данных double и выберите диалоговое окно «Указатель».

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

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

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

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

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

    >>sl_refresh_customizations

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

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

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

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

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

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

    function hTable = crl_table_small_matrix_operator()
    % Create a function to call the code replacement library table 
    
    %% Create a table object
    hTable = RTW.TflTable;
    LibPath= fullfile(matlabroot,'examples','coder');
    
  3. Создайте запись. Поскольку этот пример заменяет функцию, создайте запись замены кода в таблице, вызвав функцию записи. RTW.TflCOperationEntry.

    function hTable = crl_table_small_matrix_operator()
    % Create a function to call the code replacement library table 
    
    %% Create a table object
    hTable = RTW.TflTable;
    LibPath= fullfile(matlabroot,'examples','coder');
    
    %% Create an entry
    hEntry = RTW.TflCOperationEntry;
  4. Создание параметров записи. Поскольку эти примеры заменяют функцию, создайте параметры записи, вызвав функцию setTflCOperationEntryParameters.

    function hTable = crl_table_small_matrix_operator()
    % Create a function to call the code replacement library table 
    
    %% Create a table object
    hTable = RTW.TflTable;
    LibPath= fullfile(matlabroot,'examples','coder');
    
    %% Create an entry
    hEntry = RTW.TflCOperationEntry;
    
    %% Create entry parameters
    hEntry.setTflCOperationEntryParameters(...
         '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. Создайте концептуальное представление. Концептуальное представление описывает подпись функции, которую требуется заменить. Чтобы явно указать свойства аргумента, вызовите функцию createAndAddConceptualArg.

    function hTable = crl_table_small_matrix_operator()
    % Create a function to call the code replacement library table 
    
    %% Create a table object
    hTable = RTW.TflTable;
    LibPath= fullfile(matlabroot,'examples','coder');
    
    %% Create an entry
    hEntry = RTW.TflCOperationEntry;
    
    %% Create entry parameters
    hEntry.setTflCOperationEntryParameters(...
         '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);
    
    
    %% Create the conceptual representation
    createAndAddConceptualArg(hEntry, 'RTW.TflArgMatrix', ...
                              'Name',         'y1', ...
                              'IOType',       'RTW_IO_OUTPUT', ...
                              'BaseType',     'double', ...
                              'DimRange',     [2 2]);
    createAndAddConceptualArg(hEntry, 'RTW.TflArgMatrix',...
                              'Name',         'u1', ...
                              'BaseType',     'double', ...
                              'DimRange',     [2 2]);
    createAndAddConceptualArg(hEntry, 'RTW.TflArgMatrix',...
                              'Name',         'u2', ...
                              'BaseType',     'double', ...
                              'DimRange',     [2 2]);
    
  6. Создайте представление реализации. Представление реализации описывает сигнатуру функции оптимизации. Чтобы указать, что аргументы реализации имеют тот же порядок и свойства, что и концептуальные аргументы, вызовите функцию getTflArgFromString.

    function hTable = crl_table_small_matrix_operator()
    % Create a function to call the code replacement library table 
    
    %% Create a table object
    hTable = RTW.TflTable;
    LibPath= fullfile(matlabroot,'examples','coder');
    
    %% Create an entry
    hEntry = RTW.TflCOperationEntry;
    
    %% Create entry parameters
    hEntry.setTflCOperationEntryParameters(...
         '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);
    
    
    %% Create the conceptual representation
    createAndAddConceptualArg(hEntry, 'RTW.TflArgMatrix', ...
                              'Name',         'y1', ...
                              'IOType',       'RTW_IO_OUTPUT', ...
                              'BaseType',     'double', ...
                              'DimRange',     [2 2]);
    createAndAddConceptualArg(hEntry, 'RTW.TflArgMatrix',...
                              'Name',         'u1', ...
                              'BaseType',     'double', ...
                              'DimRange',     [2 2]);
    createAndAddConceptualArg(hEntry, 'RTW.TflArgMatrix',...
                              'Name',         'u2', ...
                              'BaseType',     'double', ...
                              'DimRange',     [2 2]);
    
    
    %% Create the Implementation Representation
    arg = getTflArgFromString(hTable, 'y2', 'void');
    arg.IOType = 'RTW_IO_OUTPUT';
    hEntry.Implementation.setReturn(arg);
    
    arg = getTflArgFromString(hTable, 'u1', ['double' '*']);
    hEntry.Implementation.addArgument(arg);
    
    arg = getTflArgFromString(hTable, 'u2', ['double' '*']);
    hEntry.Implementation.addArgument(arg);
    
    arg = getTflArgFromString(hTable, 'y1', ['double' '*']);
    
    arg.IOType = 'RTW_IO_OUTPUT';
    hEntry.Implementation.addArgument(arg);
    
    
    %% Add the entry to the table
    hTable.addEntry(hEntry);
    
  7. Укажите сведения о построении. В параметрах ввода укажите файлы (заголовок, источник, объект), необходимые генератору кода для замены кода. Для этого примера информация о построении не требуется.

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

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

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

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

    >>sl_refresh_customizations

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

Создание кода для оптимизации производительности небольшой матричной операции для собственной функции, специфичной для процессора

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

Пример модели

Открытие модели crl_SmallMatrixOperation для конфигурирования библиотеки замены кода.

open_system('crl_SmallMatrixOperation');

copyfile SmallMatrixOperatorTargetInfo.txt rtwTargetInfo.m

Запустите файл адаптации MATLAB, чтобы создать таблицу замены кода и зарегистрировать файл. Файл настройки уже выполнен. Запустите функцию sl_refresh_customizations для регистрации библиотеки.

sl_refresh_customizations;

Включить библиотеку замены кода

  1. Откройте диалоговое окно «Параметры конфигурации».

  2. На панели «Интерфейс» установите значение «Библиотека замены кода», нажав кнопку «Выбрать» и добавив CRL for small matrix operator в область списка Выбранные библиотеки замены кода - приоритеты. Также используйте API командной строки для замены кода:

set_param('crl_SmallMatrixOperation', 'CodeReplacementLibrary', 'CRL for small matrix operator');

Создать код из модели:

evalc('slbuild(''crl_SmallMatrixOperation'')');

Просмотр созданного кода. Вот часть crl_SmallMatrixOperation.c.

cfile = fullfile('crl_SmallMatrixOperation_ert_rtw','crl_SmallMatrixOperation.c');
rtwdemodbtype(cfile,'/* Model step function ','/* Model initialize function',1, 1);
/* Model step function */
void crl_SmallMatrixOperation_step(void)
{
  /* Outport: '<Root>/Out1' incorporates:
   *  Inport: '<Root>/In1'
   *  Inport: '<Root>/In2'
   *  Sum: '<Root>/Add'
   */
  matrix_sum_2x2_double(&crl_SmallMatrixOperation_U.In1[0],
                        &crl_SmallMatrixOperation_U.In2[0],
                        &crl_SmallMatrixOperation_Y.Out1[0]);
}

Операция умножения матрицы на 2X2 матрицы заменяются на matrix_sum_2x2_double функция.

Закройте отчет о модели и создании кода.

delete ./rtwTargetInfo.m
bdclose('crl_SmallMatrixOperation');
rtwdemoclean;

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