exponenta event banner

Повторное использование буферов различных размеров и размеров

Можно повторно использовать буферы для матриц различных размеров и форм. В диалоговом окне Параметры конфигурации (Configuration Parameters) можно включить эту оптимизацию, выбрав команду Повторно использовать буферы различных размеров. Эта оптимизация экономит ОЗУ и ПЗУ и повышает скорость выполнения кода.

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

Модель rtwdemo_differentsizereuse содержит сигналы различных размеров и размеров.

model='rtwdemo_differentsizereuse';
open_system(model);

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

В диалоговом окне «Параметры конфигурации» задайте для параметра «Повторно использовать буферы различных размеров» значение off или в окне команд MATLAB введите:

set_param('rtwdemo_differentsizereuse','DifferentSizesBufferReuse','off');

Создайте папку для процесса сборки и проверки.

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

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

set_param('rtwdemo_differentsizereuse','GenerateComments','off');
slbuild('rtwdemo_differentsizereuse');
### Starting build procedure for: rtwdemo_differentsizereuse
### Successful completion of build procedure for: rtwdemo_differentsizereuse

Build Summary

Top model targets built:

Model                       Action                       Rebuild Reason                                    
===========================================================================================================
rtwdemo_differentsizereuse  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.481s

Просмотр созданного кода без оптимизации. D_Work структура:

hfile = fullfile(cgDir,'rtwdemo_differentsizereuse_ert_rtw',...
    'rtwdemo_differentsizereuse.h');
rtwdemodbtype(hfile,'typedef struct {','} D_Work',1,1);
typedef struct {
  real_T ComplextoRealImag_o1[16384];
  real_T ComplextoRealImag_o2[16384];
  real_T z[3969];
  real_T z_h[3969];
  real_T z_hh[4032];
  real_T z_j[4032];
  real_T z_k[4096];
  real_T z_i[4096];
} D_Work;

Часть rtwdemo_differentsizereuse.c является:

cfile = fullfile(cgDir,'rtwdemo_differentsizereuse_ert_rtw',...
    'rtwdemo_differentsizereuse.c');
rtwdemodbtype(cfile,'#include "rtwdemo_differentsizereuse.h"',...
    'void rtwdemo_differentsizereuse_initialize(void)',1,0);
#include "rtwdemo_differentsizereuse.h"

D_Work rtDWork;
ExternalInputs rtU;
ExternalOutputs rtY;
static RT_MODEL rtM_;
RT_MODEL *const rtM = &rtM_;
static void Downsample(const real_T rtu_u[16384], real_T rty_z[4096]);
static void DeltaX(const real_T rtu_u[4096], real_T rty_z[4032]);
static void DeltaY(const real_T rtu_u[4032], real_T rty_z[3969]);
static void NoninplaceableSS1(void);
static void NoninplaceableSS2(void);
static void NoninplaceableSS3(void);
static void Downsample(const real_T rtu_u[16384], real_T rty_z[4096])
{
  int32_T tmp;
  int32_T tmp_0;
  int32_T tmp_1;
  int32_T x;
  int32_T y;
  for (x = 0; x < 64; x++) {
    for (y = 0; y < 64; y++) {
      tmp_0 = (y + 1) << 1;
      tmp_1 = (x + 1) << 1;
      tmp = ((tmp_0 - 2) << 7) + tmp_1;
      tmp_0 = ((tmp_0 - 1) << 7) + tmp_1;
      rty_z[x + (y << 6)] = (((rtu_u[tmp - 2] + rtu_u[tmp - 1]) + rtu_u[tmp_0 -
        2]) + rtu_u[tmp_0 - 1]) / 4.0;
    }
  }
}

static void NoninplaceableSS1(void)
{
  Downsample(rtDWork.ComplextoRealImag_o1, rtDWork.z_i);
  Downsample(rtDWork.ComplextoRealImag_o2, rtDWork.z_k);
}

static void DeltaX(const real_T rtu_u[4096], real_T rty_z[4032])
{
  int32_T tmp;
  int32_T x;
  int32_T y;
  for (x = 0; x < 63; x++) {
    for (y = 0; y < 64; y++) {
      tmp = (y << 6) + x;
      rty_z[x + 63 * y] = fabs(rtu_u[tmp] - rtu_u[tmp + 1]);
    }
  }
}

static void NoninplaceableSS2(void)
{
  DeltaX(rtDWork.z_i, rtDWork.z_j);
  DeltaX(rtDWork.z_k, rtDWork.z_hh);
}

static void DeltaY(const real_T rtu_u[4032], real_T rty_z[3969])
{
  int32_T tmp;
  int32_T x;
  int32_T y;
  for (x = 0; x < 63; x++) {
    for (y = 0; y < 63; y++) {
      tmp = 63 * y + x;
      rty_z[tmp] = fabs(rtu_u[tmp] - rtu_u[(y + 1) * 63 + x]);
    }
  }
}

static void NoninplaceableSS3(void)
{
  DeltaY(rtDWork.z_j, rtDWork.z_h);
  DeltaY(rtDWork.z_hh, rtDWork.z);
}

void rtwdemo_differentsizereuse_step(void)
{
  int32_T i;
  for (i = 0; i < 16384; i++) {
    rtDWork.ComplextoRealImag_o1[i] = rtU.ComplexData[i].re;
    rtDWork.ComplextoRealImag_o2[i] = rtU.ComplexData[i].im;
  }

  NoninplaceableSS1();
  NoninplaceableSS2();
  NoninplaceableSS3();
  for (i = 0; i < 3969; i++) {
    rtY.Out1[i].re = rtDWork.z_h[i];
    rtY.Out1[i].im = rtDWork.z[i];
  }
}

