В этом примере показов, как разработать библиотеку замены кода для оптимизации эффективности нескаляра операций с малой матрицей с собственными функциями процессора путем предоставления информации о том, как задать замену кода для addition
оператор. Для разработки библиотеки замещения кода используйте интерактивный или программный подход. Для получения дополнительной информации см. раздел «Разработка библиотеки замещения кода».
Откройте Code Replacement Tool (crtool) из командной строки MATLAB с помощью следующей команды:
>>crtool
Составьте таблицу.
В контекстном меню crtool выберите File > New Table.
На правой панели назовите таблицу crl_table_small_matrix
. Нажмите Apply.
Создайте запись. В контекстном меню crtool выберите File > New entry > Math Operation.
Создайте параметры входа. В раскрывающемся списке Function выберите Addition
. Информация об алгоритме появляется в crtool. В данном примере выберите параметр, который будет Cast before operation
.
Создайте концептуальное представление. Концептуальное представление описывает сигнатуру функции, которую вы хотите заменить. В Conceptual function подразделе crtool задайте возвращаемый аргумент y1
, с Data Type double
и Argument Type Matrix
, the входного параметра, u1
с Data Type double
и Argument Type Matrix
и входной параметр, u2
с Data Type double
и Argument Type Matrix
.
Создайте представление реализации. Представление реализации описывает сигнатуру оптимизационной функции. В данном примере, чтобы указать, что аргументы реализации имеют тот же порядок и свойства, что и концептуальные аргументы, установите флажок Make conceptual and implementation argument types the same. Задайте возвращаемый аргумент y1, u1
и u2
, с Data Type double
и выберите диалоговое окно Pointer.
Задайте 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 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');
Создайте запись. Поскольку этот пример заменяет функцию, создайте запись замены кода в вашей таблице, вызвав функцию entry 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;
Создайте параметры входа. Поскольку эти примеры заменяют функцию, создайте параметры входа путем вызова функции 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);
Создайте концептуальное представление. Концептуальное представление описывает сигнатуру функции, которую вы хотите заменить. Чтобы явным образом задать свойства аргумента, вызовите функцию 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]);
Создайте представление реализации. Представление реализации описывает сигнатуру оптимизационной функции. Чтобы указать, что аргументы реализации имеют тот же порядок и свойства, что и концептуальные аргументы, вызовите функцию 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);
Укажите сведения о сборке. В параметрах входа укажите файлы (заголовок, источник, объект), которые нужны генератору кода для замены кода. В данном примере информация о сборке не требуется.
Проверьте и сохраните файл индивидуальной настройки. В меню MATLAB сохраните этот файл индивидуальной настройки, выбрав File > Save. В командной строке проверьте таблицу библиотеки замещения кода, вызвав ее:
>> hTable = crl_table_small_matrix
Зарегистрируйте библиотеку замещения кода. Регистрация создает библиотеку замещения кода путем определения имени библиотеки, таблиц замещения кода и другой информации. Создайте файл регистрации (новый файл функции) с этими спецификациями:
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
Проверьте библиотеку замещения кода. Из командной строки MATLAB откройте библиотеку с помощью Code Replacement Viewer и проверьте, что таблица и запись заданы правильно. Дополнительные сведения см. в разделе Проверка библиотеки замещения кода. Сконфигурируйте модель, чтобы использовать библиотеку замены кода, сгенерировать код и проверить, что замена происходит должным образом. Если происходит непредвиденное поведение, исследуйте журналы попадания и пропуска, чтобы устранить проблемы.
В этом разделе вы генерируете код с помощью библиотеки замены кода, которую вы создали в первых двух разделах этого примера. Операция нескаляра умножения малых матриц заменяется вызовом пользовательской функции в сгенерированном коде. Этот пример не обеспечивает реализацию пользовательской функции. Напишите свою собственную реализацию.
Пример модели
Откройте модель crl_SmallMatrixOperation
для настройки библиотеки замещения кода.
open_system('crl_SmallMatrixOperation'); copyfile SmallMatrixOperatorTargetInfo.txt rtwTargetInfo.m
Запустите файл индивидуальной настройки MATLAB, чтобы создать таблицу замещения кода и зарегистрировать файл. Файл индивидуальной настройки уже выполнен. Запустите функцию sl_refresh_customizations, чтобы зарегистрировать библиотеку.
sl_refresh_customizations;
Включите библиотеку замещения кода
Откройте диалоговое окно Параметры конфигурации.
На панели Интерфейс установите библиотеку замещения кода нажав Выбрать и добавить 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;