Main Content

生成されたコードでの潜在的なデータ型の問題の検索

データ型の問題の概要

MATLAB® コードを固定小数点に変換する場合、生成されたレポートで潜在的なデータ型の問題を強調表示できます。レポートでは、単精度、倍精度または計算量の多い固定小数点演算を必要とする MATLAB コードが強調表示されます。

  • 倍精度のチェックでは倍精度演算となる式が強調表示されます。厳密な single または固定小数点の設計を行うときに、コードを手動で検査するのは時間がかかる上、間違いも起こりがちです。

  • 単精度のチェックでは単精度演算となる式が強調表示されます。

  • 計算量の多い固定小数点演算のチェックでは、固定小数点コードの最適化の機会が特定されます。煩雑な乗除算、計算量の多い丸め、計算量の多い比較またはマルチワード処理を必要とする MATLAB コード内の式が強調表示されます。生成される固定小数点コードの最適化の詳細は、生成コードをより効率的にするためのヒントを参照してください。

潜在的なデータ型の問題の強調表示の有効化

固定小数点コンバーター アプリを使用した強調表示オプションの有効化

  1. [固定小数点に変換] ページで [設定] 矢印 をクリックします。

  2. [プロットとレポート] の下の [潜在的なデータ型の問題を強調表示][はい] に設定します。

変換の完了後、固定小数点への変換のレポートを開き、強調表示されている部分を確認します。[型の検証の出力] タブの [レポートの表示] をクリックします。

コマンド ライン インターフェイスを使用した強調表示オプションの有効化

  1. 固定小数点コードの構成オブジェクトを作成します。

    fixptcfg = coder.config('fixpt');

  2. 構成オブジェクトの HighlightPotentialDataTypeIssues プロパティを true に設定します。

    fixptcfg.HighlightPotentialDataTypeIssues = true;

煩雑な演算の検索と対処

煩雑な演算は通常、不適切な出力の範囲により発生します。乗算や除算の入力に、プロセッサの基本整数型より長い語長を使用しないでください。ソフトウェアではより長い語長の演算を処理できますが、このアプローチにはより多くのコードが必要となり、実行が遅くなります。

この例には、Embedded Coder® および Fixed-Point Designer™ が必要です。この例では、プロセッサのターゲットの語長は 64 です。

  1. 関数 myMul を作成します。

    function out = myMul(in1, in2)
        out = fi(in1*in2, 1, 64, 0);
    end
    

  2. 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)}

  3. [レポートの表示] をクリックします。

  4. コード生成レポートで、[コード洞察] タブをクリックします。

  5. [潜在的なデータ型の問題] セクションを展開します。次に、[計算量の多い固定小数点演算] セクションを展開します。

    レポートでは、式 in1 * in2 にフラグが設定されます。問題を解決するには、積の語長がターゲットの語長である 64 を超えないように in1 および in2 のデータ型を変更します。

計算量の多い丸めの検索と対処

従来の手書きコード、特に制御アプリケーション用コードでは、ほとんどの場合に "簡単" な丸めが使用されています。たとえば、符号なしの整数と 2 の補数の符号付き整数の場合、右にシフトしてビットを切り捨てることは、負方向の丸めと等価です。従来の手書きコードと同等以上の結果を得るには、floor の丸め方法を使用してください。

この例には、Embedded Coder および Fixed-Point Designer が必要です。

  1. 関数 myRounding を作成します。

    function [quot] = myRounding(in1, in2)
       quot = in1 / in2;
    end

  2. 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)}

  3. [レポートの表示] をクリックします。

  4. コード生成レポートで、[コード洞察] タブをクリックします。

  5. [潜在的なデータ型の問題] セクションを展開します。次に、[計算量の多い固定小数点演算] セクションを展開します。

    除算演算 in1/in2 では既定の丸め手法 nearest を使用します。丸め手法を Floor に変更すると、より効率的な実装が提供されます。

計算量の多い比較演算の検索と対処

比較を実行するためにキャスト演算が必要な場合、比較演算時に追加のコードが生成されます。たとえば、符号なし整数を符号付き整数と比較する前に、入力の 1 つが他方の符号属性にキャストされなければなりません。生成されたコードでキャストが不要になるように、入力引数のデータ型を最適化することを検討してください。

この例には、Embedded Coder および Fixed-Point Designer が必要です。

  1. 関数 myRelop を作成します。

    function out = myRelop(in1, in2)
        out = in1 > in2;
    end

  2. 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)}

  3. [レポートの表示] をクリックします。

  4. コード生成レポートで、[コード洞察] タブをクリックします。

  5. [潜在的なデータ型の問題] セクションを展開します。次に、[計算量の多い固定小数点演算] セクションを展開します。

    最初の入力引数 in1 は符号付きですが、in2 は符号なしです。2 つの入力を比較するにはキャストが発生しなければならないため、追加のコードが生成されます。

    より効率的なコードを生成するには、いずれかの入力の符号属性とスケーリングを変更します。

マルチワード処理の検索と対処

ハードウェアのマルチワード処理は、非効率になる可能性もあります。プロセッサの最大ワード サイズより大きい入力または出力データ型がある処理の場合、生成されたコードにはマルチワード処理が含まれます。変数のローカル fimath プロパティを指定することで、生成されたコード内のマルチワード処理を回避できます。また、マルチワード コードを生成する処理の入力と出力の語長を手動で指定することもできます。

この例には、Embedded Coder および Fixed-Point Designer が必要です。この例では、ターゲットの語長は 64 です。

  1. 関数 myMul を作成します。

    function out = myMul(in1, in2)
        out = in1 * in2;
    end

  2. 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)}

  3. [レポートの表示] をクリックします。

  4. コード生成レポートで、[コード洞察] タブをクリックします。

  5. [潜在的なデータ型の問題] セクションを展開します。次に、[計算量の多い固定小数点演算] セクションを展開します。

    レポートでは myMul の 2 行目の in1 * in2 演算にフラグが設定されます。

  6. コード ペインの in1in2 および式 in1 * in2 の上で一時停止します。以下であることがわかります。

    • in1 の語長は 33 ビット、in2 の語長は 32 ビットです。

    • in1 * in2 の語長は 65 ビットです。

    語長 65 がターゲットの語長である 64 より大きいため、ソフトウェアではマルチワード処理が検出されます。

  7. この問題を解決するには、積の語長がターゲットの語長を超えないように in1 および in2 のデータ型を変更します。あるいは、ローカル fimath オブジェクトの ProductMode プロパティを指定します。

関連するトピック