exponenta event banner

Оптимизация сгенерированного кода путем разработки и использования библиотек замены кода - MATLAB

®

Разработка и использование библиотек замены кода для замены функции и операторов в сгенерированном коде. Замена кода - это метод изменения кода, создаваемого генератором кода для функций и операторов в соответствии с требованиями прикладного кода. Например, можно заменить созданный код в соответствии со следующими требованиями:

  • Оптимизация для конкретной среды выполнения, включая, но не ограничиваясь этим, конкретное целевое оборудование

  • Интеграция с существующим кодом приложения

  • Соответствие стандарту, например AUTOSAR

  • Изменение поведения кода, например, включение или отключение поддержки non finite или inline

  • Требования к прикладным или проектным кодам, такие как использование BLAS или исключение math.h, системные заголовочные файлы или вызовы memcpy или memset.

Можно настроить генератор кода на использование библиотеки замены кода, предоставляемой MathWorks ®. Если у вас есть лицензия Embedded Coder ®, вы можете разработать собственную библиотеку замены кода в интерактивном режиме с помощью средства замены кода или программным способом.

В этом примере представлен код MATLAB ®, показывающий различные способы определения сопоставлений замены кода. В каждом примере функции MATLAB ® в примере представлены файлы MATLAB ®, иллюстрирующие программную разработку замены функций и кода оператора.

Дополнительные требования:

  • Кодер MATLAB

  • Встроенный кодер

  • Конструктор фиксированных точек

Дополнительные сведения см. в разделе Что такое настройка замены кода? и разработка библиотеки для замены кода.

Создание новой папки и копирование соответствующих файлов

Следующий код создает вложенную папку в текущей рабочей папке (pwd). Новая папка содержит файлы, релевантные для данного примера.

currentDir = pwd;
[~,cgDir] = rtwdemodir();
coderdemo_setup('coderdemo_crl');

Шаги по разработке библиотеки замены кода

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

  2. Подготовка к разработке библиотеки замены кода (например, определение или разработка моделей для тестирования библиотеки).

  3. Определение сопоставлений замены кода.

  4. Укажите сведения о построении для кода замены.

  5. Регистрация сопоставлений замены кода.

  6. Проверьте замены кода.

  7. Развертывание библиотеки.

Дополнительные сведения см. в разделе Разработка библиотеки замены кода.

Замена математической функции

В этом примере определяются и регистрируются сопоставления замены кода для математических функций. Можно определить сопоставления замены кода для различных функций. Дополнительные сведения см. в разделе Код, который можно заменить из кода MATLAB.

1. Откройте и изучите файл MATLAB ® для этого примера .

edit(fullfile(matlabroot,'toolbox','coder','codegendemos','coderdemo_crl','replace_math_fcns.m'))

2. Настройте генератор кода для использования библиотеки замены кода Примеры замены функции.

RTW.TargetRegistry.getInstance('reset');
cfg = coder.config('lib','ecoder',true);
cfg.CodeReplacementLibrary = 'Function Replacement Examples';
cfg.GenerateReport = false;
cfg.LaunchReport = false;

3. Настройте параметры конфигурации для построения и определения типа ввода функции.

t = single(2); 

4. Ознакомьтесь с файлом определения таблицы замены кода.

edit(fullfile(matlabroot,'toolbox','coder','codegendemos','coderdemo_crl','crl_table_functions.m'))

5. Скомпилировать программу MATLAB ® в исходный файл C с помощью параметров конфигурации, указывающих на библиотеку замены кода и класс ввода примера, определенный на шаге 3 в качестве входных параметров для codegen команда.

codegen('replace_math_fcns', '-config', cfg, '-args', {t, t});
Code generation successful.

6. Открыть файл replace_math_fcns.c и изучите созданный исходный код.

open(fullfile('codegen','lib','replace_math_fcns','replace_math_fcns.c'))

7. Закрыть replace_math_fcns.m.

Дополнительные сведения о замене математической функции см. в разделе Замена кода математической функции.

Замена оператора сложения и вычитания

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

  • Литой перед работой (КБО) (RTW_CAST_BEFORE_OP), значение по умолчанию

  • Литой после эксплуатации (САО) (RTW_CAST_AFTER_OP)

