メインコンテンツ

参照モデルを含むモデルのメモリ使用量の削減

この例では、関数プロトタイプ制御仕様を持たない参照モデルを含むモデルに対して RAM 効率の高いコードを生成する方法を示します。コンフィギュレーション パラメーター [Model ブロックの出力バッファーを再利用する] を選択すると、コード ジェネレーターは参照モデルの内容を解析し、他の最適化と連携して、バッファーの再利用が可能かどうかを判別します。バッファーの再利用が可能な場合、コード ジェネレーターは既存の信号メモリを再利用しようとするか、再利用可能な一時的なバッファーを生成して参照モデルの出力を保持します。バッファーを再利用すると、RAM の使用量を大幅に削減できます。

モデル例を開く

関数プロトタイプ制御仕様を持たない参照モデル RefModel の 2 つのインスタンスを含むモデル例 RefBufferReuse を開きます。

model = 'RefBufferReuse';
open_system(model)
Rmodel= 'RefModel';
load_system(Rmodel);

このバッファー再利用最適化を使用しないコードの生成

モデルのコンフィギュレーション パラメーターを開きます。[Model ブロックの出力バッファーを再利用する] パラメーターのチェック ボックスをオフにします。または、コマンド ラインを使用します。

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

参照モデルのコンフィギュレーション パラメーターを開きます。[Model ブロックの出力バッファーを再利用する] パラメーターのチェック ボックスをオンにし、変更を保存します。または、コマンド ラインを使用します。

set_param(Rmodel, 'ReuseModelBlockBuffer', 'off');
save_system(Rmodel);

モデルをビルドします。

slbuild(model);
### Searching for referenced models in model 'RefBufferReuse'.
### Total of 2 models to build.
### Starting serial code generation build.
### Starting build procedure for: RefModel
### Successful completion of build procedure for: RefModel
### Starting build procedure for: RefBufferReuse
codeInterfacePackaging: Nonreusable function
codeInterfacePackaging: NonReusable
### Successful completion of build procedure for: RefBufferReuse

Build Summary

Model reference code generation targets:

Model     Build Reason                        Status                        Build Duration
==========================================================================================
RefModel  Target (RefModel.c) did not exist.  Code generated and compiled.  0h 0m 10.582s 

Top model targets:

Model           Build Reason                                         Status                        Build Duration
=================================================================================================================
RefBufferReuse  Information cache folder or artifacts were missing.  Code generated and compiled.  0h 0m 14.887s 

2 of 2 models built (0 models already up to date)
Build duration: 0h 0m 26.871s

生成されたコードを確認します。

file = fullfile('RefBufferReuse_ert_rtw','RefBufferReuse.c');
coder.example.extractLines(file,'/* Model step function */','/* Model initialize function',1,1);
/* Model step function */
void RefBufferReuse_step(void)
{
  /* local block i/o variables */
  real_T rtb_RefModel1[100];
  real_T rtb_Add[100];
  real_T rtb_RefModel1_0;
  int32_T i;

  /* ModelReference: '<Root>/RefModel1' incorporates:
   *  Inport: '<Root>/In1'
   */
  RefModel(&rtU.In1[0], &rtb_RefModel1[0]);

  /* Sum: '<Root>/Add' */
  for (i = 0; i < 100; i++) {
    rtb_RefModel1_0 = rtb_RefModel1[i];
    rtb_Add[i] = rtb_RefModel1_0 + rtb_RefModel1_0;
  }

  /* End of Sum: '<Root>/Add' */

  /* ModelReference: '<Root>/RefModel2' incorporates:
   *  Outport: '<Root>/Out1'
   */
  RefModel(&rtb_Add[0], &rtY.Out1[0]);
}

生成されたコードでは、RefModel1 の出力を保持するための一意の rtb_Model1 バッファーが生成されます。

このバッファー再利用最適化を使用したコードの生成

モデルのコンフィギュレーション パラメーターを開きます。[Model ブロックの出力バッファーを再利用する] パラメーターのチェック ボックスをオンにします。または、コマンド ラインを使用します。

set_param(model, 'ReuseModelBlockBuffer', 'on');

参照モデルのコンフィギュレーション パラメーターを開きます。[Model ブロックの出力バッファーを再利用する] パラメーターのチェック ボックスをオンにし、変更を保存します。または、コマンド ラインを使用します。

set_param(Rmodel, 'ReuseModelBlockBuffer', 'on');
save_system(Rmodel);

モデルをビルドします。

slbuild(model);
### Searching for referenced models in model 'RefBufferReuse'.
### Total of 2 models to build.
### Starting serial code generation build.
### Starting build procedure for: RefModel
### Successful completion of build procedure for: RefModel
### Starting build procedure for: RefBufferReuse
codeInterfacePackaging: Nonreusable function
codeInterfacePackaging: NonReusable
### Successful completion of build procedure for: RefBufferReuse

Build Summary

Model reference code generation targets:

Model     Build Reason                        Status                        Build Duration
==========================================================================================
RefModel  Model or library RefModel changed.  Code generated and compiled.  0h 0m 8.4455s 

Top model targets:

Model           Build Reason                     Status                        Build Duration
=============================================================================================
RefBufferReuse  Referenced models were updated.  Code generated and compiled.  0h 0m 10.723s 

2 of 2 models built (0 models already up to date)
Build duration: 0h 0m 20.261s

生成されたコードを確認します。

file = fullfile('RefBufferReuse_ert_rtw','RefBufferReuse.c');
coder.example.extractLines(file,'/* Model step function */','/* Model initialize function',1,1);
/* Model step function */
void RefBufferReuse_step(void)
{
  real_T rtb_Add[100];
  real_T rtb_Add_0;
  int32_T i;

  /* ModelReference: '<Root>/RefModel1' incorporates:
   *  Inport: '<Root>/In1'
   */
  RefModel(&rtU.In1[0], &rtb_Add[0]);

  /* Sum: '<Root>/Add' */
  for (i = 0; i < 100; i++) {
    rtb_Add_0 = rtb_Add[i];
    rtb_Add[i] = rtb_Add_0 + rtb_Add_0;
  }

  /* End of Sum: '<Root>/Add' */

  /* ModelReference: '<Root>/RefModel2' incorporates:
   *  Outport: '<Root>/Out1'
   */
  RefModel(&rtb_Add[0], &rtY.Out1[0]);
}

生成されたコードでは、rtb_Add バッファーを再利用して RefModel1 の出力が保持されます。

例のフォルダーおよびファイルのクリーン アップ

モデルを閉じます。

bdclose(model);

参考

トピック