Оптимизируйте использование глобальной переменной

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

На диалоговом окне Configuration Parameters, в Optimize global data access выпадающий список, три опции параметра управляют оптимизацией использования глобальной переменной.

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

  • Use global to hold temporary results. Многократное использование глобальных переменных повышает эффективность кода и удобочитаемость. Эти глобальные переменные повторных использований оптимизации, который приводит к генератору кода, задающему меньше переменных. Это уменьшает RAM и потребление ROM и копии данных.

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

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

Используйте глобальную переменную, чтобы содержать временные результаты

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

Модель в качестве примера

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

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

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

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

  2. В диалоговом окне Configuration Parameters, для Оптимизировать глобального параметра доступа, выбирают None или введите следующую команду в Окно Команды MATLAB:

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

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

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

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

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

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

В Статическом Метрическом Отчете Кода исследуйте раздел Global Variables.

  1. В окне Code Generation Report выберите Static Code Metrics Report.

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

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

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

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

В диалоговом окне Configuration Parameters, для Оптимизировать глобального параметра доступа, выбирают Use global to hold temporary results, или введите следующую команду в Окно Команды MATLAB:

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

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

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

Просмотрите сгенерированный код с оптимизацией. Вот фрагмент 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 не используя локальную переменную. Это присвоение улучшает ROM и потребление RAM и уменьшает копии данных. Код помещает значение в целевую переменную для каждого присвоения вместо того, чтобы копировать значение в конце. В Статическом Метрическом Отчете Кода исследуйте раздел Global Variables.

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

Закройте отчет генерации кода.

rtwdemoclean;
cd(currentDir)

Минимизируйте глобальные данные доступ

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

Модель в качестве примера

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

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

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

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

  2. В диалоговом окне Configuration Parameters, для Оптимизировать глобального параметра доступа, выбирают None или введите следующую команду в Окно Команды MATLAB:

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

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

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

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

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

Просмотрите сгенерированный код без оптимизации. Вот фрагмент 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. В окне Code Generation Report выберите Static Code Metrics Report.

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

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

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

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

В диалоговом окне Configuration Parameters, для Оптимизировать параметра доступа к глобальным данным, выбирают Minimize global data access или введите следующую команду в Окно Команды MATLAB:

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

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

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

Просмотрите сгенерированный код с оптимизацией. Вот фрагмент 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)

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

Похожие темы