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

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

В диалоговом окне Параметров конфигурации в раскрывающемся списке 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, выходному сигналу. Выходной сигнал поступает в блок Gain.

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

Сгенерируйте код без оптимизации

  1. В диалоговом окне Параметров конфигурации проверьте, что выбран параметр Повторного использования памяти.

  2. В диалоговом окне Параметров конфигурации для параметра Optimize глобальных данных access выберите 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. В окне Генерации кода отчета выберите Static Кода Metrics Report.

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

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

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

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

В диалоговом окне Параметров конфигурации для параметра Optimize глобальных данных access выберите 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 модели пять сигналов поступают в блок Multiport Switch.

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

Сгенерируйте код без оптимизации

  1. В диалоговом окне Параметров конфигурации проверьте, что выбран параметр Повторного использования памяти.

  2. В диалоговом окне Параметров конфигурации для параметра Optimize глобальных данных access выберите 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. В окне Генерации кода отчета выберите Static Кода Metrics Report.

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

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

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

Включите оптимизацию и сгенерируйте код

В диалоговом окне Параметров конфигурации для параметра Optimize глобальных данных access выберите 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)

См. также

Похожие темы