メインコンテンツ

配列のインデックスを簡略化する

ループ内の配列にアクセスするときに配列インデックスの乗算演算を置き換え

モデル コンフィギュレーション ペイン: [コード生成] / [最適化]

説明

[配列のインデックスを簡略化する] パラメーターは、ループ内の配列にアクセスするときに配列インデックスの乗算演算を置き換えるかどうかをコード ジェネレーターに指示します。

設定

off (既定値) | オン

既定の設定: オフ

オン

配列インデックスにおいて、ループ内の配列にアクセスするときの乗算演算を生成コード内で加算演算に置き換えます。元の信号が多次元の場合、Embedded Coder® では 1 次元配列を生成するため、配列インデックスで乗算演算が発生します。この設定を使用すると、C/C++ プログラムでループ内の配列にアクセスするときのコストが高い乗算演算が排除されます。この最適化 (一般に強度低減と呼ばれる) は、ターゲット プラットフォームの C/C++ コンパイラに同様の機能がない場合に特に便利です。C/C++ プログラムに乗算演算がなくても、C/C++ コンパイラで乗算命令が生成されないわけではありません。

オフ

ループ内の配列にアクセスするときに配列インデックスの乗算演算を残します。

すべて展開する

生成されたコードには、配列の要素にインデックスを付ける場合に乗算演算が含まれることがあります。最適化パラメーター配列のインデックスを簡略化するを選択することで、配列インデックス内の乗算演算を一時変数に置き換えることができます。この最適化により、乗算演算の実行回数を減らして実行速度を向上させることができます。

次のモデルがあるとします。

Model containing a Concatenate block that concatenates three input array signals.

Constant ブロックには次の [定数値] があります。

  • Const1: reshape(1:120,[1 2 3 4 5])

  • Const2: reshape(1:120,[1 2 3 4 5])

  • Const3: reshape(1:120,[1 2 3 4 5])

Concatenate ブロックのパラメーター [モード][多次元配列] に設定されています。Constant ブロックの [サンプル時間] パラメーターは –1 に設定されています。

[配列のインデックスを簡略化する] パラメーターをオフにしてモデルをビルドすると、次のコードが生成されます。

  real_T pooled1;
  int32_T Out1_tmp;
  int32_T Out1_tmp_0;
  int32_T i;
  int32_T i_0;
  int32_T i_1;
  int32_T pooled1_tmp;
  int32_T pooled1_tmp_0;

  for (i_1 = 0; i_1 < 5; i_1++) {
    for (i_0 = 0; i_0 < 4; i_0++) {
      for (i = 0; i < 3; i++) {
        pooled1_tmp = i << 1;
        pooled1_tmp_0 = (6 * i_0 + pooled1_tmp) + 24 * i_1;
        pooled1 = ex_arrayindex_ConstP.pooled1[pooled1_tmp_0];
        pooled1_tmp = (18 * i_0 + pooled1_tmp) + 72 * i_1;
        ex_arrayindex_Y.Out1[pooled1_tmp] = pooled1;

        Out1_tmp = (((i + 3) << 1) + 18 * i_0) + 72 * i_1;
        ex_arrayindex_Y.Out1[Out1_tmp] = pooled1;

        Out1_tmp_0 = (((i + 6) << 1) + 18 * i_0) + 72 * i_1;
        ex_arrayindex_Y.Out1[Out1_tmp_0] = pooled1;

        pooled1 = ex_arrayindex_ConstP.pooled1[pooled1_tmp_0 + 1];
        ex_arrayindex_Y.Out1[pooled1_tmp + 1] = pooled1;
        ex_arrayindex_Y.Out1[Out1_tmp + 1] = pooled1;
        ex_arrayindex_Y.Out1[Out1_tmp_0 + 1] = pooled1;
      }
    }
  }

[コンフィギュレーション パラメーター] ダイアログ ボックスを開き、[配列のインデックスを簡略化する] パラメーターを選択します。モデルを再度ビルドします。生成されたコードでは、(tmp_3 + tmp_2) + tmp_0 によって配列インデックス内の乗算演算が置き換えられます。生成されたコードは次のようになります。

  real_T pooled1;
  int32_T Out1_tmp;
  int32_T i;
  int32_T i_0;
  int32_T i_1;
  int32_T pooled1_tmp;
  int32_T tmp;
  int32_T tmp_0;
  int32_T tmp_1;
  int32_T tmp_2;
  int32_T tmp_3;

  tmp = 0;
  tmp_0 = 0;
  for (i_1 = 0; i_1 < 5; i_1++) {
    tmp_1 = 0;
    tmp_2 = 0;
    for (i_0 = 0; i_0 < 4; i_0++) {
      tmp_3 = 0;
      for (i = 0; i < 3; i++) {
        pooled1_tmp = (tmp_3 + tmp_1) + tmp;
        pooled1 = ex_arrayindex_ConstP.pooled1[pooled1_tmp];
        Out1_tmp = (tmp_3 + tmp_2) + tmp_0;
        ex_arrayindex_Y.Out1[Out1_tmp] = pooled1;
        ex_arrayindex_Y.Out1[Out1_tmp + 6] = pooled1;
        ex_arrayindex_Y.Out1[Out1_tmp + 12] = pooled1;
        pooled1 = ex_arrayindex_ConstP.pooled1[pooled1_tmp + 1];
        ex_arrayindex_Y.Out1[Out1_tmp + 1] = pooled1;
        ex_arrayindex_Y.Out1[Out1_tmp + 7] = pooled1;
        ex_arrayindex_Y.Out1[Out1_tmp + 13] = pooled1;
        tmp_3 += 2;
      }

      tmp_1 += 6;
      tmp_2 += 18;
    }

    tmp += 24;
    tmp_0 += 72;
  }

推奨設定

アプリケーション設定
デバッグ影響なし
トレーサビリティ影響なし
効率性On (実行速度)
安全対策影響なし

プログラムでの使用

パラメーター: StrengthReduction
型: 文字ベクトル
値: 'on' | 'off'
既定の設定: 'off'

バージョン履歴

R2009a で導入