Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

関数 memset を使用した生成コードの最適化

この例では、関数 memset を使用して内部ストレージをクリアすることで生成コードを最適化する方法を示します。モデル コンフィギュレーション パラメーター [float と double を 0.0 に初期化するために memset を使用] を選択すると、関数 memset は内部ストレージを整数ビット パターン 0 (全ビット オフ) にクリアします。

コンパイラとターゲットの CPU のどちらも整数ビット パターン 0 によって浮動小数点ゼロを表している場合、実行および ROM の効率性を向上させるため、このパラメーターを設定することを検討します。

メモ: コマンド ラインの値は、設定値の逆です。コマンド ラインの 'on' は設定のクリアに対応します。コマンド ラインの 'off' は設定の選択に対応します。

最適化により、以下が実現されます。

  • ROM の消費を低減する。

  • 実行速度が向上する。

モデル例

モデル 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 18.362s

最適化を行わない生成コードを表示します。以下のコード行は 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. [コンフィギュレーション パラメーター] ダイアログ ボックスで [float と double を 0.0 に初期化するために memset を使用] パラメーターを選択します。代わりに、コマンド ライン 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 10.971s

最適化を行った生成コードを表示します。以下のコード行は 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)

参考

関連するトピック