Управляйте встраиванием, чтобы подстроить эффективность и удобочитаемость сгенерированного кода

Встраивание является методом оптимизации, который заменяет вызов функции на содержимое (тело) этой функции. Встраивание устраняет издержки вызова функции, таким образом, улучшая скорость.

В зависимости от вашего приложения слишком много встраивания кода может также иметь определенные недостатки:

  • Встраивание может произвести больший код C/C++ и уменьшать удобочитаемость кода. Например, предположите, что вы вызываете определенный функциональный foo много раз в вашем источнике MATLAB® код. Если генератор кода всегда встраивает foo, размер сгенерированного кода увеличивается потому что foo встраивается каждый раз, когда это называется. Однако для этого, чтобы произойти, сайты вызова должны отличаться. Например, встраивание не приводит к большому размеру кода если foo несколько раз называется в цикле.

  • Для исключительных функций выпущено стековое пространство для переменных, локальных для функции, когда функция возвращается. Для встроенных функций стековое пространство остается занятым локальными переменными, даже когда функция возвращается. Так, если вы ограничили RAM или стековое пространство, вы можете хотеть ограничить функциональное встраивание.

Генератор кода использует внутреннюю эвристику, чтобы определить ли к подставляемым функциям в сгенерированном коде. Эта тема справки объясняет, как подстроить эту эвристику и сгенерировать код, который встречает скорости, удобочитаемости и требованиям стекового пространства вашего приложения.

Управляйте встраиванием определенной функции MATLAB

Чтобы сообщать генератору кода или к всегда или к никогда не встраивать определенную функцию MATLAB, используйте coder.inline('always') и coder.inline('never') директивы в теле этой функции. Чтобы узнать больше об этих директивах, смотрите coder.inline.

Управляйте встраиванием при помощи настроек генерации кода

У вас могут быть различные требования скорости и удобочитаемости для кода, сгенерированного для функций, которые вы пишете и код, сгенерированный для MathWorks® функции. Определенные настройки генерации кода позволяют вам отдельно управлять поведением встраивания для этих двух частей основы сгенерированного кода и на границе между ними. Эти настройки применяются и к MEX и к автономной генерации кода.

Параметр конфигурации кодаОписаниеОпции

В объекте настройки кода: InlineBetweenUserFunctions

В приложении MATLAB Coder™: На вкладке All Settings, Inline between user functions

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

'Always' | 'Speed' (значение по умолчанию) | 'Readability' | 'Never'

В объекте настройки кода: InlineBetweenMathWorksFunctions

В приложении MATLAB Coder: На вкладке All Settings, Inline between MathWorks functions

Средства управления, встраивающие поведение на всех сайтах вызова, где MathWorks вызовы функции другая функция MathWorks

'Always' | 'Speed' (значение по умолчанию) | 'Readability' | 'Never'

В объекте настройки кода: InlineBetweenUserAndMathWorksFunctions

В приложении 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® Functions

В этом примере показано, как управлять поведением встраивания на всех сайтах вызова, где функция, которую вы записали, вызывает функцию 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.3
// C/C++ source code generated on  : 25-Aug-2021 05:31:06
//

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

Смотрите также

| | | |

Похожие темы