Встраивание является методом оптимизации, который заменяет вызов функции на содержимое (тело) этой функции. Встраивание устраняет издержки вызова функции, таким образом, улучшая скорость.
В зависимости от вашего приложения слишком много встраивания кода может также иметь определенные недостатки:
Встраивание может произвести больший код C/C++ и уменьшать удобочитаемость кода. Например, предположите, что вы вызываете определенный функциональный foo
много раз в вашем источнике код MATLAB®. Если генератор кода всегда встраивает foo
, размер сгенерированного кода увеличивается потому что foo
встраивается каждый раз, когда это называется. Однако для этого, чтобы произойти, сайты вызова должны отличаться. Например, встраивание не приводит к большому размеру кода если foo
несколько раз называется в цикле.
Для исключительных функций выпущено стековое пространство для переменных, локальных для функции, когда функция возвращается. Для встроенных функций стековое пространство остается занятым локальными переменными, даже когда функция возвращается. Так, если вы ограничили RAM или стековое пространство, вы можете хотеть ограничить функциональное встраивание.
Генератор кода использует внутреннюю эвристику, чтобы определить ли к подставляемым функциям в сгенерированном коде. Эта тема справки объясняет, как подстроить эту эвристику и сгенерировать код, который встречает скорости, удобочитаемости и требованиям стекового пространства вашего приложения.
Чтобы сообщать генератору кода или к всегда или к никогда не встраивать определенную функцию MATLAB, используйте coder.inline('always')
и coder.inline('never')
директивы в теле этой функции. Чтобы узнать больше об этих директивах, смотрите coder.inline
.
У вас могут быть различные требования скорости и удобочитаемости для кода, сгенерированного для функций, которые вы пишете и код, сгенерированный для функций MathWorks®. Определенные настройки генерации кода позволяют вам отдельно управлять поведением встраивания для этих двух частей основы сгенерированного кода и на границе между ними. Эти настройки применяются и к MEX и к автономной генерации кода.
Параметр конфигурации кода | Описание | Опции |
---|---|---|
В объекте настройки кода: В приложении MATLAB Coder™: На вкладке All Settings, Inline between user functions | Средства управления, встраивающие поведение на всех сайтах вызова, где функция, которую вы записали, вызывает другую функцию, которую вы записали | 'Always' | 'Speed' (значение по умолчанию) | 'Readability' | 'Never' |
В объекте настройки кода: В приложении MATLAB Coder: На вкладке All Settings, Inline between MathWorks functions | Средства управления, встраивающие поведение на всех сайтах вызова, где MathWorks вызовы функции другая функция MathWorks | 'Always' | 'Speed' (значение по умолчанию) | 'Readability' | 'Never' |
В объекте настройки кода: В приложении MATLAB Coder: На вкладке All Settings, Inline between user and MathWorks functions | Средства управления, встраивающие поведение на всех сайтах вызова, где функция, которую вы записали, вызывает функцию MathWorks или MathWorks вызовы функции функция, которую вы записали | 'Always' | 'Speed' (значение по умолчанию) | 'Readability' | 'Never' |
Описания опции:
'Always'
: Всегда выполняет встраивание на сайте вызова.
'Speed'
: Использует внутреннюю эвристику, чтобы определить, выполнить ли встраивание на сайте вызова. Эта установка обычно приводит к очень оптимизированному коду. Эта установка является настройкой по умолчанию.
'Readability'
: Почти никогда не встраивает вызовы функции, за исключением вызовов очень небольших функций. Модульный принцип консервов кода, не жертвуя слишком большой скоростью, когда это возможно. Результаты в очень читаемом коде.
'Never'
: Никогда не встраивает вызовы функции. Результаты в максимальной удобочитаемости. Эта установка может значительно уменьшать эффективность сгенерированного кода.
Примечание
В определенных случаях генератор кода не может строго следовать опции, которую вы выбираете для параметра встраивания. Например, если тело функции MathWorks содержит coder.inline('never')
директива и вы устанавливаете InlineBetweenMathWorksFunctions
к 'Always'
, генератор кода дает настройку coder.inline
директива и не встраивает эту функцию. Для получения дополнительной информации смотрите Взаимодействие Между Различными Средствами управления Встраиванием.
Это - стратегия встраивания в качестве примера, которая балансирует скорость и удобочитаемость сгенерированного кода. Вы даете генератору кода команду выполнять эти действия одновременно:
Сохраните модульный принцип в коде, который вы пишете для лучшей удобочитаемости, даже если это уменьшает скорость сгенерированного кода. Для этого поведения, набор InlineBetweenUserFunctions
к 'Readability'
.
Сгенерируйте очень оптимизированный код для функций MathWorks, даже если это приводит к меньшему количеству читаемого кода, потому что вы, менее вероятно, будете смотреть эту часть своей кодовой базы. Для этого поведения, набор InlineBetweenMathWorksFunctions
к 'Speed'
.
В сгенерированном коде, отдельные функции, которые вы пишете и функции MathWorks так, чтобы сгенерированный код не выглядел очень отличающимся от вашего кода MATLAB. Для этого поведения, набор InlineBetweenUserAndMathWorksFunctions
к 'Readability'
.
coder.inline('always')
или coder.inline('never')
директива, помещенная в теле функции MATLAB, заменяет эффект глобальных средств управления встраиванием, включая codegen
опции и параметры конфигурации кода. Смотрите coder.inline
.
Определенные функции MathWorks включают вызов coder.inline
директива, которая влияет, как те функции взаимодействуют с глобальными настройками встраивания. Например, если тело функции MathWorks содержит coder.inline('never')
директива и вы устанавливаете InlineBetweenMathWorksFunctions
к 'Always'
, генератор кода дает настройку coder.inline
директива и не встраивает эту функцию.
-O disable:inline
и -O enable:inline
опции codegen
переопределение команды отдельные значения трех параметров конфигурации кода InlineBetweenUserFunctions
, InlineBetweenMathWorksFunctions
, и InlineBetweenUserAndMathWorksFunctions
.
В этом примере показано, как управлять поведением встраивания на всех сайтах вызова, где функция, которую вы записали, вызывает функцию MathWorks или MathWorks вызовы функции функция, которую вы записали.
Задайте функцию, которая вызывает MathWorks Functions
Задайте функцию MATLAB useBessely
это принимает двойной массив x
как введено, обрабатывает входной массив при помощи bessely
функция, и возвращает массив, который имеет тот же тип и размер как x
.
type useBessely.m
function out = useBessely(x) out = x + bessely(3,x); end
Сгенерируйте код с настройками встраивания значения по умолчанию
Сгенерируйте статическую библиотеку C++ для useBessely
функция. Задайте вход, чтобы быть 1
- 100
double
ввод. Используйте значения по умолчанию для настроек встраивания. Эти значения по умолчанию оптимизируют скорость сгенерированного кода. Используйте -c
отметьте, который дает генератору кода команду производить исходный код только и не создавать исходный код.
codegen -c -lang:c++ -config:lib useBessely -args {zeros(1,100)} -report
Code generation successful: To view the report, open('codegen/lib/useBessely/html/report.mldatx').
Откройте отчет генерации кода и смотрите сгенерированный код. Заметьте, что никакая отдельная функция C++ не была сгенерирована для функции MathWorks bessely
. Генератор кода встроил код для bessely
функция в useBessely
C++ функция, которая содержится в файле
useBessely.cpp
.
Сгенерируйте код с модифицированными настройками встраивания
Задайте объект cfg
настройки кода для генерации статической библиотеки C++. Установите свойство
InlineBetweenUserAndMathWorksFunctions
к 'Never'
. Эта установка дает генератору кода команду разделять функцию, которую вы написали и функции MathWorks в сгенерированном коде. В результате сгенерированный Код С++ менее эффективен, но более читаем, чем встроенный код.
cfg = coder.config('lib'); cfg.TargetLang = 'C++'; cfg.InlineBetweenUserAndMathWorksFunctions = 'Never';
Сгенерируйте код при помощи cfg
как объект настройки кода. Задайте вход, чтобы быть 1
- 100
double
ввод. Используйте -c
отметьте, который дает генератору кода команду производить исходный код только и не создавать исходный код.
codegen -c -config cfg useBessely -args {zeros(1,100)} -report
Code generation successful: To view the report, open('codegen/lib/useBessely/html/report.mldatx').
Откройте отчет генерации кода и смотрите сгенерированный код. Функция C++ useBessely
теперь вызовы другой C++ функционируют coder::bessely
это содержит код, сгенерированный для функции MathWorks bessely
. Как reault, сгенерированный C++ useBessely
функционируйте выглядит похожим на useBessely
MATLAB функция, которую вы записали.
type codegen/lib/useBessely/useBessely.cpp
// // File: useBessely.cpp // // MATLAB Coder version : 5.1 // C/C++ source code generated on : 17-Aug-2020 20:28:16 // // Include Files #include "useBessely.h" #include "bessely.h" #include "rt_nonfinite.h" // Function Definitions // // Arguments : const double x[100] // creal_T out[100] // Return Type : void // void useBessely(const double x[100], creal_T out[100]) { coder::bessely(x, out); for (int i = 0; i < 100; i++) { out[i].re += x[i]; } } // // File trailer for useBessely.cpp // // [EOF] //
codegen
| coder.CodeConfig
| coder.EmbeddedCodeConfig
| coder.inline
| coder.MexCodeConfig