D_work структура содержит восемь глобальных переменных для хранения входов и выходов Downsample, DeltaX, и DeltaY. Эти переменные имеют разные размеры.

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

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

  2. Задайте для параметра Повторно использовать буферы различных размеров и размеров значение on или в окне команд MATLAB введите:

set_param('rtwdemo_differentsizereuse','DifferentSizesBufferReuse','on');

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

set_param('rtwdemo_differentsizereuse','GenerateComments','off');
slbuild(model);
### Starting build procedure for: rtwdemo_differentsizereuse
### Successful completion of build procedure for: rtwdemo_differentsizereuse

Build Summary

Top model targets built:

Model                       Action                       Rebuild Reason                   
==========================================================================================
rtwdemo_differentsizereuse  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.693s

Просмотр созданного кода без оптимизации. D_Work структура:

rtwdemodbtype(hfile,'typedef struct {','} D_Work',1,1);
typedef struct {
  real_T z[4096];
  real_T z_h[16384];
  real_T z_o[16384];
} D_Work;

Часть rtwdemo_differentsizereuse.c является:

cfile = fullfile(cgDir,'rtwdemo_differentsizereuse_ert_rtw',...
    'rtwdemo_differentsizereuse.c');
rtwdemodbtype(cfile,'#include "rtwdemo_differentsizereuse.h"',...
    'void rtwdemo_differentsizereuse_initialize(void)',1,0);
#include "rtwdemo_differentsizereuse.h"

D_Work rtDWork;
ExternalInputs rtU;
ExternalOutputs rtY;
static RT_MODEL rtM_;
RT_MODEL *const rtM = &rtM_;
static void Downsample(const real_T rtu_u[16384], real_T rty_z[4096]);
static void DeltaX(const real_T rtu_u[4096], real_T rty_z[4032]);
static void DeltaY(const real_T rtu_u[4032], real_T rty_z[3969]);
static void NoninplaceableSS1(void);
static void NoninplaceableSS2(void);
static void NoninplaceableSS3(void);
static void Downsample(const real_T rtu_u[16384], real_T rty_z[4096])
{
  int32_T tmp;
  int32_T tmp_0;
  int32_T tmp_1;
  int32_T x;
  int32_T y;
  for (x = 0; x < 64; x++) {
    for (y = 0; y < 64; y++) {
      tmp_0 = (y + 1) << 1;
      tmp_1 = (x + 1) << 1;
      tmp = ((tmp_0 - 2) << 7) + tmp_1;
      tmp_0 = ((tmp_0 - 1) << 7) + tmp_1;
      rty_z[x + (y << 6)] = (((rtu_u[tmp - 2] + rtu_u[tmp - 1]) + rtu_u[tmp_0 -
        2]) + rtu_u[tmp_0 - 1]) / 4.0;
    }
  }
}

static void NoninplaceableSS1(void)
{
  Downsample(rtDWork.z_h, rtDWork.z);
  Downsample(rtDWork.z_o, &rtDWork.z_h[0]);
}

static void DeltaX(const real_T rtu_u[4096], real_T rty_z[4032])
{
  int32_T tmp;
  int32_T x;
  int32_T y;
  for (x = 0; x < 63; x++) {
    for (y = 0; y < 64; y++) {
      tmp = (y << 6) + x;
      rty_z[x + 63 * y] = fabs(rtu_u[tmp] - rtu_u[tmp + 1]);
    }
  }
}

static void NoninplaceableSS2(void)
{
  DeltaX(rtDWork.z, &rtDWork.z_o[0]);
  DeltaX(&rtDWork.z_h[0], &rtDWork.z[0]);
}

static void DeltaY(const real_T rtu_u[4032], real_T rty_z[3969])
{
  int32_T tmp;
  int32_T x;
  int32_T y;
  for (x = 0; x < 63; x++) {
    for (y = 0; y < 63; y++) {
      tmp = 63 * y + x;
      rty_z[tmp] = fabs(rtu_u[tmp] - rtu_u[(y + 1) * 63 + x]);
    }
  }
}

static void NoninplaceableSS3(void)
{
  DeltaY(&rtDWork.z_o[0], &rtDWork.z_h[0]);
  DeltaY(&rtDWork.z[0], &rtDWork.z_o[0]);
}

void rtwdemo_differentsizereuse_step(void)
{
  int32_T i;
  for (i = 0; i < 16384; i++) {
    rtDWork.z_h[i] = rtU.ComplexData[i].re;
    rtDWork.z_o[i] = rtU.ComplexData[i].im;
  }

  NoninplaceableSS1();
  NoninplaceableSS2();
  NoninplaceableSS3();
  for (i = 0; i < 3969; i++) {
    rtY.Out1[i].re = rtDWork.z_h[i];
    rtY.Out1[i].im = rtDWork.z_o[i];
  }
}

D_work структура теперь содержит три глобальные переменные вместо восьми глобальных переменных для хранения входов и выходов Downsample, DeltaX, и DeltaY. Сгенерированный код использует эти переменные для хранения входов и выходов разного размера.

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

bdclose(model)
rtwdemoclean;
cd(currentDir)

Ограничения

  • Если используется Reusable пользовательский класс хранения, чтобы указать повторное использование для сигналов, имеющих различные размеры и формы, необходимо выбрать параметр Повторно использовать буферы различных размеров и размеров. В противном случае модель не строится.

  • Генератор кода не заменяет буфер буфером с меньшим приоритетом, размер которого меньше.

  • Генератор кода не использует буферы различных размеров и символьных размеров.

См. также

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