exponenta event banner

Оптимизация использования глобальных переменных

Чтобы настроить приложение и выбрать компромиссы для скорости выполнения и использования памяти, можно выбрать глобальную оптимизацию ссылок на переменные для сгенерированного кода.

В диалоговом окне Параметры конфигурации (Configuration Parameters) в выпадающем списке Оптимизировать глобальный доступ к данным (Optimize global data access) три параметра управляют оптимизацией использования глобальных переменных.

  • None. Используйте оптимизации по умолчанию. Этот выбор хорошо подходит для большинства моделей. Генератор кода уравновешивает использование локальных и глобальных переменных. Он генерирует код, который уравновешивает потребление ОЗУ и ПЗУ и скорость выполнения.

  • Use global to hold temporary results. Повторное использование глобальных переменных повышает эффективность кода и удобочитаемость. Эта оптимизация повторно использует глобальные переменные, что приводит к тому, что генератор кода определяет меньшее количество переменных. Это снижает потребление ОЗУ и ПЗУ, а также количество копий данных.

  • Minimize global data access. Использование локальных переменных для кэширования глобальных данных снижает потребление ПЗУ за счет уменьшения размера кода. Эта оптимизация повышает скорость выполнения, поскольку код использует меньше команд для ссылок на локальные переменные, чем для ссылок на глобальные переменные.

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

Использовать глобальный для удержания временных результатов

Генератор кода использует глобальные и локальные переменные при выборе None по сравнению с выбором Use global to hold temporary results.

Пример модели

В matlab:rtwdemo_optimize_global_ebf модели блок Assignment присваивает выходному сигналу значения, поступающие из блоков Inport и Constant. Выходной сигнал подается в блок усиления.

model = 'rtwdemo_optimize_global_ebf';
load_system('rtwdemo_optimize_global_ebf')

Создание кода без оптимизации

  1. В диалоговом окне Configuration Parameters убедитесь, что выбран параметр Signal storage reuse.

  2. В диалоговом окне «Параметры конфигурации» для параметра «Оптимизировать глобальный доступ к данным» выберите None или введите следующую команду в окне команд MATLAB:

set_param('rtwdemo_optimize_global_ebf','GlobalVariableUsage','None');

Во временной папке системы создайте папку для процесса сборки и проверки:

currentDir = pwd;
[~,cgDir] = rtwdemodir();

Создайте модель.

slbuild(model);
### Starting build procedure for: rtwdemo_optimize_global_ebf
### Successful completion of build procedure for: rtwdemo_optimize_global_ebf

Build Summary

Top model targets built:

Model                        Action                       Rebuild Reason                                    
============================================================================================================
rtwdemo_optimize_global_ebf  Code generated and compiled  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 11.586s

Просмотр созданного кода без оптимизации. Вот часть rtwdemo_optimize_global_ebf.c.

cfile = fullfile(cgDir,'rtwdemo_optimize_global_ebf_ert_rtw',...
    'rtwdemo_optimize_global_ebf.c');
rtwdemodbtype(cfile,'/* Model step','/* Model initialize',1, 0);
/* Model step function */
void rtwdemo_optimize_global_ebf_step(void)
{
  real_T rtb_Assignment[5];
  int32_T i;

  /* SignalConversion generated from: '<Root>/Assignment' incorporates:
   *  Constant: '<Root>/Constant'
   */
  for (i = 0; i < 5; i++) {
    rtb_Assignment[i] = rtCP_Constant_Value[i];
  }

  /* End of SignalConversion generated from: '<Root>/Assignment' */

  /* Assignment: '<Root>/Assignment' incorporates:
   *  Inport: '<Root>/In1'
   */
  rtb_Assignment[1] = rtU.In1;

  /* Outport: '<Root>/Out1' incorporates:
   *  Gain: '<Root>/Gain'
   */
  for (i = 0; i < 5; i++) {
    rtY.Out1[i] = 2.0 * rtb_Assignment[i];
  }

  /* End of Outport: '<Root>/Out1' */
}

Код присваивает значения локальному вектору rtb_Assignment. Последняя инструкция копирует значения в локальном векторе rtb_Assignment к глобальному вектору rtY.Out1. Уменьшение числа ссылок на глобальные переменные приводит к повышению скорости выполнения. Код использует больше инструкций для глобальных ссылок на переменные, чем для локальных ссылок на переменные.

