Main Content

正味勾配計算

正味勾配計算の処理

Fixed-Point Designer™ ソフトウェアには、正味勾配計算の処理方法を制御する最適化パラメーター [固定小数点の正味勾配計算に除算を使用] が用意されています。この最適化を有効にする方法の詳細については、整数除算を使用した正味勾配計算の処理を参照してください。

固定小数点勾配の変化量が 2 のべき乗でない場合は、正味勾配計算が必要です。通常、正味勾配計算を行うには、整数を乗算してからシフトします。特定の条件下では、整数除算または正味勾配の有理近似を使用して正味勾配計算を実装できます。このような状況の一例として、正味勾配を有理分数としてまたはある整数の逆数として正確に表現できる場合があります。この場合、除算を行うと数値的な動作がより正確になります。使用しているコンパイラと組み込みハードウェアによっては、乗算とシフトを行うより除算を行う方が効果的な場合もあります。有理近似や整数除算を行う生成コードでは、必要な ROM の低減やモデル実行時間の短縮につながる可能性があります。

固定小数点正味勾配計算に除算を使用する場合

この最適化は以下の場合に効果的です。

  • 正味勾配が分数で近似できるか、または整数の逆数である。

  • ターゲット ハードウェア上で乗算してシフトするより除算を実行する方が効率的である。

    メモ

    Fixed-Point Designer ソフトウェアではターゲット ハードウェアは認識されません。このオプションを選択する前に、ターゲット ハードウェア上で乗算してシフトするより除算を実行する方が効率的であることを確認してください。

除算で正味勾配計算を処理すべきでない状況

この最適化は以下の場合には適していません。

  • ソフトウェアで製品ターゲットの long データ型を使用して除算できないため、マルチワード処理を使用しなければならない。

    マルチワード除算を使用しても、組み込みターゲットに適したコードは生成されません。したがって、マルチワード処理を使用するモデルでは除算で正味勾配計算を処理しないでください。モデルにマルチワード処理を使用するブロックがある場合、これらブロックの語長を変更してこのような処理を回避してください。

  • 正味勾配が 2 のべき乗であり、正味勾配の有理近似に 2 のべき乗による除算が含まれる。

    2 進小数点専用のスケーリングでは正味勾配が 2 のべき乗で、固定小数点ワード内での 2 進小数点の移動が行われます。このスケーリング モードにより、プロセッサの算術演算の回数が既に最小になっています。

除算による正味勾配計算の処理

この最適化を有効にするには、以下の手順に従います。

  1. [コンフィギュレーション パラメーター] ダイアログ ボックスの [数学とデータ型][データ型] ペインで、[固定小数点の正味勾配計算に除算を使用][オン] または [整数の逆数の場合にのみ除算を使用] に設定します。

    詳細は、固定小数点の正味勾配計算に除算を使用を参照してください。

  2. [ハードウェア実行][デバイスの詳細] ペインで、ターゲット ハードウェアに応じて [符号付き整数の除算の丸め] コンフィギュレーション パラメーターを [負方向] または [ゼロ方向] に設定します。[符号付き整数の除算の丸め] パラメーターが [未定義] に設定されている場合、最適化は行われません。

    メモ

    このパラメーターをターゲット ハードウェアに適した値に設定します。そうしないと、[ハードウェア実行] ペインの指定には一致していても、ターゲット ハードウェアには適さない除算になる可能性があります。

  3. 正味勾配計算が必要なブロック (ProductGainData Type Conversion など) の [整数丸めモード][最も簡潔] に設定するか、ターゲット ハードウェアの丸めモードを一致させます。

メモ

モデル アドバイザーを使用すると、この最適化に対してモデルが正しく設定されていない場合は警告が表示されます。モデル アドバイザーを開き、[問題のある固定小数点演算を特定] チェックを再実行します。詳細については、勾配設定の計算を呼び出すブロックを識別を参照してください。

有理近似を使用した正味勾配の処理によるシミュレーション結果の数値精度の向上