1. Откройте и изучите файл MATLAB ® для этого примера .

edit(fullfile(matlabroot,'toolbox','coder','codegendemos','coderdemo_crl','addsub_two_int16.m'))
%
% CBO, the default algorithm, is assumed.

2. Настройте генератор кода для использования библиотеки замены кода Примеры добавления и вычитания.

RTW.TargetRegistry.getInstance('reset');
cfg = coder.config('lib','ecoder',true);
cfg.CodeReplacementLibrary = 'Addition & Subtraction Examples';
cfg.GenerateReport = false;
cfg.LaunchReport = false;

3. Настройте параметры конфигурации для построения и определения типа ввода операции.

t = int16(2); 

4. Ознакомьтесь с файлом определения таблицы замены кода.

edit(fullfile(matlabroot,'toolbox','coder','codegendemos','coderdemo_crl','crl_table_addsub.m'))

5. Скомпилировать программу MATLAB ® в исходный файл C с помощью параметров конфигурации, указывающих на требуемую библиотеку замены кода и класс ввода примера, определенный на шаге 3 в качестве входных параметров для codegen команда.

codegen('addsub_two_int16','-config', cfg, '-args', {t, t});
Code generation successful.

6. Открыть файл addsub_two_int16.c и изучите созданный исходный код.

open(fullfile('codegen','lib','addsub_two_int16','addsub_two_int16.c'))

7. Закрыть addsub_two_int16.m.

Дополнительные сведения о замене оператора сложения и вычитания см. в разделе Замена кода скалярного оператора и Замена кода оператора сложения и вычитания.

Замена оператора матрицы

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

Поддерживаемые типы:

  • single, double

  • int8, uint8

  • int16, uint16

  • int32, uint32

  • csingle, cdouble

  • cint8, cuint8

  • cint16, cuint16

  • cint32, cuint32

  • целые числа с фиксированной точкой

  • смешанные типы (различные типы на каждом входе)

1. Откройте и изучите файл MATLAB ® в следующем примере :

edit(fullfile(matlabroot,'toolbox','coder','codegendemos','coderdemo_crl','replace_matrix_ops.m'))

2. Настройте генератор кода для использования библиотеки замены кода Matrix Op Replacement Examples.

RTW.TargetRegistry.getInstance('reset');
cfg = coder.config('lib','ecoder',true);
cfg.CodeReplacementLibrary = 'Matrix Op Replacement Examples';
cfg.GenerateReport = false;
cfg.LaunchReport = false;

3. Настройте параметры конфигурации для построения и определения типа ввода операции.

t = [1.0 2.0; 3.0, 4.0]; 

4. Ознакомьтесь с файлом определения таблицы замены кода.

edit(fullfile(matlabroot,'toolbox','coder','codegendemos','coderdemo_crl','crl_table_matops.m'))

5. Скомпилировать программу MATLAB ®, используя параметры конфигурации, указывающие на требуемую библиотеку замены кода, и класс ввода примера, определенный на шаге 3 в качестве входных параметров для codegen команда.

codegen('replace_matrix_ops', '-config', cfg, '-args', {t, t});
Code generation successful.

6. Открыть файл replace_matrix_ops.c и изучите созданный исходный код.

open(fullfile('codegen','lib','replace_matrix_ops','replace_matrix_ops.c'))

7. Закрыть replace_matrix_ops.m.

Дополнительные сведения о замене матричного оператора см. в разделе Замена кода Small Matrix Operation to Processor.

Замена умножения матрицы для BLAS

В этом примере определяются и регистрируются сопоставления замены кода для подпрограмм основной линейной алгебры (BLAS). xGEMM и xGEMV. Можно сопоставить следующие операции подпрограмме BLAS:

  • Умножение матрицы

  • Матричное умножение с транспонированием на одном или обоих входах

  • Умножение матрицы с эрмитовой операцией на одном или обоих входах

1. Откройте и изучите файл MATLAB ® для этого примера .

edit(fullfile(matlabroot,'toolbox','coder','codegendemos','coderdemo_crl','replace_matrix_ops_blas.m'))

2. Настройте генератор кода для использования библиотеки замены кода BLAS Replacement Examples.