В отчете о показателях статического кода изучите раздел Глобальные переменные.

  1. В окне Отчет о создании кода выберите Отчет о статических показателях кода.

  2. Прокрутите вниз до Global Variables раздел.

  3. Выберите знак [+] перед каждой переменной, чтобы развернуть ее.

Общее число операций чтения и записи для глобальных переменных равно 2.

Создание кода с оптимизацией

В диалоговом окне «Параметры конфигурации» для параметра «Оптимизировать глобальный доступ к данным» выберите Use global to hold temporary resultsили введите следующую команду в окне команд MATLAB:

set_param('rtwdemo_optimize_global_ebf',...
    'GlobalVariableUsage','Use global to hold temporary results');

Создайте модель.

slbuild(model);
### Starting build procedure for: rtwdemo_optimize_global_ebf
### Successful completion of build procedure for: rtwdemo_optimize_global_ebf

Build Summary

Top model targets built:

Model                        Action                       Rebuild Reason                   
===========================================================================================
rtwdemo_optimize_global_ebf  Code generated and compiled  Generated code was out of date.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 10.568s

Просмотр созданного кода с оптимизацией. Вот часть rtwdemo_optimize_global_ebf.c.

cfile = fullfile(cgDir,'rtwdemo_optimize_global_ebf_ert_rtw',...
    'rtwdemo_optimize_global_ebf.c');
rtwdemodbtype(cfile,'/* Model step','/* Model initialize',1, 0);
/* Model step function */
void rtwdemo_optimize_global_ebf_step(void)
{
  int32_T i;

  /* SignalConversion generated from: '<Root>/Assignment' incorporates:
   *  Constant: '<Root>/Constant'
   */
  for (i = 0; i < 5; i++) {
    rtY.Out1[i] = rtCP_Constant_Value[i];
  }

  /* End of SignalConversion generated from: '<Root>/Assignment' */

  /* Assignment: '<Root>/Assignment' incorporates:
   *  Inport: '<Root>/In1'
   */
  rtY.Out1[1] = rtU.In1;

  /* Outport: '<Root>/Out1' incorporates:
   *  Gain: '<Root>/Gain'
   */
  for (i = 0; i < 5; i++) {
    rtY.Out1[i] *= 2.0;
  }

  /* End of Outport: '<Root>/Out1' */
}

Код присваивает значения глобальному вектору rtY.Out1 без использования локальной переменной. Это назначение улучшает потребление ПЗУ и ОЗУ и уменьшает количество копий данных. Код помещает значение в переменную назначения для каждого назначения вместо копирования значения в конце. В отчете о показателях статического кода изучите раздел Глобальные переменные.

В результате использования глобальных переменных для хранения локальных результатов общее число операций чтения и записи для глобальных переменных увеличилось с 2 до 5. Эта оптимизация уменьшает количество копий данных за счет повторного использования глобальных переменных.

Закройте отчет о создании кода.

rtwdemoclean;
cd(currentDir)

Минимизация глобального доступа к данным

Создание оптимизированного кода, который считывает и записывает глобальные переменные реже.

Пример модели

В модели matlab:rtwdemo_optimize_global пять сигналов поступают в блок многопортового коммутатора.

model = 'rtwdemo_optimize_global';
load_system('rtwdemo_optimize_global')

Создание кода без оптимизации

  1. В диалоговом окне Configuration Parameters убедитесь, что выбран параметр Signal storage reuse.

  2. В диалоговом окне «Параметры конфигурации» для параметра «Оптимизировать глобальный доступ к данным» выберите None или введите следующую команду в окне команд MATLAB:

set_param('rtwdemo_optimize_global','GlobalVariableUsage','None');

Во временной папке системы создайте папку для процесса сборки и проверки.

currentDir = pwd;
[~,cgDir] = rtwdemodir();

Создайте модель.

slbuild(model);
### Starting build procedure for: rtwdemo_optimize_global
### Successful completion of build procedure for: rtwdemo_optimize_global

Build Summary

Top model targets built:

Model                    Action                       Rebuild Reason                                    
========================================================================================================
rtwdemo_optimize_global  Code generated and compiled  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 12.033s

Просмотр созданного кода без оптимизации. Вот часть rtwdemo_optimize_global.c.

cfile = fullfile(cgDir,'rtwdemo_optimize_global_ert_rtw',...
    'rtwdemo_optimize_global.c');
