exponenta event banner

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

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

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

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

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

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

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

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

Управление вложением с помощью параметров создания кода

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

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

В объекте конфигурации кода: InlineBetweenUserFunctions

В приложении MATLAB Coder™: На вкладке «Все параметры» установите линию между пользовательскими функциями.

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

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

В объекте конфигурации кода: InlineBetweenMathWorksFunctions

В приложении MATLAB Coder на вкладке «Все параметры» установите между функциями MathWorks

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

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

В объекте конфигурации кода: InlineBetweenUserAndMathWorksFunctions

В приложении MATLAB Coder на вкладке All Settings, Inline между функциями пользователя и MathWorks

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

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

Описания опций:

  • 'Always': Всегда выполняет встраивание на узле вызова.

  • 'Speed': Использует внутреннюю эвристику, чтобы определить, следует ли выполнять встраивание в месте вызова. Этот параметр обычно приводит к высокооптимизированному коду. Этот параметр используется по умолчанию.

  • 'Readability': Почти никогда не встроенные вызовы функций, за исключением вызовов очень небольших функций. Сохраняет модульность кода, не жертвуя слишком большой скоростью, когда это возможно. В результате получается хорошо читаемый код.

  • 'Never': Никогда не входящие вызовы функции. Обеспечивает максимальную читаемость. Этот параметр может значительно снизить производительность созданного кода.

Примечание

В некоторых случаях генератор кода может не строго следовать выбранному параметру inlining. Например, если тело функции 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 вызывает написанную функцию.

Определение функции, вызывающей функции MathWorks

Определение функции 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').

Откройте отчет о создании кода и проверьте созданный код. Обратите внимание, что для функции MathWorks не было создано отдельной функции C++ bessely. Генератор кода встроил код для bessely функция в C++ useBessely функция, которая содержится в файле useBessely.cpp.

Создание кода с измененными параметрами встраивания

Определение объекта конфигурации кода cfg для создания статической библиотеки C++. Установка свойства InlineBetweenUserAndMathWorksFunctions кому 'Never'. Этот параметр позволяет генератору кода разделить написанную функцию и функции MathWorks в созданном коде. В результате сгенерированный код C++ является менее эффективным, но более читаемым, чем встроенный код.

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. По умолчанию генерируется C++ useBessely функция похожа на MATLAB useBessely функция, которую вы написали.

type codegen/lib/useBessely/useBessely.cpp
//
// File: useBessely.cpp
//
// MATLAB Coder version            : 5.2
// C/C++ source code generated on  : 21-Apr-2021 01:23:20
//

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

См. также

| | | |

Связанные темы