RTW.TargetRegistry.getInstance('reset');
cfg = coder.config('lib','ecoder',true);
cfg.CodeReplacementLibrary = 'BLAS Replacement Examples';
cfg.GenerateReport = false;
cfg.LaunchReport = false;

3. Настройте параметры конфигурации для построения и определения типа ввода функции.

t = [1.0 2.0 3.0; 4.0 5.0 6.0; 7.0 8.0 9.0]; 

4. Ознакомьтесь с файлом определения таблицы замены кода.

edit(fullfile(matlabroot,'toolbox','coder','codegendemos','coderdemo_crl','crl_table_blas.m'))

5. Скомпилировать программу MATLAB ®, используя параметры конфигурации, указывающие на требуемую библиотеку замены кода, и класс ввода примера, определенный на шаге 3 в качестве входных параметров для codegen команда.

codegen('replace_matrix_ops_blas', '-config', cfg, '-args', {t, t});
Code generation successful.

6. Открыть файл replace_matrix_ops_blas.c и изучите созданный исходный код.

open(fullfile('codegen','lib','replace_matrix_ops_blas','replace_matrix_ops_blas.c'))

7. Закрыть replace_matrix_ops_blas.m.

Дополнительные сведения о замене матричного умножения для BLAS см. в разделе Операция матричного умножения для замены кода BLAS MathWorks.

Замена функции MATLAB с помощью Coder.Replace

Библиотеки замены кода поддерживают замену функций MATLAB ® скалярными и матричными входами и выходами для встроенных, сложных и фиксированных типов данных.

1. Откройте и изучите файл MATLAB ® для этого примера .

edit(fullfile(matlabroot,'toolbox','coder','codegendemos','coderdemo_crl','coder_replace_fcn.m'))

2. Настройте генератор кода, чтобы использовать примеры замены кодера библиотеки замены кода.

RTW.TargetRegistry.getInstance('reset');
cfg = coder.config('lib','ecoder',true);
cfg.CodeReplacementLibrary = 'Coder Replace Examples';
cfg.GenerateReport = false;
cfg.LaunchReport = false;

3. Настройте параметры конфигурации для построения и определения типа ввода функции.

t = [1 2; 3 4];

4. Ознакомьтесь с файлом определения таблицы замены кода.

edit(fullfile(matlabroot,'toolbox','coder','codegendemos','coderdemo_crl','crl_table_coder_replace.m'))

5. Скомпилировать программу MATLAB ®, используя параметры конфигурации, указывающие на требуемую библиотеку замены кода, и класс ввода примера, определенный на шаге 3 в качестве входных параметров для codegen команда.

codegen('coder_replace_fcn', '-config', cfg, '-args', {t, t});
Code generation successful.

6. Открыть файл coder_replace_fcn.c и изучите созданный исходный код.

open(fullfile('codegen','lib','coder_replace_fcn','coder_replace_fcn.c'))

7. Закрыть coder_replace_fcn.m.

Дополнительные сведения см. в разделе docid:ecoder_ug.mw_ab7cd3a5-076f-40e4-b8a9-d3357993c100.

Сведения о построении

Для каждой записи в таблице замены кода можно указать следующую информацию о построении для функций замены:

  • Зависимости заголовочных файлов

  • Зависимости исходных файлов

  • Дополнительные пути включения

  • Дополнительные пути к источнику

  • Дополнительные флаги ссылок

Кроме того, можно указать RTW.copyFileToBuildDir копирование заголовков, исходных файлов или файлов объектов, необходимых для создания кода замены, в папку сборки перед созданием кода. Можно указать RTW.copyFileToBuildDir установив его в качестве значения:

  • Собственность GenCallback в вызове для setTflCFunctionEntryParameters, setTflCOperationEntryParameters, или setTflCSemaphoreEntryParameters.

  • Аргумент genCallback в вызове для registerCFunctionEntry, registerCOperationEntry, или registerCSemaphoreEntry.

Примечание.Модели в этом примере конфигурируются для генерации кода только потому, что реализации для функций замены не предоставляются.

Дополнительные сведения об указании сведений о построении для кода замены см. в разделе Разработка библиотеки замены кода.

Очистка

Удалить файлы и вернуться в исходную папку

RTW.TargetRegistry.getInstance('reset');
rtwdemoclean;
clear coderdemo_crl
cd ../