この例では、[数学とデータ型][固定小数点の正味勾配計算に除算を使用] パラメーターを [オン] に設定することで数値の精度を改善する方法について説明します。

ex_net_slope1 モデルを開く

ex_net_slope1

モデルの確認

SaQa=SbQb.ScQc

または

Qa=SbScSa.QbQc

ここで、正味勾配は次のようになります。

SbScSa

Product ブロックの正味勾配は 7/11 です。正味勾配は小さな整数で構成される分数値として表現できるため、モデルとハードウェア構成に適している場合は、[固定小数点の正味勾配計算に除算を使用] 最適化パラメーターの [オン] を使用できます。詳細は、固定小数点正味勾配計算に除算を使用する場合を参照してください。

このモデルの Product ブロックでは、次のようになります。

これらの値はスケーリングで説明されている一般的な [勾配バイアス] エンコード スキーム Vi=SiQi+Bi によって表現されます。

入力にも出力にもバイアスはないので、以下のようになります。

モデルの設定とシミュレーションの実行

  1. Constant ブロック Vb に対して [出力データ型]fixdt(1, 8, 0.7, 0) に設定します。Constant ブロック Vc に対して [出力データ型]fixdt(1, 8, 0) に設定します。

  2. Product ブロックに対して、[出力データ型]fixdt(1, 16, 1.1, 0) に設定します。[整数丸めモード][最も簡潔] に設定します。

  3. [コンフィギュレーション パラメーター] ダイアログ ボックスで、[ハードウェア実行][デバイスの詳細][符号付き整数の除算の丸め] コンフィギュレーション パラメーターを [ゼロ方向] に設定します。

  4. [数学とデータ型][固定小数点の正味勾配計算に除算を使用][オフ] に設定します。

  5. Simulink® モデル ウィンドウの [シミュレーション] タブで、[実行] をクリックします。

    シミュレーションでは乗算の後にシフトが行われて正味勾配計算が処理されるので、正味勾配の桁落ちが発生します。この桁落ちの結果、数値が不正確になります。計算して得られる積は予想どおり 308 ではなく 306.9 になります。

    メモ

    固定小数点定数で桁落ちが発生したら警告するように Fixed-Point Designer ソフトウェアを設定することができます。詳細は、正味勾配と正味バイアスの精度を参照してください。

  6. [数学とデータ型][固定小数点の正味勾配計算に除算を使用][オン] に設定します。

    モデルを保存し、再度シミュレーションを実行します。

    ソフトウェアでは、乗算とそれに続くシフトの代わりに、有理近似を使用して正味勾配の計算を実行します。計算して得られる積は予想どおり 308 になります。

    このモデルで最適化が適切に機能するのは、以下の理由によります。

    • 正味勾配は分子と分母に小さい整数を使用する分数として表現できます。

    • [ハードウェア実行][デバイスの詳細][符号付き整数の除算の丸め] コンフィギュレーション パラメーターを [ゼロ方向] に設定します。

      メモ

      この設定はターゲット ハードウェアの丸めモードに一致していなければなりません。

    • モデルの Product ブロックの [整数丸めモード][最も簡潔] に設定されている。

    • このモデルはマルチワード処理を使用しない。

有理近似を使った正味勾配の処理による生成コードの効率性の向上

この例では、最適化パラメーター [数学とデータ型][固定小数点の正味勾配計算に除算を使用][オン] に設定することで生成コードの効率を高める方法を示します。

メモ

生成コードの効率性が高まるのは、ターゲット ハードウェアで乗算してシフトするより除算する方が効率性が高い場合のみです。

ex_net_slope_2 モデルを開く

open_system("ex_net_slope2.slx")

モデルの確認

このモデルの Product ブロックでは、次のようになります。

Vm=Va×Vb

これらの値はスケーリングで説明されている一般的な [勾配バイアス] エンコード スキーム Vi=SiQi+Bi によって表現されます。

入力にも出力にもバイアスはないので、以下のようになります。

SmQm=SaQa.SbQb

または

