メモリ効率を高めるためのルックアップ テーブルの最適化
ルックアップ テーブル オプティマイザーは、ブレークポイントの間隔およびルックアップ テーブル データのデータ型を最適化して、ルックアップ テーブルで使用されるメモリを削減します。ルックアップ テーブル オプティマイザーとそれに相当するコマンド ラインの操作を使用して、以下を実行できます。
既存の Lookup Table ブロックを最適化する。
Math Function ブロックまたはサブシステムを含む Simulink® ブロックからルックアップ テーブルを生成する。
関数または関数ハンドルからルックアップ テーブルを生成する。
ルックアップ テーブル オプティマイザーを使用した既存のルックアップ テーブルの最適化
既存のルックアップ テーブルを最適化するには、Lookup Table ブロックを含むモデルを開きます。
openExample('simulink_automotive/ModelingAFaultTolerantFuelControlSystemExample',... 'supportingfile','sldemo_fuelsys'); open_system('sldemo_fuelsys/fuel_rate_control/airflow_calc');
Pumping Constant
Lookup Table ブロックの最適化方法を説明します。ルックアップ テーブル オプティマイザーを開くには、
Pumping Constant
Lookup Table ブロックを選択します。状況依存の [ルックアップ テーブル] タブが Simulink ツールストリップに表示されます。[ルックアップ テーブル] タブで [ルックアップ テーブル オプティマイザー] を選択します。最適化するブロックの種類を選択します。既存の Lookup Table ブロックまたは Math Function ブロックを含む Simulink ブロックまたはサブシステムを最適化するには、[Simulink ブロックまたはサブシステム] を選択します。関数ハンドルのルックアップ テーブルの近似を生成するには、[MATLAB 関数ハンドル] を選択します。
この例では、[Simulink ブロックまたはサブシステム] を選択して
Pumping Constant
ルックアップ テーブルを最適化します。[次へ] をクリックします。[ブロック情報] で、
Pumping Constant
Lookup Table ブロックへのパスを入力します。モデル内のブロックを選択し、ルックアップ テーブル オプティマイザーで [現在のブロックの取得] をクリックして、ブロック パスを自動的に入力します。[モデルから現在の値を収集] をクリックすると、モデルのブロック線図が更新され、ルックアップ テーブル オプティマイザーが最適化のプロセスに必要な情報を自動的に収集できます。この情報には、現在の出力データ型、入力の数とデータ型、および入力値の範囲が含まれます。これらすべてのフィールドを手動で編集し、ブロックで現在指定されている以外の範囲やデータ型を指定することができます。
生成されたルックアップ テーブルの [目的の出力データ型] を
numerictype
オブジェクトまたはSimulink.NumericType
オブジェクトとして指定します。ブロックへの各入力のデータ型を
numerictype
オブジェクトまたはSimulink.NumericType
オブジェクトとして指定します。生成されたルックアップ テーブルの各入力の最小値と最大値をテーブル内のスカラーとして指定します。
この例では、モデルで指定された現在の値を使用します。[次へ] をクリックします。
最適化で使用する制約を指定します。設計で許容可能な [出力の許容誤差] を設定します。
絶対許容誤差は、元の出力値と最適化されたルックアップ テーブルの出力間の誤差の絶対値として定義されます。
相対許容誤差は、その点の値に相対的な誤差を測定し、非負の値として指定します。
許容される語長を、対象のハードウェア ターゲットで効率的な型に基づくベクトルとして指定します。たとえば、オプティマイザーで 8 ビット型、16 ビット型、および 32 ビット型のみが考慮されるようにする場合は、[許容される語長 (ベクトル)] フィールドに
[8 16 32]
を指定します。最適化されたルックアップ テーブルの追加のプロパティを指定するには、[LUT 仕様] をクリックします。各プロパティの詳細については、
FunctionApproximation.Options
を参照してください。この例では、これらのプロパティに既定値を使用します。生成されたルックアップ テーブルの最大時間や最大メモリ使用量など、最適化のオプションを指定するには、 ボタンをクリックします。
制約を設定したら、[最適化] をクリックします。
オプションで、[停止] をクリックすると、最適化ソルバーの実行が完了する前に停止することができます。[停止] ボタンが選択された時点で見つかった最適なソリューションをオプティマイザーが選択し、アプリ内に表示します。
最適化が完了すると、オプティマイザーは最適化されたルックアップ テーブルのメモリをレポートします。制約を編集し、最適化をもう一度実行すると、さらにメモリを削減できます。
既定の設定を使用すると、ルックアップ テーブル オプティマイザーは
Pumping Constant
Lookup Table ブロックで使用されるメモリを 1516 バイトから 505 バイトに (66.69%) 削減します。[次へ] をクリックします。
[比較プロットを表示] をクリックすると、元のブロック出力と新たに最適化されたルックアップ テーブルの出力を比較したプロットが表示されます。
[元の関数を置き換える] をクリックすると、アプリで検出された最適化された設定を使用して新しいルックアップ テーブルが生成され、元のブロックが置き換えられます。
新しいブロックはマスクされたバリアント サブシステムで、最適化されたルックアップ テーブル ブロックがアクティブなバリアントになります。元のブロックは非アクティブなバリアントになります。
最適化設定の編集と新しい近似の生成
最適化で使用する設定を編集することで、近似ブロックを繰り返し変更して新しいルックアップ テーブルを生成できます。
Pumping Constant ブロックをダブルクリックします。最適化設定を編集するには、[ブロック パラメーター] ダイアログで [近似の再設計] をクリックします。
ルックアップ テーブル オプティマイザーで、[次へ] をクリックしてアプリの [作成] ページに進みます。この例では、ルックアップ テーブルのサイズをさらに削減できるように、絶対許容誤差と相対許容誤差の値を編集して少し大きくします。
[絶対] 許容誤差を
0.01
(1%) に設定します。[相対] 許容誤差を
0.01
(1%) に設定します。
[最適化] をクリックして、新しいオプションでルックアップ テーブルを最適化します。
これらの許容誤差の値を使用すると、新しいルックアップ テーブルで使用されるメモリは 304 バイトだけになります。
[次へ] をクリックします。[結果] ページで [元の関数を置き換える] ボタンをクリックすると、近似ブロックの最初の反復がこの最新の反復に置き換わります。
モデルで Pumping Constant ブロックをダブルクリックして [ブロック パラメーター] を開きます。[ブロック パラメーター] に近似に使用する設定が表示されます。
元のブロックまたはサブシステムをアクティブなバリアントにするには、[対象とする関数のバージョンを表示] の横で
[変換元]
を選択します。ルックアップ テーブルによる近似をモデルから削除するには、[ブロック パラメーター] で [Revert to original] をクリックします。
参考
アプリ
クラス
FunctionApproximation.Problem
|FunctionApproximation.Options
|FunctionApproximation.LUTSolution
|FunctionApproximation.LUTMemoryUsageCalculator