Main Content

指定された最小値と最大値を使用した固定小数点の最適化

この例では、モデル内で指定する最小値と最大値を使用して、生成されたコード内の固定小数点演算を最適化する方法を示します。最小値と最大値は、センサーの出力範囲などの、環境上の制限や機械的制限を表すことができます。コード生成ソフトウェアではこれらの値を使用して、到達不可能なコード分岐や不要なユーティリティ関数を取り除くことで、さらに効率的なコードを生成できます。

生成コードの最適化には、次のような利点があります。

  • ROM と RAM の消費を低減する。

  • 実行速度が向上する。

メモ: 指定された最小値および最大値の正確性と信頼性を確認しなければなりません。そうしないと、最適化の際に数値がシミュレーションと合わなくなる可能性があります。

モデルを開いて検査

fxpdemo_min_max_optimization モデルを開きます。

open_system('fxpdemo_min_max_optimization');

このモデルでは、さまざまな固定小数点ブロックの入力端子の上流に最小値と最大値が指定されています。これらの値を利用することで、モデル内の各固定小数点演算が何らかの方法で最適化されます。最適化構成を表示するには、[コンフィギュレーション パラメーター] ダイアログを開き、[コード生成]、[最適化] を選択します。

最適化を使用しないコードの生成と検査

指定されている最小値と最大値を使用せずに、モデルのコードを生成します。

slbuild('fxpdemo_min_max_optimization');
### Starting build procedure for: fxpdemo_min_max_optimization
### Successful completion of code generation for: fxpdemo_min_max_optimization

Build Summary

Top model targets built:

Model                         Action           Rebuild Reason                                    
=================================================================================================
fxpdemo_min_max_optimization  Code generated.  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 10.638s

コード生成レポートが開きます。ブロック "Product with reduced fraction length output data type" に対応するコードを確認します。このブロックを右クリックし、[C/C++ コード]、[C/C++ コードに移動] を選択します。

rtwtrace('fxpdemo_min_max_optimization/Product with reduced fraction length output data type');

生成コードは次のようになります。

rtY.Out1 = mul_u32_u32_u32_sr10(rtU.In1, rtU.In2);

この固定小数点の乗算を実装するために、コード生成ソフトウェアはユーティリティ関数 mul_u32_u32_u32_sr10 を生成しなければなりません。また、mul_u32_u32_u32_sr10 を実装するために、2 番目のユーティリティ関数 mul_wide_u32 を生成しなければなりません。これらの関数は多くのコード行で構成されており、複数の一時変数を必要とします。

最適化の有効化

  1. [コンフィギュレーション パラメーター] ダイアログを開きます。

  2. [コード生成]、[最適化] で、オプション [指定した最小値と最大値を使用した最適化] を有効にします。

set_param('fxpdemo_min_max_optimization','UseSpecifiedMinMax','on');

最適化を使用したコードの生成と検査

指定されている最小値と最大値を使用してコードを再生成します。

slbuild('fxpdemo_min_max_optimization');
### Starting build procedure for: fxpdemo_min_max_optimization
### Successful completion of code generation for: fxpdemo_min_max_optimization

Build Summary

Top model targets built:

Model                         Action           Rebuild Reason                   
================================================================================
fxpdemo_min_max_optimization  Code generated.  Generated code was out of date.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 9.3044s

ブロック "Product with reduced fraction length output data type" を右クリックし、[C/C++ コード]、[C/C++ コードに移動] を選択します。

rtwtrace('fxpdemo_min_max_optimization/Product with reduced fraction length output data type');

生成コードは次のようになります。

rtY.Out1 = rtU.In1 * rtU.In2 >> 10;

コード生成ソフトウェアでは、指定されている最小値と最大値を使用して、右にシフトする出力でより短い小数部の長さを安全に実装できることを判断し、ユーティリティ関数を生成しません。

他の演算の検査

生成されたコード内の他の演算を検査して、指定されている最小値と最大値をコード生成ソフトウェアがどのように使用しているかを確認します。コード生成ソフトウェアでは単純な C 演算によって各固定小数点の演算を実装すると、不要な補助関数やコード分岐が取り除かれます。