生成されたコードでの潜在的なデータ型の問題の検索
データ型の問題の概要
MATLAB® コードを固定小数点に変換する場合、生成されたレポートで潜在的なデータ型の問題を強調表示できます。レポートでは、単精度、倍精度または計算量の多い固定小数点演算を必要とする MATLAB コードが強調表示されます。
倍精度のチェックでは倍精度演算となる式が強調表示されます。厳密な single または固定小数点の設計を行うときに、コードを手動で検査するのは時間がかかる上、間違いも起こりがちです。
単精度のチェックでは単精度演算となる式が強調表示されます。
計算量の多い固定小数点演算のチェックでは、固定小数点コードの最適化の機会が特定されます。煩雑な乗除算、計算量の多い丸め、計算量の多い比較またはマルチワード処理を必要とする MATLAB コード内の式が強調表示されます。生成される固定小数点コードの最適化の詳細は、生成コードをより効率的にするためのヒントを参照してください。
潜在的なデータ型の問題の強調表示の有効化
固定小数点コンバーター アプリを使用した強調表示オプションの有効化
[固定小数点に変換] ページで [設定] 矢印
をクリックします。
[プロットとレポート] の下の [潜在的なデータ型の問題を強調表示] を
[はい]
に設定します。
変換の完了後、固定小数点への変換のレポートを開き、強調表示されている部分を確認します。[型の検証の出力] タブの [レポートの表示] をクリックします。
コマンド ライン インターフェイスを使用した強調表示オプションの有効化
固定小数点コードの構成オブジェクトを作成します。
fixptcfg = coder.config('fixpt');
構成オブジェクトの
HighlightPotentialDataTypeIssues
プロパティをtrue
に設定します。fixptcfg.HighlightPotentialDataTypeIssues = true;
煩雑な演算の検索と対処
煩雑な演算は通常、不適切な出力の範囲により発生します。乗算や除算の入力に、プロセッサの基本整数型より長い語長を使用しないでください。ソフトウェアではより長い語長の演算を処理できますが、このアプローチにはより多くのコードが必要となり、実行が遅くなります。
この例には、Embedded Coder® および Fixed-Point Designer™ が必要です。この例では、プロセッサのターゲットの語長は 64 です。
関数
myMul
を作成します。function out = myMul(in1, in2) out = fi(in1*in2, 1, 64, 0); end
myMul
のコードを生成します。cfg = coder.config('lib'); cfg.GenerateReport = true; cfg.HighlightPotentialDataTypeIssues = true; fm = fimath('ProductMode', 'SpecifyPrecision', 'ProductWordLength', 64); codegen -config cfg myMul -args {fi(1, 1, 64, 4, fm), fi(1, 1, 64, 4, fm)}
[レポートの表示] をクリックします。
コード生成レポートで、[コード洞察] タブをクリックします。
[潜在的なデータ型の問題] セクションを展開します。次に、[計算量の多い固定小数点演算] セクションを展開します。
レポートでは、式
in1 * in2
にフラグが設定されます。問題を解決するには、積の語長がターゲットの語長である 64 を超えないようにin1
およびin2
のデータ型を変更します。
計算量の多い丸めの検索と対処
従来の手書きコード、特に制御アプリケーション用コードでは、ほとんどの場合に "簡単" な丸めが使用されています。たとえば、符号なしの整数と 2 の補数の符号付き整数の場合、右にシフトしてビットを切り捨てることは、負方向の丸めと等価です。従来の手書きコードと同等以上の結果を得るには、floor
の丸め方法を使用してください。
この例には、Embedded Coder および Fixed-Point Designer が必要です。
関数
myRounding
を作成します。function [quot] = myRounding(in1, in2) quot = in1 / in2; end
myRounding
のコードを生成します。cfg = coder.config('lib'); cfg.GenerateReport = true; cfg.HighlightPotentialDataTypeIssues = true; codegen -config cfg myRounding -args {fi(1, 1, 16, 2), fi(1, 1, 16, 4)}
[レポートの表示] をクリックします。
コード生成レポートで、[コード洞察] タブをクリックします。
[潜在的なデータ型の問題] セクションを展開します。次に、[計算量の多い固定小数点演算] セクションを展開します。
除算演算
in1/in2
では既定の丸め手法nearest
を使用します。丸め手法をFloor
に変更すると、より効率的な実装が提供されます。
計算量の多い比較演算の検索と対処
比較を実行するためにキャスト演算が必要な場合、比較演算に対して追加のコードが生成されます。たとえば、符号なし整数を符号付き整数と比較する前に、入力の 1 つが他方の符号属性にキャストされなければなりません。生成されたコードでキャストが不要になるように、入力引数のデータ型を最適化することを検討してください。
この例には、Embedded Coder および Fixed-Point Designer が必要です。
関数
myRelop
を作成します。function out = myRelop(in1, in2) out = in1 > in2; end
myRelop
のコードを生成します。cfg = coder.config('lib'); cfg.GenerateReport = true; cfg.HighlightPotentialDataTypeIssues = true; codegen -config cfg myRelop -args {fi(1, 1, 14, 3, 1), fi(1, 0, 14, 3, 1)}
[レポートの表示] をクリックします。
コード生成レポートで、[コード洞察] タブをクリックします。
[潜在的なデータ型の問題] セクションを展開します。次に、[計算量の多い固定小数点演算] セクションを展開します。
最初の入力引数
in1
は符号付きですが、in2
は符号なしです。2 つの入力を比較するにはキャストが発生しなければならないため、追加のコードが生成されます。より効率的なコードを生成するには、いずれかの入力の符号属性とスケーリングを変更します。
マルチワード処理の検索と対処
ハードウェアのマルチワード処理は、非効率的になる可能性もあります。プロセッサの最大ワード サイズより大きい入力または出力データ型がある処理の場合、生成されたコードにはマルチワード処理が含まれます。変数のローカル fimath
プロパティを指定することで、生成されたコード内のマルチワード処理を回避できます。また、マルチワード コードを生成する処理の入力と出力の語長を手動で指定することもできます。
この例には、Embedded Coder および Fixed-Point Designer が必要です。この例では、ターゲットの語長は 64 です。
関数
myMul
を作成します。function out = myMul(in1, in2) out = in1 * in2; end
myMul
のコードを生成します。cfg = coder.config('lib'); cfg.GenerateReport = true; cfg.HighlightPotentialDataTypeIssues = true; codegen -config cfg myMul -args {fi(1, 1, 33, 4), fi(1, 1, 32, 4)}
[レポートの表示] をクリックします。
コード生成レポートで、[コード洞察] タブをクリックします。
[潜在的なデータ型の問題] セクションを展開します。次に、[計算量の多い固定小数点演算] セクションを展開します。
レポートでは
myMul
の 2 行目のin1 * in2
演算にフラグが設定されます。コード ペインの
in1
、in2
および式in1 * in2
の上で一時停止します。以下であることがわかります。in1
の語長は 33 ビット、in2
の語長は 32 ビットです。式
in1 * in2
の語長は 65 ビットです。
語長 65 がターゲットの語長である 64 より大きいため、ソフトウェアではマルチワード処理が検出されます。
この問題を解決するには、積の語長がターゲットの語長を超えないように
in1
およびin2
のデータ型を変更します。あるいは、ローカルfimath
オブジェクトのProductMode
プロパティを指定します。
関連するトピック
- Highlight Potential Data Type Issues in a Report (Embedded Coder)
- コード生成レポート (MATLAB Coder)