exponenta event banner

Оптимизация сгенерированного кода с помощью memset Функция

В этом примере показано, как оптимизировать созданный код с помощью memset для очистки внутреннего хранилища. При выборе параметра конфигурации модели Use memset to initialize floats и doubles to 0.0, memset функция очищает внутреннее хранилище до целочисленного битового шаблона 0 (то есть все биты выключены).

Если компилятор и целевой процессор представляют собой ноль с плавающей запятой с целочисленным битовым шаблоном 0рассмотрите возможность установки этого параметра для повышения эффективности выполнения и ПЗУ.

ПРИМЕЧАНИЕ: Значения командной строки являются противоположными значениям настроек. «on» в командной строке соответствует сбросу параметра. 'off' в командной строке соответствует выбору параметра.

Эта оптимизация:

  • Уменьшает потребление ПЗУ.

  • Повышает скорость выполнения.

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

Рассмотрим модель matlab:rtwdemo_memset.

model = 'rtwdemo_memset';
open_system(model);

Создать код

Генератор кода использует цикл для инициализации Constant значения блоков.

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

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

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

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

Build Summary

Top model targets built:

Model           Action                       Rebuild Reason                                    
===============================================================================================
rtwdemo_memset  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 10.531s

Просмотр созданного кода без оптимизации. Эти строки кода находятся в rtwdemo_memset.c.

cfile = fullfile(cgDir,'rtwdemo_memset_grt_rtw','rtwdemo_memset.c');
rtwdemodbtype(cfile,'/* Model initialize function */',...
    '/* Model terminate function */',1,0);
/* Model initialize function */
void rtwdemo_memset_initialize(void)
{
  /* Registration code */

  /* initialize error status */
  rtmSetErrorStatus(rtwdemo_memset_M, (NULL));

  /* external outputs */
  {
    int32_T i;
    for (i = 0; i < 50; i++) {
      rtwdemo_memset_Y.Out1[i] = 0.0;
    }
  }

  {
    int32_T i;

    /* ConstCode for Outport: '<Root>/Out1' */
    for (i = 0; i < 50; i++) {
      rtwdemo_memset_Y.Out1[i] = 56.0;
    }

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

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

  1. Откройте диалоговое окно «Параметры конфигурации».

  2. В диалоговом окне «Параметр конфигурации» выберите параметр Use memset to initialize floats и doubles to 0.0. Кроме того, для оптимизации можно использовать API командной строки:

set_param(model,'InitFltsAndDblsToZero','off');

% # Open the Configuration Parameters dialog box.

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

Генератор кода использует memset для инициализации Constant значения блоков.

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

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

Build Summary

Top model targets built:

Model           Action                       Rebuild Reason                   
==============================================================================
rtwdemo_memset  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 5.655s

Просмотр созданного кода с оптимизацией. Эти строки кода находятся в rtwdemo_memset.c.

rtwdemodbtype(cfile,'/* Model initialize function */',...
    '/* Model terminate function */',1,0);
/* Model initialize function */
void rtwdemo_memset_initialize(void)
{
  /* Registration code */

  /* initialize error status */
  rtmSetErrorStatus(rtwdemo_memset_M, (NULL));

  /* external outputs */
  (void) memset(&rtwdemo_memset_Y.Out1[0], 0,
                50U*sizeof(real_T));

  {
    int32_T i;

    /* ConstCode for Outport: '<Root>/Out1' */
    for (i = 0; i < 50; i++) {
      rtwdemo_memset_Y.Out1[i] = 56.0;
    }

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

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

bdclose(model)
rtwdemoclean;
cd(currentDir)

См. также

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