Чтобы настроить свое приложение и выбрать компромиссы для скорости выполнения и использования памяти, можно выбрать глобальную переменную ссылочную оптимизацию для сгенерированного кода.
В диалоговом окне Параметров конфигурации в раскрывающемся списке 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')
Сгенерируйте код без оптимизации
В диалоговом окне Параметров конфигурации проверьте, что выбран параметр Повторного использования памяти.
В диалоговом окне Параметров конфигурации для параметра 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
. Меньшее количество глобальных ссылок на переменные приводит к улучшению скорости выполнения. Код использует больше инструкций для ссылок на глобальные переменные, чем для ссылок на локальные переменные.
В Отчете о метриках статического кода исследуйте раздел «Глобальные переменные».
В окне Генерации кода отчета выберите Static Кода Metrics Report.
Прокрутка вниз до Global Variables
раздел.
Выберите знак [+] перед каждой переменной, чтобы развернуть его.
Общее количество чтений и записей для глобальных переменных - 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')
Сгенерируйте код без оптимизации
В диалоговом окне Параметров конфигурации проверьте, что выбран параметр Повторного использования памяти.
В диалоговом окне Параметров конфигурации для параметра 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
раздел.
В окне Генерации кода отчета выберите Static Кода Metrics Report.
Прокрутка вниз до Global Variables
раздел.
Выберите знак [+] перед каждой переменной, чтобы развернуть его.
Общее количество чтений и записей для глобальных переменных составляет 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)
Оптимизируйте доступ к глобальным данным