rtwdemodbtype(cfile,'/* Model step','/* Model initialize',1, 0);
/* Model step function */
void rtwdemo_optimize_global_step(void)
{
  /* MultiPortSwitch: '<Root>/Multiport Switch' incorporates:
   *  Inport: '<Root>/In1'
   */
  switch ((int32_T)rtU.In1) {
   case 1:
    /* Outport: '<Root>/Out1' incorporates:
     *  Constant: '<Root>/Constant'
     */
    rtY.Out1 = 1.0;
    break;

   case 2:
    /* Outport: '<Root>/Out1' incorporates:
     *  Constant: '<Root>/Constant1'
     */
    rtY.Out1 = 2.0;
    break;

   case 3:
    /* Outport: '<Root>/Out1' incorporates:
     *  Constant: '<Root>/Constant2'
     */
    rtY.Out1 = 3.0;
    break;

   default:
    /* Outport: '<Root>/Out1' incorporates:
     *  Constant: '<Root>/Constant3'
     */
    rtY.Out1 = 4.0;
    break;
  }

  /* End of MultiPortSwitch: '<Root>/Multiport Switch' */
}

В отчете о показателях статического кода проверьте Global Variables раздел.

  1. В окне Отчет о создании кода выберите Отчет о статических показателях кода.

  2. Прокрутите вниз до Global Variables раздел.

  3. Выберите знак [+] перед каждой переменной, чтобы развернуть ее.

Общее число операций чтения и записи для глобальных переменных равно 5.

Включить оптимизацию и создать код

В диалоговом окне «Параметры конфигурации» для параметра «Оптимизировать глобальный доступ к данным» выберите Minimize global data access или введите следующую команду в окне команд MATLAB:

set_param('rtwdemo_optimize_global',...
    'GlobalVariableUsage','Minimize global data access');

Создайте модель.

slbuild(model);
### Starting build procedure for: rtwdemo_optimize_global
### Successful completion of build procedure for: rtwdemo_optimize_global

Build Summary

Top model targets built:

Model                    Action                       Rebuild Reason                   
=======================================================================================
rtwdemo_optimize_global  Code generated and compiled  Generated code was out of date.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 10.204s

Просмотр созданного кода с оптимизацией. Вот часть rtwdemo_optimize_global.c.

cfile = fullfile(cgDir,'rtwdemo_optimize_global_ert_rtw',...
    'rtwdemo_optimize_global.c');
rtwdemodbtype(cfile,'/* Model step','/* Model initialize',1, 0);
/* Model step function */
void rtwdemo_optimize_global_step(void)
{
  real_T tmp_Out1;

  /* MultiPortSwitch: '<Root>/Multiport Switch' incorporates:
   *  Inport: '<Root>/In1'
   */
  switch ((int32_T)rtU.In1) {
   case 1:
    /* Outport: '<Root>/Out1' incorporates:
     *  Constant: '<Root>/Constant'
     */
    tmp_Out1 = 1.0;
    break;

   case 2:
    /* Outport: '<Root>/Out1' incorporates:
     *  Constant: '<Root>/Constant1'
     */
    tmp_Out1 = 2.0;
    break;

   case 3:
    /* Outport: '<Root>/Out1' incorporates:
     *  Constant: '<Root>/Constant2'
     */
    tmp_Out1 = 3.0;
    break;

   default:
    /* Outport: '<Root>/Out1' incorporates:
     *  Constant: '<Root>/Constant3'
     */
    tmp_Out1 = 4.0;
    break;
  }

  /* End of MultiPortSwitch: '<Root>/Multiport Switch' */

  /* Outport: '<Root>/Out1' */
  rtY.Out1 = tmp_Out1;
}

В rtwdemo_optimize_global.c, код присваивает постоянное значение локальной переменной tmp_Out1 в каждом заявлении. Последняя инструкция в коде копирует значение tmp_Out1 к глобальной переменной rtY.Out1. Уменьшение числа ссылок на глобальные переменные приводит к уменьшению количества команд и повышению скорости выполнения.

В отчете о показателях статического кода проверьте Global Variables раздел. В результате минимизации глобальных доступов к данным общее число операций чтения и записи для глобальных переменных сократилось с 5 до 2.

Закройте отчет о создании кода.

rtwdemoclean;
cd(currentDir)

См. также

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