Можно повторно использовать буферы для матриц с различными размерами и формами. В диалоговом окне Параметров конфигурации вы включите эту оптимизацию, выбрав Повторно использовать буферы разных размеров и размерностей. Эта оптимизация сохраняет использование ОЗУ и ПЗУ и улучшает скорость выполнения кода.
rtwdemo_differentsizereuse модели содержит сигналы разных размеров и размерностей.
model='rtwdemo_differentsizereuse';
open_system(model);
В диалоговом окне Параметров конфигурации установите значения буферов Reuse разных размеров и размерности параметра 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
Просмотрите сгенерированный код без оптимизации. The 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]; } }
The D_work
структура содержит восемь глобальных переменных для хранения входов и выходов Downsample
, DeltaX
, и DeltaY
. Эти переменные имеют различные размеры.
В диалоговом окне Параметров конфигурации проверьте, что выбрано Повторное использование памяти.
Установите буферы Reuse различных размеров и размерностей параметра равными 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
Просмотрите сгенерированный код без оптимизации. The 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]; } }
The D_work
теперь структура содержит три глобальные переменные вместо восьми глобальных переменных для хранения входных и выходных параметров Downsample
, DeltaX
, и DeltaY
. Сгенерированный код использует эти переменные, чтобы сохранить входы и выходы разного размера.
Закройте модель и отчет о генерации кода.
bdclose(model) rtwdemoclean; cd(currentDir)
Если вы используете Reusable
пользовательский класс памяти, чтобы задать повторное использование сигналов с различными размерами и формами, необходимо выбрать буферы Reuse различных размеров и размерностей параметра. В противном случае модель не строится.
Генератор кода не заменяет буфер с буфером с более низким приоритетом, который имеет меньший размер.
Генератор кода не использует повторно буферы, которые имеют различные размеры и символические размерности.
Повторно используйте буферы разных размеров и размерностей