Разработайте и пользуйтесь заменяющими библиотеками кода, чтобы заменить функцию и операторы в сгенерированном коде. Замена кода является методом, чтобы изменить код, который генератор кода производит для функций и операторов, чтобы удовлетворить требования кода приложения. Например, можно заменить сгенерированный код, чтобы удовлетворить требования, такие как:
Оптимизация для определенной среды выполнения, включая, но не ограниченный, определенного целевого компьютера
Интеграция с кодом существующего приложения
Соответствие со стандартом, таким как AUTOSAR
Модификация поведения кода, такого как включение или отключение неличной или встроенной поддержки
Приложение - или специфичные для проекта требования кода, такие как использование BLAS или устранение math.h
, системных заголовочных файлов или вызовов memcpy
или memset
.
Можно сконфигурировать модель, таким образом, что генератор кода пользуется заменяющей библиотекой кода, которую обеспечивает MathWorks®. Если у вас есть лицензия Embedded Coder®, можно разработать собственную заменяющую библиотеку кода в интерактивном режиме с Заменяющим Инструментом Кода или программно.
Этот пример использует модели, чтобы показать множество способов, которыми можно задать заменяющие отображения кода программно. Каждая модель включает кнопки, для которых можно использовать
Просмотрите заменяющие табличные определения библиотеки кода от Заменяющего Средства просмотра Кода
Откройте табличный файл определения библиотеки в редакторе
Откройте регистрационный файл библиотеки в редакторе
Просмотрите настройку модели
Сгенерируйте код
Для получения дополнительной информации смотрите, Задают Заменяющие Отображения Кода и Заменяющие Отображения Регистра Кода.
Идентифицируйте свои заменяющие требования кода относительно функции или операционных отображений, создайте информацию и информацию о регистрации.
Подготовьтесь к заменяющей разработке библиотеки кода (например, идентифицируйте или разработайте модели, чтобы протестировать вашу библиотеку).
Задайте заменяющие отображения кода.
Укажите информацию сборки для заменяющего кода.
Укажите заменяющие отображения кода.
Проверьте замены кода.
Разверните библиотеку.
Для получения дополнительной информации смотрите Заменяющую Разработку Библиотеки Быстрого запуска Кода - Simulink®.
Этот пример задает и указывает заменяющие отображения кода для математических функций. Можно задать заменяющие отображения кода для множества функций (см. Код, который Можно Заменить Из Моделей Simulink).
Откройте модель rtwdemo_crlmath
и используйте кнопки в нижней части окна модели, чтобы исследовать файлы, которые задают и указывают заменяющие отображения библиотеки кода.
Для получения дополнительной информации смотрите Замену Математической функции Кода.
open_system('rtwdemo_crlmath')
Этот пример показывает, как задать и указать заменяющие отображения кода для сложения (+) и вычитание (-) операции. При определении записей для операций сложения и операций вычитания, можно задать, какой из следующих алгоритмов (EntryInfoAlgorithm
) реализуют библиотечные функции:
Бросок перед операцией (CBO) (RTW_CAST_BEFORE_OP
), значение по умолчанию
Бросок после операции (CAO) (RTW_CAST_AFTER_OP
)
1. Откройте модель rtwdemo_crladdsub
. Модель показывает, как задать и указать заменяющие отображения кода для скалярного вычитания сложения (-) операции на двух операндах со следующими соединениями встроенных целочисленных типов данных:
int8
, uint8
int16
, uint16
int32
, uint32
CBO, алгоритм по умолчанию, принят.
open_system('rtwdemo_crladdsub')
2. Используйте кнопки в нижней части окна модели, чтобы исследовать файлы, которые задают и указывают заменяющие отображения библиотеки кода.
3. Исследуйте различия между CBO и алгоритмами CAO путем открытия модели rtwdemo_crl_cbo_cao
. Модель показывает два блока SUM, каждый демонстрирующий одну из настроек алгоритма, чтобы совпадать с соответствующей заменяющей записью кода.
Для блока Cast_before_operation_Sub
генератор кода вычисляет операцию вычитания в типе данных аккумулятора (int8
), который меньше, чем входные данные вводят (int16
). Это эквивалентно CBO, потому что генератор кода преобразовывает вход в тип выходных данных прежде, чем вычислить результат.
Для блока Cast_after_operation_Sub
генератор кода вычисляет операцию вычитания в типе данных аккумулятора (int32
), который больше, чем входные данные вводят (int16
). Это эквивалентно CAO, потому что генератор кода приводит к тому же результату путем вычисления результата без потери области значений или точности прежде, чем преобразовать в тип выходных данных.
open_system('rtwdemo_crl_cbo_cao')
4. Используйте кнопки в нижней части окна модели, чтобы исследовать файлы, которые задают и указывают заменяющие отображения библиотеки кода.
Для получения дополнительной информации о замене оператора сложения и оператора вычитания смотрите Замену Оператора сложения и Оператора вычитания Кода. Для получения дополнительной информации об алгоритме сложения и вычитания (EntryInfoAlgorithm
) опции смотрите setTflCOperationEntryParameters
.
Этот пример задает и указывает заменяющие отображения кода для скалярного умножения (*) и деление (/) операции. Операции берут два операнда со следующими соединениями встроенных целочисленных типов данных:
int8
, uint8
int16
, uint16
int32
, uint32
Откройте модель rtwdemo_crlmuldiv
и используйте кнопки в нижней части окна модели, чтобы исследовать файлы, которые задают и указывают заменяющие отображения библиотеки кода.
open_system('rtwdemo_crlmuldiv')
Этот пример задает и указывает заменяющие отображения кода для скалярных операций: сложение, вычитание, умножение, сопряженное комплексное число, бросок, право арифметического сдвига и оставленный арифметический сдвиг.
Поддерживаемые типы включают:
один, дважды
int8, uint8
int16, uint16
int32, uint32
csingle, cdouble
cint8, cuint8
cint16, cuint16
cint32, cuint32
целые числа фиксированной точки
смешанные типы (другой тип на каждом входе)
Откройте модель rtwdemo_crlscalarops
и используйте кнопки в нижней части окна модели, чтобы исследовать файлы, которые задают и указывают заменяющие отображения библиотеки кода.
Для получения дополнительной информации о скалярной замене оператора, Скалярной Замене Оператора Кода.
CBO, алгоритм по умолчанию для операций сложения и операций вычитания, принят.
open_system('rtwdemo_crlscalarops')
Этот пример задает и указывает заменяющие отображения кода для операций над матрицей: сложение, вычитание, умножение, перемещение, сопряженное, и Эрмитово.
Поддерживаемые типы включают:
single
, double
int8
, uint8
int16
, uint16
int32
, uint32
csingle
, cdouble
cint8
, cuint8
cint16
, cuint16
cint32
, cuint32
целые числа фиксированной точки
смешанные типы (другой тип на каждом входе)
Откройте модель rtwdemo_crlmatops
, которая показывает некоторые из этих замен. Используйте кнопки в нижней части окна модели, чтобы исследовать файлы, которые задают и указывают заменяющие отображения библиотеки кода.
Для получения дополнительной информации о замене матричного оператора смотрите Маленькую Операцию над матрицей к Замене Процессора Кода.
CBO, алгоритм по умолчанию для операций сложения и операций вычитания, принят.
open_system('rtwdemo_crlmatops')
Этот пример задает и указывает заменяющие отображения кода для стандартных подпрограмм базовых подпрограмм линейной алгебры (BLAS) xGEMM
и xGEMV
. Можно сопоставить следующие операции со стандартной подпрограммой BLAS:
Умножение матриц
Умножение матриц с транспонирует на сингле или обоих входных параметрах
Умножение матриц с операцией Hermitian на сингле или обоих входных параметрах
Откройте модель rtwdemo_crlblas
и используйте кнопки в нижней части окна модели, чтобы исследовать файлы, которые задают и указывают заменяющие отображения библиотеки кода.
Для получения дополнительной информации о замене умножения матриц для BLAS смотрите Операцию Умножения матриц к MathWorks BLAS Code Replacement.
open_system('rtwdemo_crlblas')
Этот пример задает и указывает заменяющие отображения кода для скалярного сложения (+), вычитание (-), умножение (*), и деление (/) операции. Операции берут два операнда с типами данных с фиксированной точкой.
Можно задать замены кода как соответствие:
Комбинация масштабирования наклона/смещения на входных параметрах и выводе
Комбинация масштабирования двоичной точки на входных параметрах и выводе
Относительное масштабирование между входными параметрами и вывод
То же наклонное значение и нулевое сетевое смещение через входные параметры и вывод.
Откройте модель rtwdemo_crlfixpt
и используйте кнопки в нижней части окна модели, чтобы исследовать файлы, которые задают и указывают заменяющие отображения библиотеки кода.
По умолчанию, для замен оператора сложения и оператора вычитания кода, генератор кода принимает, что заменяющий код реализует алгоритм броска перед операцией (CBO).
Используя типы данных с фиксированной точкой в модели требует лицензии Fixed-Point Designer™.
Для получения дополнительной информации о замене оператора неподвижной точки кода, смотрите Замену Оператора неподвижной точки Кода.
open_system('rtwdemo_crlfixpt')
Этот пример задает и указывает заменяющие отображения кода для пользовательских записей. Можно создать собственную запись путем разделения на подклассы от RTW.TflCFunctionEntryML
или RTW.TflCOperationEntryML
. Ваш класс записи должен реализовать метод do_match
, который настраивает ваше соответствие с логикой или изменяет совпадающую запись. Метод do_match
должен иметь фиксированную предварительно установленную подпись.
Откройте модель rtwdemo_crlcustomentry
. Модель показывает, как изменить совпадающую запись путем введения констант как дополнительных аргументов функции реализации. DTC1
, Trigonometric Function
и Product
показывают пользовательскую замену записи кода для:
Бросьте операцию, которая демонстрирует, как извлечь дробные длины от типов и передать их в функцию реализации - Out1 = custom_cast(In1, 2, 4)
.
Синус, который демонстрирует, как передать постоянное значение функции реализации - Out2=custom_sin(In2, 1)
.
Операция Multiplication, которая демонстрирует, как вычислить сетевой наклон операции и передачи это в функцию реализации - Out3=custom_multiply_shift_right(In3,In4,3)
.
Используйте кнопки в нижней части окна модели, чтобы исследовать файлы, которые задают и указывают заменяющие отображения кода.
Для получения дополнительной информации о пользовательских записях смотрите, Настраивают Процесс Соответствия и Замены.
open_system('rtwdemo_crlcustomentry')
Этот пример задает и указывает заменяющие отображения кода для функций MATLAB®, заданных в блоке MATLAB function. Функция может быть выбрана для замены путем определения coder.replace
в нем. Эта функция поддерживает замену функций MATLAB® со следующим:
Один или несколько входных параметров
Один или несколько выходных параметров
Скалярные и матричные вводы и выводы
Откройте модель rtwdemo_crlcoderreplace
. Модель показывает некоторые из этих требований. Поддерживаемые типы включают:
single
, double
int8
, uint8
int16
, uint16
int32
, uint32
csingle
, cdouble
cint8
, cuint8
cint16
, cuint16
cint32
, cuint32
Целые числа фиксированной точки
Смешанные типы (другой тип на каждом входе)
Используйте кнопки в нижней части окна модели, чтобы исследовать файлы, которые задают и указывают заменяющие отображения кода.
Для получения дополнительной информации о замене функции MATLAB® смотрите coder.replace
.
open_system('rtwdemo_crlcoderreplace')
Этот пример показывает, как указать, что выравнивание матричных операндов передало в заменяющую функцию. Некоторые целевые реализации функции требуют, чтобы данные были выровнены, чтобы оптимизировать производительность приложения. Сконфигурировать выравнивание данных для реализации функции:
Задайте требования выравнивания данных в записи таблицы. Можно задать выравнивание для аргументов функции реализации индивидуально или коллективно.
Задайте возможности выравнивания данных и синтаксис для вашего компилятора. Присоедините объект AlignmentSpecification
к объекту TargetCharacteristics
ключа реестра, заданного в вашем файле rtwTargetInfo.m
.
Откройте модель rtwdemo_crlalign
. Модель показывает три заменяющих сценария выравнивания данных кода:
Добавление-
Выравнивание экспортируемых и импортированных сигналов. Можно задать точное значение для выравнивания в диалоговом окне Signal Properties или позволить генератору кода определять лучшее выравнивание на основе использования путем отъезда набора значений выравнивания-1.
Product
- Выравнивание виртуальных и невиртуальных типов шины. Можно задать точное значение для выравнивания для свойства Alignment Simulink. Объект шины или позволяет генератору кода определять лучшее выравнивание на основе использования путем отъезда набора свойств Выравнивания-1.
EML_MMUL
- Выравнивание локальных переменных, глобальных переменных и параметров блоков.
Используйте кнопки в нижней части окна модели, чтобы исследовать файлы, которые задают и указывают заменяющие отображения кода. Обратите внимание на то, что модель сконфигурирована, чтобы использовать GCC, Лязг, MSVC или компилятор MinGW.
Для получения дополнительной информации об определении выравнивания данных для замены кода смотрите Выравнивание Данных для Замены Кода.
open_system('rtwdemo_crlalign')
Этот пример показывает, как заменяющее выравнивание данных кода может ускорить выполнение сгенерированного исполняемого файла путем включения развертывания операций SIMD в сгенерированном коде.
1. Открытая модель rtwdemo_crlalignperf
. Эта модель иллюстрирует основной алгоритм обработки изображений, представленный подсистемой Root/Filtering/Process/ALGORITHM
. Слайды a алгоритма 5x5 обрабатывают по шаблону через изображение один пиксель за один раз. Область изображения, покрытая шаблоном, формирует другого 5x5 матрица. Эта матрица поэлементна умноженный на матрицу шаблона. Эти двадцать пять элементов в результирующей матрице суммированы вместе, чтобы сформировать новое значение для того пикселя. Это поэлементное умножение матриц выполняется для всех пикселей в изображении, таким образом, его эффективность оказывает значительное влияние на полную производительность алгоритма.
perf = 'rtwdemo_crlalignperf'; open_system(perf) cc = rtwprivate('getCompilerForModel',perf); isDaDemoSupported = strcmpi(cc.comp.Manufacturer,'GNU') || ... strcmpi(cc.comp.Manufacturer,'Apple') || ... strcmpi(cc.comp.Manufacturer,'Microsoft'); if ~isDaDemoSupported recMsg = ['Use "mex -setup" to select either GCC, Clang,'... 'MSVC, or MinGW and restart this example']; warning(['The model "%s" is configured to use GCC, Clang,'... 'MSVC, or MinGW to create a Data Aligned Executable. %s.'],... perf,recMsg); %#ok<CTPCT> end
2. Используйте кнопки в нижней части окна модели, чтобы исследовать файлы, которые задают и указывают заменяющие отображения кода.
3. Выполнитесь пример двойным кликом Запускают Пример. Обратите внимание на то, что модель сконфигурирована, чтобы использовать GCC, Лязг, MSVC или компилятор MinGW. Этот пример компилирует модель дважды. Первая компиляция производит портативный, ANSI-C без выравнивания данных. Вторая компиляция пользуется заменяющей библиотекой кода SIMD, которая делает поэлементное, умножение матриц с помощью инструкций SIMD. Данные, на которых инструкции SIMD управляют потребностями, которые будут выровнены на 16-байтовом контуре. Для обеих компиляций сгенерированный код профилируется профильным рычагом. После завершенных компиляций данные, кажется, показывают сравнение времени выполнения подсистемы Root/Filtering/Process/ALGORITHM
с и без выравнивания данных.
4. Сгенерируйте базовую линию путем выбора библиотеки ANSI®, создавания модели, и затем выполнения сгенерированного исполняемого файла десять раз. Эта модель использует поэлементную операцию умножения матриц в качестве части алгоритма обработки изображений. Умножение матриц выполняется многочисленные времена, когда каждый пиксель в изображении обрабатывается. Профилирование времени рычагов выполнение исполняемого файла.
if (isDaDemoSupported) % Create a temporary folder (in your system's temporary folder) for the % build and inspection process. currentDir = pwd; [~,cgDir] = rtwdemodir(); set_param(perf, 'CodeReplacementLibrary','None'... , 'TargetLangStandard','C89/C90 (ANSI)'); rtwbuild(perf); iterations = 10; T1 = zeros(iterations, 1); for idx = 1:iterations evalc(['!', fullfile('.', perf)]); evalc(['load ', fullfile('.','rtwdemo_crlalignperf.mat')]); T1(idx) = rt_yout.signals(1).values; end if exist('rtwdemo_crlalignperf_ANSI', 'dir') rmdir('rtwdemo_crlalignperf_ANSI', 's'); end movefile('rtwdemo_crlalignperf_ert_rtw', 'rtwdemo_crlalignperf_ANSI'); else warning('Unable to build model "%s". %s.', perf,recMsg); end
### Starting build procedure for model: rtwdemo_crlalignperf ### Successful completion of build procedure for model: rtwdemo_crlalignperf
5. Сгенерируйте оптимизированный, выровненный данными исполняемый файл путем выбора библиотеки, которая сопоставляет поэлементные операции умножения матриц с внутренними вызовами SIMD и затем создавание модели. Внутренние вызовы SIMD налагают требование выравнивания к данным, переданным внутреннему. Оптимизированный исполняемый файл запущен десять раз. Профильные рычаги снова собирают данные о синхронизации.
if (isDaDemoSupported) crl=getCorrectCrlForSelectedCompiler(perf); set_param(perf,'CodeReplacementLibrary',crl); rtwbuild(perf); T2 = zeros(iterations, 1); for idx=1:iterations evalc(['!', fullfile('.', perf)]); evalc(['load ', fullfile('.','rtwdemo_crlalignperf.mat')]); T2(idx) = rt_yout.signals(1).values; end if exist('rtwdemo_crlalignperf_SIMD', 'dir') rmdir('rtwdemo_crlalignperf_SIMD','s'); end movefile('rtwdemo_crlalignperf_ert_rtw', 'rtwdemo_crlalignperf_SIMD'); else warning(... 'The Data Aligned Executable for the model "%s" could not be generated. %s.'... ,perf,recMsg); end
### Starting build procedure for model: rtwdemo_crlalignperf ### Successful completion of build procedure for model: rtwdemo_crlalignperf
6. Сравните результаты синхронизации базовых и выровненных данными исполняемых файлов. Данные о синхронизации, собранные от выполнения базовых и выровненных данными исполняемых файлов, отображены в графике. График иллюстрирует, что использование операций SIMD с выравниванием данных может эффективно ускорить выполнение параллельных данным операций.
if (isDaDemoSupported) T1(T1<0) = NaN; % The profile counter may overflow. T2(T2<0) = NaN; t = [min(T1), min(T2)]; h = figure; bar([NaN, t(1), NaN, t(2), NaN]); set(gca, 'XLim', [0.5, 5.5], 'XTickLabel',... {'', 'ANSI Multiply', '', 'SIMD Multiply', ''}, ... 'TickLength', [0 0], 'YLim', [0, max(t) * 1.3], 'YTick', []); ylabel('Execution Time (CPU Cycles)'); % annotate the plot annotation('textbox', get(gca, 'Position'), ... 'String', ['Execution Speed Increased By: ',... num2str((1 - t(2)/t(1))*100, '%2.0f'), '%'], ... 'LineStyle', 'none', 'FitBoxToText', 'off',... 'FitHeightToText', 'on', ... 'FontWeight', 'bold', 'FontSize', 12,... 'HorizontalAlignment', 'center'); % annotate first bar (simple multiply without alignment) text('Position', [2, t(1)], 'String', int2str(t(1)),... 'LineStyle', 'none', ... 'FontSize', 12, 'HorizontalAlignment', 'center',... 'VerticalAlignment', 'bottom'); % annotate second bar (SIMD Multiply without alignment) text('Position', [4, t(2)], 'String', int2str(t(2)),... 'LineStyle', 'none', ... 'FontSize', 12, 'HorizontalAlignment', 'center',... 'VerticalAlignment', 'bottom'); else warning(['The Data Alignment Performance Gain example'... ' could not be executed. %s.'], recMsg); end
Этот пример показывает Заменяющее Средство просмотра Кода. Можно использовать Заменяющее Средство просмотра Кода для:
Исследуйте который заменяющая библиотека кода использовать
Проверьте список таблиц в библиотеке и записей в каждой таблице
Рассмотрите спецификации записи таблицы
Диагностируйте замену кода промахи
Следующие команды открывают Заменяющее Средство просмотра Кода для заменяющей таблицы crl_tablemuldiv
кода:
crl = crl_table_muldiv; crviewer(crl); daRoot = DAStudio.Root; me = daRoot.find('-isa', 'DAStudio.Explorer');
Для получения дополнительной информации о Заменяющем Средстве просмотра Кода смотрите, Проверяют Замены Кода.
Для каждой записи в заменяющей таблице кода можно указать информацию сборки, такую как следующее для заменяющих функций:
Зависимости от заголовочного файла
Зависимости от исходного файла
Дополнительный включают пути
Дополнительные исходные пути
Дополнительные флаги ссылки
Кроме того, можно задать RTW.copyFileToBuildDir
, чтобы скопировать заголовок, источник или объектные файлы, которые требуются, чтобы генерировать заменяющий код к папке сборки перед генерацией кода. Можно задать RTW.copyFileToBuildDir
путем установки его как значения:
Свойство GenCallback
в вызове setTflCFunctionEntryParameters
, setTflCOperationEntryParameters
или setTflCSemaphoreEntryParameters
.
Аргумент genCallback
в вызове registerCFunctionEntry
, registerCOperationEntry
или registerCSemaphoreEntry
.
Примечание: Модели в этом примере сконфигурированы для генерации кода только потому, что реализации для заменяющих функций не обеспечиваются.
Для получения дополнительной информации об указывании информации сборки смотрите, Указывают информацию Сборки для Заменяющего Кода.
Каждое имя реализации функции, заданное заменяющей записью таблицы кода, резервируется как уникальный идентификатор. Можно задать другие идентификаторы с таблицей на основе на заголовочный файл. Обеспечение дополнительных зарезервированных идентификаторов может помочь предотвратить дублирующиеся символы и другую связанную с идентификатором компиляцию и проблемы ссылки.
Для получения дополнительной информации об определении зарезервированных идентификаторов смотрите Зарезервированные Идентификаторы и Замену Кода.
Когда вы закончили использовать модели в качестве примера, удаляете заменяющие библиотеки примера кода и закрываете модели в качестве примера с этими командами:
rmpath(fullfile(matlabroot,'toolbox','rtw','rtwdemos','crl_demo')); sl_refresh_customizations; close_system('rtwdemo_crladdsub', 0) close_system('rtwdemo_crl_cbo_cao', 0) close_system('rtwdemo_crlmuldiv', 0) close_system('rtwdemo_crlfixpt', 0) close_system('rtwdemo_crlmath', 0) close_system('rtwdemo_crlmatops', 0) close_system('rtwdemo_crlblas', 0) close_system('rtwdemo_crlscalarops', 0) close_system('rtwdemo_crlcustomentry', 0) close_system('rtwdemo_crlcoderreplace', 0) close_system('rtwdemo_crlalign', 0) close_system(perf, 0) drawnow; if exist('h','var') && ishghandle(h) close(h); end if ~isempty(me) me(end).delete; end clear h; clear crl; clear codersrc; clear codercurdir; clear n1; clear me; clear cfg; clear t; clear cc; clear recMsg; clear isDaDemoSupported; clear T1; clear T2; clear idx; clear iterations; clear rt_tout; clear rt_yout; clear crl; clear perf; rtwdemoclean; cd(currentDir)