Main Content

単精度ルックアップ テーブルの半精度への変換

この例では、単精度ルックアップ テーブルを半精度を使用するために変換する方法について説明します。半精度はストレージ型であり、ルックアップ テーブルの演算は引き続き単精度を使用して行われます。変換後は、目標とするシステム パフォーマンスを保ったまま、Lookup Table ブロックのメモリ サイズが半分になります。

タスク 1: シミュレーションとベースラインの取得

1. sldemo_fuelsys モデル例の airflow_calc サブシステムを開きます。これには、単精度のテーブルとブレークポイント データを含む Lookup Table ブロックが含まれています。これを半精度に変換します。

load_system('sldemo_fuelsys');
open_system('sldemo_fuelsys/fuel_rate_control/airflow_calc');

2. MATLAB® で、現在のフォルダーを書き込み可能なフォルダーに変更します。

3. テーブルとブレークポイント Pumping Constant および Ramp Rate Ki Lookup Table ブロックのデータ型が single に設定されていることをチェックします。

4. 両方の Lookup Table ブロックの出力信号を選択します。これらをログ記録用にマークします。ノーマル モードでモデルのシミュレーションを実行し、この実行の出力をベースラインとして使用します。

タスク 2: データの解析と半精度への変換

1. 指定した Lookup Table ブロックについて、モデル ワークスペースからテーブルとブレークポイントの変数データを取得します。たとえば、'Pumping Constant' ブロックを使用すると以下のようになります。

mdlWks = get_param('sldemo_fuelsys','ModelWorkspace');
currentBlk = 'sldemo_fuelsys/fuel_rate_control/airflow_calc/Pumping Constant';

2. テーブル データを解析し、それが半精度型の範囲 [-65504, 65504] に収まる場合、半精度に変換します。シミュレーション データ インスペクターで、モデルをシミュレーションし、現在のブロックのログに記録された出力をベースラインと比較します。出力が指定した絶対許容誤差と相対許容誤差の範囲内であることを確認します。たとえば、このコードでは両方の許容誤差が | |0.01| | に設定されます。

numBytesSaved(1) = analyzeDataConvertToHalf(mdlWks, currentBlk, 'Table');

3. 現在のブロックの各ブレークポイントのデータについて、タスク 2 のステップ 2 を繰り返します。単精度から半精度に変換した後も、ブレークポイント データは単調増加でなければなりません。

numBytesSaved(2) = analyzeDataConvertToHalf(mdlWks, currentBlk, 'BreakpointsForDimension1');
numBytesSaved(3) = analyzeDataConvertToHalf(mdlWks, currentBlk, 'BreakpointsForDimension2');
totalBytesSaved = sum(numBytesSaved(1:3));

4. 同じサブシステムの残りの Lookup Table ブロックについて、タスク 2 のステップ 2 ~ 3 を繰り返します。次に、テーブルに保存されたバイト数と、n-D Lookup Table ブロックのブレークポイントを調べます。

currentBlk = 'sldemo_fuelsys/fuel_rate_control/airflow_calc/Ramp Rate Ki';
numBytesSaved(4) = analyzeDataConvertToHalf(mdlWks, currentBlk, 'Table');
numBytesSaved(5) = analyzeDataConvertToHalf(mdlWks, currentBlk, 'BreakpointsForDimension1');
numBytesSaved(6) = analyzeDataConvertToHalf(mdlWks, currentBlk, 'BreakpointsForDimension2'),
numBytesSaved =

   684    36    38    72    12    12

totalBytesSaved = totalBytesSaved + sum(numBytesSaved(4:6)),
totalBytesSaved =

   854

タスク 3: シミュレーションと比較

1. 変換後のモデルを半精度のテーブルとブレークポイントでシミュレーションします。

2. Scope ブロックおよびシミュレーション データ インスペクターで、'fuel'、'air_fuel_ratio' などの信号をベースラインと比較します。目標とするパフォーマンスが引き続き達成されていることを確認します。

3. モデルを、書き込み可能なフォルダーに別名で保存します。

タスク 4: コードの生成とメモリ最適化の検証

1. fuel_rate_control サブシステムを右クリックし、[C/C++ コード]、[このサブシステムをビルド] を選択します。コードを生成するには、[サブシステムに対するコードをビルド] ダイアログ ボックスで [ビルド] をクリックします。

2. [ビルド] の処理が完了すると、コード生成レポートが表示されます。

3. half_type.h および fuel_rate_control.c ファイルをクリックします。look2_ifbhlfthDfIf_linlca 関数呼び出しインターフェイスの半精度 (real16_T) 型定義、real16_T 型のテーブル、およびブレークポイントのポインターに注目してください。

4. fuel_rate_control.h ファイルを開き、テーブルとブレークポイントのストレージ型として半精度を使用することにより、854 バイトが節約されたことを確認してください。

close_system('sldemo_fuelsys',0);