Qm=SaSbSm.QaQb

ここで、正味勾配は次のようになります。

SaSbSm

Product ブロックの正味勾配は 9/10 です。

同様に、このモデルの Data Type Conversion ブロックでは、

SaQa+Ba=SbQb+Bb

です。バイアスはありません。したがって、正味勾配は SbSa になります。このブロックの正味勾配も 9/10 です。

正味勾配は分数として表現できるため、モデルとハードウェア構成に適している場合は、[数学とデータ型][固定小数点の正味勾配計算に除算を使用] 最適化パラメーターを [オン] に設定できます。詳細は、固定小数点正味勾配計算に除算を使用する場合を参照してください。

モデルの設定とコード生成

  1. Inport ブロック Va の場合、[出力データ型]fixdt(1, 8, 9/10, 0) に設定し、Inport ブロック Vb の場合、[出力データ型]int8 に設定します。

  2. Data Type Conversion ブロックに対して、[整数丸めモード][最も簡潔] に設定します。[出力データ型] を [int16] に設定します。

  3. Product ブロックに対して、[整数丸めモード][最も簡潔] に設定します。[出力データ型] を [int16] に設定します。

  4. [ハードウェア実行][デバイスの詳細][符号付き整数の除算の丸め] コンフィギュレーション パラメーターを [ゼロ方向] に設定します。

  5. [数学とデータ型][固定小数点の正味勾配計算に除算を使用][オフ] に設定します。

  6. Simulink の [アプリ] タブから、[Embedded Coder] を選択します。[C コード] タブで、[ビルド] をクリックします。

    概念上は、正味勾配計算は 9/10 または 0.9 になります。

    Vc = 0.9 * Va;
    Vm = 0.9 * Va * Vb;

    以下の生成コードでは乗算とシフトが使用されます。

    % For the conversion
    Vc = (int16_T)(Va * 115 >> 7);
    % For the multiplication
    Vm = (int16_T)((Va * Vb >> 1) * 29491 >> 14);

    正味勾配計算の理想値は 0.9 です。生成コードでは、正味勾配計算の近似値は 29491 >> 15 = 29491/2^15 = 0.899993896484375 です。この近似により、数値が不正確になります。たとえば、定数入力をもつ同じモデルを使用すると、以下の結果が得られます。

  7. 入力 Va および Vb を使用する元のモデルで、[数学とデータ型][固定小数点の正味勾配計算に除算を使用] パラメーターを [オン] に設定し、ブロック線図を更新して再度コードを生成します。

    これで、生成コードで乗算してシフトするのではなく整数除算が使用されるようになりました。

    % For the conversion
    Vc = (int16_T)(Va * 9/10);
    % For the multiplication
    Vm = (int16_T)(Va * Vb * 9/10);

  8. 生成コードでは、正味勾配の計算値は理想値の 0.9 になりました。除算を使用するので、結果は数値的に正確です。

    定数入力のモデルでは、[数学とデータ型][固定小数点の正味勾配計算に除算を使用] パラメーターを [オン] に設定し、モデルのシミュレーションを実行します。

    このモデルで最適化が適切に機能するのは、以下の理由によります。

    • 正味勾配は分子と分母に小さい整数を使用する分数として表現できます。

    • [ハードウェア実行][デバイスの詳細][符号付き整数の除算の丸め] コンフィギュレーション パラメーターを [ゼロ方向] に設定します。

      メモ

      この設定はターゲット ハードウェアの丸めモードに一致していなければなりません。

    • モデルの Product ブロックと Data Type Conversion ブロックに対して、[整数丸めモード][最も簡潔] に設定されている。

    • このモデルはマルチワード処理を使用しない。

整数除算を使用した正味勾配計算の処理

[数学とデータ型][固定小数点の正味勾配計算に除算を使用] パラメーターを [整数の逆数の場合にのみ除算を使用] に設定すると、正味勾配が整数の逆数である場合にのみ最適化がトリガーされます。この設定により、正味勾配計算の処理が 1 回の整数による除算となります。