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

®

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

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

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

  • Податливость стандарту, такому как AUTOSAR

  • Изменение поведения кода, такое как включение или отключение нефинитной или встроенной поддержки

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

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

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

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

  • MATLAB CODER

  • Embedded Coder

  • Fixed-Point Designer

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

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

Следующий код создает подпапку в текущей рабочей папке (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. Сконфигурируйте генератор кода, чтобы использовать библиотеку замещения кода Function Replacement Examples.

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.

Для получения дополнительной информации о замене математической функции, см. Math Function Code Replacement.

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

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

  • Приведение в действие (CBO) (RTW_CAST_BEFORE_OP), значение по умолчанию

  • Приведение в действие (CAO) (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 Code Replacement.

Замена матричного умножения для 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. Сконфигурируйте генератор кода, чтобы использовать библиотеку замещения кода Coder Replace Examples.

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 ../