Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

行優先の配列レイアウトのための行優先のアルゴリズム

この例では、行優先のアルゴリズムを使用して効率的なコードを生成する方法を示します。行優先の配列レイアウトに最適化されたアルゴリズムを使用コンフィギュレーション パラメーターを有効にして、行優先の配列レイアウト用に最適化された効率的な行優先のアルゴリズムを有効にすることができます。行優先のアルゴリズムを使用して生成されたコードは、行優先の配列レイアウトのデータを操作する場合に、より優れた速度と効率的なメモリ使用量によるパフォーマンスが得られます。

この例では、既定の列優先のアルゴリズムを使用した後に、行優先のアルゴリズムを使用して行優先データを操作します。この比較によって、異なる要件を満たすために適したアルゴリズムの設定を特定することができます。

行優先の配列レイアウトに対して既定の列優先のアルゴリズムを使用したコード生成

モデル例 ex_rowmajor_algorithm を開きます。

model = 'ex_rowmajor_algorithm';
open_system(model);

このモデルには Sum of Elements ブロックが含まれており、ブロックの入力は配列になります。Simulink® の既定では、列優先のアルゴリズムおよび列優先の配列レイアウトを使用するモデルが設定されます。この例では、このモデルの配列レイアウトを行優先として設定します。配列のレイアウトを指定するには、"Embedded Coder" アプリを開いて [コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。[コード生成]、[インターフェイス] ペインで、コンフィギュレーション パラメーター [配列のレイアウト] を [Row-Major] オプションに設定します。あるいは、MATLAB® コマンド ウィンドウで次のように入力します。

set_param(model,'ArrayLayout','Row-major');

関数slbuildを使用するか、"Ctrl+B" を押して、コードをモデルから生成します。

% Generate code and capture the code generation information to Value
Value=evalc('slbuild(''ex_rowmajor_algorithm'')');

ex_rowmajor_algorithm.c 内に生成されたステップ関数 ex_rowmajor_algorithm_step を検証します。

file = fullfile('ex_rowmajor_algorithm_ert_rtw','ex_rowmajor_algorithm.c');
coder.example.extractLines(file,'/* Model step function */','/* Model initialize function',1,1);
/* Model step function */
void ex_rowmajor_algorithm_step(void)
{
  int32_T i;
  int32_T i_0;
  int32_T tmp;

  /* Sum: '<Root>/Sum of Elements Dim1' incorporates:
   *  Constant: '<Root>/Constant1'
   */
  ex_rowmajor_algorithm_Y.Out2 = -0.0F;
  for (i = 0; i < 2; i++) {
    for (i_0 = 0; i_0 < 3; i_0++) {
      tmp = (i_0 << 1) + i;
      ex_rowmajor_algorithm_Y.Out2 =
        (((ex_rowmajor_algorithm_ConstP.Constant1_Value[tmp] +
           ex_rowmajor_algorithm_Y.Out2) +
          ex_rowmajor_algorithm_ConstP.Constant1_Value[tmp + 6]) +
         ex_rowmajor_algorithm_ConstP.Constant1_Value[tmp + 12]) +
        ex_rowmajor_algorithm_ConstP.Constant1_Value[tmp + 18];
    }
  }

  /* End of Sum: '<Root>/Sum of Elements Dim1' */
}

[配列のレイアウト] を [Row-major] に設定し、[行優先の配列レイアウトに最適化されたアルゴリズムを使用] コンフィギュレーション パラメーターを [off] に設定すると、コード ジェネレーターは列優先のアルゴリズムを使用します。このアルゴリズムでは、データは行優先の順序になっていても、列優先の順序でデータを移動します。このプロセスでは、生成コード内でいくつかの追加操作が必要です。これにより、コードの効率性が下がります。[行優先の配列レイアウトに最適化されたアルゴリズムを使用] パラメーターを off に設定すると、コード ジェネレーターには、単一インスタンス、複数データ (SIMD) 最適化など、他のベクトル化の最適化は含まれません。

行優先の配列レイアウトに対して行優先のアルゴリズムを使用したコード生成

行優先のアルゴリズムを有効にするには、[数学とデータ型] ペインで、コンフィギュレーション パラメーター行優先の配列レイアウトに最適化されたアルゴリズムを使用のチェック ボックスを選択します。このパラメーターにより、行優先の配列レイアウト用に最適化されたアルゴリズムが有効になります。あるいは、MATLAB コマンド ウィンドウで次のように入力します。

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

行優先のアルゴリズムを有効にした後、コードを生成します。

Value=evalc('slbuild(''ex_rowmajor_algorithm'')');

ex_rowmajor_algorithm.c 内に生成されたステップ関数 ex_rowmajor_algorithm_step を検証します。

file = fullfile('ex_rowmajor_algorithm_ert_rtw','ex_rowmajor_algorithm.c');
coder.example.extractLines(file,'/* Model step function */','/* Model initialize function',1,1);
/* Model step function */
void ex_rowmajor_algorithm_step(void)
{
  int32_T i;

  /* Sum: '<Root>/Sum of Elements Dim1' incorporates:
   *  Constant: '<Root>/Constant1'
   */
  ex_rowmajor_algorithm_Y.Out2 = -0.0F;
  for (i = 0; i < 24; i++) {
    ex_rowmajor_algorithm_Y.Out2 +=
      ex_rowmajor_algorithm_ConstP.Constant1_Value[i];
  }

  /* End of Sum: '<Root>/Sum of Elements Dim1' */
}

[配列のレイアウト]Row-major に設定し、[行優先の配列レイアウトに最適化されたアルゴリズムを使用] コンフィギュレーション パラメーターを on に設定すると、コード ジェネレーターで効率的なコードが生成されます。コード ジェネレーターは行優先の順序でデータを移動する行優先のアルゴリズムを使用します。これにより、生成コードの操作数が少なくなります。ただし、演算の順序によって列優先アルゴリズムと行優先アルゴリズムの出力の数値にわずかな差が生じることがあります。

関連するトピック