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');

MATLAB の現在のフォルダーを書き込み可能なフォルダーに変更します。次に、関数slbuildを使用するか、"Ctrl+B" を押して、コードをモデルから生成します。

currentDir = pwd;
[~,cgDir] = rtwdemodir();
% 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');
rtwdemodbtype(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;

  /* 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++) {
      int32_T tmp;
      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');
rtwdemodbtype(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] に設定すると、コード ジェネレーターは前のコードよりも効率的なコードを生成します。コード ジェネレーターは行優先の順序でデータを移動する行優先のアルゴリズムを使用します。これにより、生成コードの操作数が少なくなります。しかし、数値結果の精度は前の例ほど高くない可能性があります。そのため、列優先アルゴリズムと行優先アルゴリズムの出力の数値にわずかな差が生じることがあります。効率的なコードが必要で、数値の精度が重要でない場合は、行優先の配列レイアウトに行優先のアルゴリズムを使用することをお勧めします。

関連するトピック