Lookup Table ブロックを使用してモデルを列優先レイアウトから行優先レイアウトに変換する
Simulink® Coder™ ではコード生成用に行優先の配列レイアウトをサポートしています。行優先の配列レイアウトを使用する既存のアプリケーションは、行優先の配列レイアウトで生成されたコードと統合できます。ルックアップ テーブル (LUT) ブロックで既存のモデルを列優先の配列レイアウトから行優先の配列レイアウトに切り替える場合、LUT ブロックを列優先アルゴリズムから行優先アルゴリズムに変換することが推奨されます。行優先アルゴリズムを使用して生成されたコードは、行優先の配列レイアウトのテーブル データを操作する場合に最適な速度とメモリ使用量によるパフォーマンスが得られます。列優先アルゴリズムを使用して生成されたコードは、列優先の配列レイアウトで最適なパフォーマンスが得られます。
この例では、LUT ブロックをもつモデルを列優先のレイアウトから行優先のレイアウトに変換し、行優先の配列レイアウトでの最適なパフォーマンスを達成するワークフローを示します。
この例では次を行います。
配列レイアウトの特定と最適化されたアルゴリズムの選択。
テーブル置換によるセマンティクスの保持。
行優先アルゴリズムおよび配列のレイアウトを使用したコードの生成。
列優先アルゴリズムを使用したコードのシミュレーションおよび生成
1. モデル例 RowLUTColToRow
を開きます。
open_system('RowLUTColToRow');
既定では、Simulink は列優先アルゴリズムおよび列優先の配列レイアウトを使用するようにモデルを設定します。これらのパラメーターは、[コンフィギュレーション パラメーター] ダイアログ ボックスのコンフィギュレーション パラメーターです。
[数学とデータ型]、行優先の配列レイアウトに最適化されたアルゴリズムを使用 — このパラメーターは、シミュレーションとコード生成に影響します。
[コード生成]、[インターフェイス]、Array layout — このパラメーターはコード生成のみに影響します。
2. [モデル化] タブで [実行] をクリックしてモデルをシミュレーションし、ワークスペース変数 yout
に記録されている出力を確認します。
3. MATLAB® の現在のフォルダーを書き込み可能なフォルダーに変更します。[C コード] タブで [ビルド] をクリックし、C コードを生成します。
行優先の配列レイアウトに最適化されたアルゴリズムの選択
行優先の配列レイアウトのテーブル データがキャリブレーションのフィールドで頻繁に使用されます。行優先のテーブル データと既存のモデルのインターフェイスをとるには、行優先のテーブル データを効率的に操作するように列優先のモデルを更新します。
指定された配列のレイアウトに最適化されているアルゴリズムを使用すると、最適なパフォーマンスが得られます。たとえば、コード生成中に [配列のレイアウト] が Row-major
に設定されている場合は、行優先アルゴリズムを使用します。
1. 行優先アルゴリズムを有効にするために、[コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。[数学とデータ型] ペインで、コンフィギュレーション パラメーター [行優先の配列レイアウトに最適化されたアルゴリズムを使用] を選択します。あるいは、MATLAB コマンド ウィンドウで次のように入力します。
set_param('RowLUTColToRow','UseRowMajorAlgorithm','on');
2. [実行] をクリックしてモデルをシミュレーションします。Simulink は、Prelookup ブロックと Interpolation ブロックの間で矛盾しているブレークポイントおよびテーブル データを検出して、エラーを報告します。このエラーの原因は、列優先アルゴリズムから行優先アルゴリズムに切り替えるとき (つまり、以下の場合) に発生する 2 つのセマンティクス変更です。
Interpolation ブロックの 3 次元のテーブルから平面を選択する。
Direct Lookup Table ブロックを介して 4 次元テーブルから平面を選択する。
テーブル置換の使用によるセマンティクスの保持
1. 内挿前のサブテーブル選択またはベクトルまたは 2 次元行列を出力する直接ルックアップの場合、コンフィギュレーション パラメーター [行優先の配列レイアウトに最適化されたアルゴリズムを使用] を選択して列優先アルゴリズムから行優先アルゴリズムに切り替えるとき、モデル セマンティクスが変更されます。セマンティクスを保持して以前のエラーを修正するには、次のコマンドを使用してテーブル データを置換します。
T4d_str = get_param('RowLUTColToRow/Direct LUT','Table'); set_param('RowLUTColToRow/Direct LUT','Table',... ['permute(',T4d_str,',[3,4,1,2])']);
T3d_str = get_param('RowLUTColToRow/Interp2','Table'); set_param('RowLUTColToRow/Interp2','Table',... ['permute(',T3d_str,',[3,1,2])']);
2. ファイルからテーブル データをインポートする前に、ファイル内のテーブル データを置換しなければなりません。この置換により、テーブルはコード生成ワークフローおよびシミュレーション全体を通じて調整可能なままになります。
行優先アルゴリズムおよび配列のレイアウトを使用したコード生成
テーブル データを置換した後で、Simulink はモデル RowLUTColToRow
を行優先のシミュレーション用に構成します。このモデルは、置換されたテーブル データを含み、行優先アルゴリズムを使用する事前設定されたモデル RowLUTColToRowPreconfigured
と同じです。
1. モデル例 RowLUTColToRowPreconfigured
を開きます。
open_system('RowLUTColToRowPreconfigured');
2. これらのモデルを行優先のコード生成用に設定するには、[コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。[行優先の配列レイアウトに最適化されたアルゴリズムを使用] コンフィギュレーション パラメーターの有効化に加えて、[コード生成]、[インターフェイス] ペインで、コンフィギュレーション パラメーター [配列のレイアウト] を [Row-Major
] オプションに変更します。[配列のレイアウト] パラメーターにより、行優先のコード生成のモデルが有効になります。あるいは、MATLAB コマンド ウィンドウで次のように入力します。
% For model 'RowLUTColToRowPreconfigured' set_param('RowLUTColToRowPreconfigured', 'ArrayLayout','Row-major'); % For model 'RowLUTColToRow' set_param('RowLUTColToRow', 'ArrayLayout','Row-major');
3. ブロックのダイアログ ボックスで、置換された 3 次元テーブルを調べます。
4. MATLAB の現在のフォルダーを書き込み可能なフォルダーに変更します。[C コード] タブで [ビルド] をクリックし、C コードを生成します。生成されたコードで、行優先の配列レイアウトのテーブル データを確認します。
生成されたコードで、関数 memcpy
が for
ループを置き換えます。memcpy
を使用して、データを保存するメモリの量を削減します。この最適化によって実行速度が向上します。
行優先データに最適化されたアルゴリズムを確認します。
close_system('RowLUTColToRow',0); close_system('RowLUTColToRowPreconfigured',0);