主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

モデルアドバイザーを使用した生成コードの最適化

金宝app®モデルアドバイザーを使用すると,効率よく設計して生成コードを最適化できるように固定小数点モデルを設定できます。モデルアドバイザーを使用して固定小数点モデルをチェックするには,以下の手順に従います。

  1. 解析するモデルの[モデル化)タブで,[モデルアドバイザー]をクリックします。

  2. システムセレクターで解析するシステムを選択します。

  3. モデルアドバイザーの左側のペインで[製品別]ノードと(嵌入式编码)ノードを展開します。

  4. 固定小数点コード生成の場合,選択すべき最も重要なチェックボックスは[計算量の多い固定小数点および飽和のコードを生成するブロックを特定)[問題のある固定小数点演算を特定)[計算量の多い丸めコードを生成するブロックを特定)および[ハードウェア実行をチェック]です。

    選択したノードに関連付けられたモデルアドバイザーのチェックをすべて有効にするには,モデルアドバイザーの[編集]メニューで[すべて選択]を選択します。

  5. [選択したチェックを実行)をクリックします。固定小数点モデルの効率性を改善するためのヒントがあれば,モデルアドバイザーウィンドウに表示されます。

以降の節では,モデルアドバイザーにより検出される固定小数点関連のチェックおよびサブチェックについて説明します。また,これらのチェックと固定小数点コード生成における重要性について説明し,モデルを調整して生成コードを最適化する方法を示します。

計算量の多い固定小数点および飽和のコードを生成するブロックを特定

总和ブロックの問題のある固定小数点演算を特定

  • 总和ブロックの入力範囲が出力範囲を超えると,値域エラーが発生します。アプリケーションに必要な任意の加算または減算は,总和ブロックの前後またはその一方に数据类型转换ブロックを挿入することで行えます。

  • 总和ブロックに,出力の勾配調整係数と異なる勾配調整係数をもつ入力が含まれている場合は,不一致により,入力を出力のデータ型およびスケーリングに変換するたびに,总和ブロックで乗算演算を実行する必要があります。出力または入力のスケーリングを変更すると,この不一致を解決できます。

  • 总和ブロックの入力バイアスの正味合計が出力のバイアスと異なる場合,生成コードには正味バイアス調整を正しく行うための加算命令または減算命令が1つ余分に含まれます。正味のバイアスの調整を0にするように出力スケーリングのバイアスを変更し,余分な演算を除去できます。

极大极小ブロックの問題のある固定小数点演算を特定

  • 极大极小ブロックの入力と出力のデータ型が異なる場合は,ブロックを実行するたびに変換処理が必要になります。データ型を同じにするとモデルはより効率的になります。

  • 极大极小ブロックの入力のデータ型およびスケーリングが出力のデータ型およびスケーリングと一致しない場合は,関係演算を実行する前に変換を行う必要があります。これは,それぞれの変換の実行時のキャストまたは桁落ちによる値域エラーを引き起こす可能性があります。入力または出力のスケーリングを変更して,より効率的なコードを生成してください。

  • 极大极小ブロックの入力の勾配調整係数が出力と異なる場合,ブロックを実行して入力を出力のデータ型およびスケーリングに変換するたびに,极大极小ブロックでは乗算演算が必要になります。この不一致は,入力または出力のスケーリングを変更することにより解決できます。

离散积分器ブロックの問題のある固定小数点演算を特定

  • 离散时间积分器ブロックの初期条件を使用して状態および出力を初期化する場合,出力方程式によって過度のコードが生成され,追加のグローバル変数が必要になります。(函数ブロックパラメーター][初期条件設定]パラメーターを[状態(最も効率的))に設定することをお勧めします。

比较恒定ブロックの問題のある固定小数点演算を特定

  • 比较为零ブロックの入力データ型がゼロを正確に表現できない場合,入力信号はゼロに最も近い表現可能な値と比較されて,パラメーターのオーバーフローを引き起こします。このパラメーターオーバーフローを回避するには,ゼロを表現できる入力データ型を選択します。

  • 比较恒定的[定数値]パラメーターが入力データ型が表現できる範囲から外れている場合,入力信号はその定数に最も近い表現可能な値と比較されます。その結果,パラメーターのオーバーフローが発生します。このパラメーターオーバーフローを回避するには,[定数値]を表現できる入力データ型を選択するか,[定数値]を入力データ型が対応できる値に変更します。

查找表ブロックの問題のある固定小数点演算を特定

ルックアップテーブルデータに関係する効率性のトレードオフの詳細は,速度,誤差,およびメモリの使用量に与える間隔の影響を参照してください。モデルアドバイザーはこのトレードオフに基づいて,次のような,効率性を向上させる余地のあるブロックを特定します。

  • ルックアップテーブルの入力データが等間隔ではない。

  • 量子化時にルックアップテーブルの入力データが等間隔に”ならない”が,等間隔に非常に近い状態である。

  • ルックアップテーブルの入力データは等間隔であるが,間隔が2のべき乗ではない。

ルックアップテーブルの最適化の詳細については,ルックアップテーブルの最適化を参照してください。

最適化設定およびハードウェア実行設定のチェック

  • 整数除算の生成コードには,ゼロ除算,INT_MIN / 1, LONG_MIN / 1などの演算の例外に対する保護が含まれています。入力値を規定することで,例外となる除算が行われないようにモデルを構築する場合,除算の一部として生成される保護コードは冗長になります。

  • インデックス検索法(等間隔のポイント]には除算が必要ですが,この計算には時間がかかる場合があります。

勾配設定の計算を呼び出すブロックを識別

固定小数点勾配の変化量が2のべき乗でない場合は,正味勾配計算が必要です。通常,正味勾配計算を行うには,整数を乗算してからシフトします。状況によっては,整数を定数で除算するだけで済むこともあります。このような状況の一例として,正味勾配をある整数の逆数として正確に表現できる場合があります。この条件が満たされる場合,除算を行うと数値的な動作がより正確になります。使用しているコンパイラと組み込みハードウェアによっては,乗算とシフトを行うより除算を行う方が効果的な場合もあります。罗サイズまたはモデル実行サイズにおいて生成コードの効率が高まる可能性があります。

モデルアドバイザーは以下の場合に警告を表示します。

  • (固定小数点の正味勾配計算に除算を使用)最適化パラメーターを[オン]に設定したが,モデルコンフィギュレーションがこの選択に対応していない場合。

  • モデルコンフィギュレーションが除算を使用して正味勾配計算を処理するのに適しているが,(固定小数点の正味勾配計算に除算を使用)最適化パラメーターを[オン]に設定しない場合。

詳細については,正味勾配計算を参照してください。

効率が良くない产品ブロックを識別

1つのブロックが実行する乗算と除算の回数は,精度と効率性に大きな影響を及ぼす可能性があります。モデルアドバイザーは,これらの演算を並べ替えて精度または効率性あるいはその両方を向上できる状況の一部を検出します。ただし,すべて検出するわけではありません。

このような状況の一例として,除算を1回を超える回数行う計算を実行する場合が挙げられます。数値解析分野の一般的なガイドラインに従うと,最初にすべての分母項を乗算してから,除算を1回だけ行います。この方法により,浮動小数点と特に固定小数点の計算で精度が向上し,多くの場合に速度も改善されます。これは,金宝app仿真软件で产品ブロックをカスケード接続することで実行できます。複数の除算が一連のブロックにまたがる場合はモデルアドバイザーで検出できないことに注意してください。

他の例として,単一の产品ブロックで乗算または除算を1回を超えて実行するよう設定されている場合があります。この演算はサポートされていますが,出力データ型が整数または固定小数点の場合,この演算をブロックごとに1つの乗算または除算を実行するようにいくつかのブロックに分けた方が良い結果が得られる可能性が高くなります。複数のブロックを使用すると,中間の計算で使用されるデータ型とスケーリングを制御できます。中間計算でのデータ型の選択は精度,値域エラー,効率に影響します。

計算量の多い飽和コードがないかチェック

(整数オーバーフローで飽和)パラメーターを設定すると,アプリケーションに不必要な条件チェックコードが生成される場合があります。

[ブロックパラメーター][信号属性](整数オーバーフローで飽和)の設定がアプリケーションに必要かどうかをチェックします。必要ない場合は,このパラメーターの選択を解除して,生成されたコード内に最も効率よくブロックを実装します。

問題のある固定小数点演算を特定

このチェックでは,マルチワード処理,煩雑な乗除算,計算量の多い変換コード,非効率なルックアップテーブルブロックおよび計算量の多い比較コードを生成するブロックを識別します。

マルチワード処理のチェック

処理によってデータ型がプロセッサの最大ワードサイズよりも大きくなった場合,生成されたコードにマルチワード処理が含まれます。ハードウェアのマルチワード処理は,非効率になる可能性もあります。マルチワード処理を回避するには,処理の入力のワードサイズがプロセッサの最大ワードサイズを超えないように調整します。生成されたコードにおけるマルチワード処理の制御の詳細については,生成されたコード内の固定小数点マルチワード処理を参照してください。

計算量の多い乗算コードがないかチェック

  • 組み込みプロセッサのターゲットでは,組み込みプロセッサの機能と制限事項について説明しています。設計規則では,乗算への入力にプロセッサの基本整数データ型より大きい語長を含めないようにすることを推奨しています。語長が大きい場合もソフトウェアで乗算を処理できますが,必要なコードの量が増え実行速度が大幅に遅くなります。モデルアドバイザーは望ましくないソフトウェア乗算が要求されるブロックを識別します。生成した乗算ユーティリティ関数も含め,生成コードを目視検査すると,これらの演算のコストを明確にすることができます。モデルを調整してこのような演算を回避することを強くお勧めします。

  • 算術演算の規則では,固定小数点の乗算と除算の実装の詳細について説明しています。乗算と除算に非ゼロのバイアスをもつ信号が関係すると,複雑度が大幅に増大します。このような複雑な演算を必要としないように変更することを強くお勧めします。乗算を実装するには,追加ステップが必要です。ブロックが乗算を行う前後に数据类型转换ブロックを挿入してください。これにより,バイアスの削除が可能になり,中間の計算に対してデータ型とスケーリングを制御できます。多くの場合,数据类型转换ブロックは(サブ)システムの“端”に移動することが可能です。変換は1回だけ行われ,サブシステム内のすべてのブロックは,よりシンプルなバイアスのない数学を学ぶことができます。

計算量の多い除算コードがないかチェック

符号付き整数の除算の丸めの動作はC言語標準では完全に指定されません。このため,除算用に生成されるコードは,シミュレーションとコード生成の間のビットトゥルー一致を行うには大きくなりすぎます。整数の除算で生成されたコードが大きくなりすぎないようにするには,[コンフィギュレーションパラメーター]ダイアログボックスの[ハードウェア実行)ペインで[符号付き整数の除算の丸め]パラメーターを推奨値に設定します。

ブレークポイントの間隔が不均等な查找ブロックを特定

ルックアップテーブルデータに関係する効率性のトレードオフの詳細は,速度,誤差,およびメモリの使用量に与える間隔の影響を参照してください。モデルアドバイザーはこのトレードオフに基づいて,効率性を向上させる余地のあるブロックを特定し,次の場合に警告を送信します。

  • ルックアップテーブルの入力データが等間隔ではない。

  • 量子化時にルックアップテーブルの入力データが等間隔に”ならない”が,等間隔に非常に近い状態である。

  • ルックアップテーブルの入力データは等間隔であるが,間隔が2のべき乗ではない。

計算量の多いpre-lookup除算がないかチェック

Prelookupまたは一天的查找表ブロックでは,[インデックス検索法)(等間隔のポイント]です。ブレークポイントデータの間隔は2のべき乗ではありません。

ブレークポイントデータが調整不可能な場合,データの間隔が等間隔で2のべき乗になるように調整することをお勧めします。そうしない場合は[ブロックパラメーター]ダイアログボックスで別の[インデックス検索法)を指定すると時間のかかる除算を回避できます。

計算量の多いデータ型変換がないかチェック

非効率なデータ型変換コードを生成するようにブロックが設定されている場合,モデルアドバイザーは警告を生成し,モデルを効率化する方法を提案します。

事前に計算された結果との固定小数点比較がないかチェック

关系操作符ブロックの演算にisInfisNaN,またはisFiniteを選択すると,ブロックは1入力モードに切り替わります。このモードで入力データ型が固定小数点,布尔または組み込み整数の場合,isInfisNaNの出力は假に,isFiniteの出力は真正になります。これは金宝app仿真软件编码器™で削除されるデッドコードになる可能性があります。

計算量の多いバイナリ比較演算がないかチェック

  • 关系操作符ブロックの入力データ型が同じでない場合は,ブロックが実行されるたびに変換処理が必要になります。入力の1つが不変の場合,不変入力のデータ型とスケーリングを他の入力と一致するように変更するとモデルの効率が向上します。

  • 关系操作符ブロックの入力範囲がさまざまな場合,キャスト時に値域エラーが生じ,変換が実行されるたびに桁落ちが発生します。关系操作符ブロックの前に数据类型转换ブロックを挿入すると,両方の入力を十分な範囲と精度で表現できる共通のデータ型に入力を変換できます。

  • 关系操作符ブロックの入力にさまざまな勾配調整係数が含まれている場合は,より小さい正の範囲をもつ入力がより大きな正の範囲をもつ入力のデータ型およびスケーリングに変換されるたびに,关系操作符ブロックで乗算演算を実行する必要があります。乗算を追加するとコードも追加しなければならず,実行速度が低下し,通常は桁落ちが生じます。入力のスケーリングを調整することにより,勾配の不一致を排除することができます。

計算量の多い比較コードがないかチェック

ご使用のモデルが,生成コードに計算量の多い比較コードを含めるように設定されている場合,モデルアドバイザーは警告を生成します。

生成コード内の計算量の多い固定小数点データ型のチェック

設計にターゲットハードウェアに存在しない整数または固定小数点の語長が含まれている場合,生成されたコードには余分な飽和コード,シフト,マルチワード処理が含まれる可能性があります。データ型をターゲットハードウェアによってサポートされているデータ型に変更することで,生成コードの効率を上げることができます。モデルアドバイザーはモデル内の計算量の多いこれらのデータ型にフラグを付けます。たとえば,ターゲットハードウェアが32ビットであった場合,モデルアドバイザーは語長が17の固定小数点データ型にフラグを付けます。

計算量の多い丸めコードを生成するブロックを特定

このチェックは,丸めの最適化が可能な場合に警告を行います。計算量の多い丸めコードを生成するブロックをチェックするために,モデルアドバイザーは次のサブチェックを実行します。

  • 乗算と除算で計算量の多い丸め演算がないかチェック

  • 最適化およびハードウェア実行設定のチェック(查找ブロック)

  • データ型変換に計算量の多い丸めがないかチェック

  • モデルに計算量の多い丸めモードがないかチェック

従来の手書きコード,特に制御アプリケーション用コードでは,ほとんどの場合に”簡単”な丸めが使用されています。たとえば,符号なしの整数と2の補数の符号付き整数の場合,右にシフトしてビットを切り捨てることは負の無限大方向に丸めることと等価です。従来の手書きコードと同等かそれ以上の結果を得るには,最も簡潔な丸めモードを使用してください。一般に,最もシンプルなモードはオーバーフローが発生しない最小コストのソリューションです。最も簡潔なモードを使用できない場合,負方向に丸めてください。

このルールの主な例外は,符号付き整数除算の丸め動作です。C標準ではこの丸め動作が未指定のままですが,大半の製品ターゲットで”簡単”な丸めモードとはゼロに丸めることです。符号なし除算ではあらゆるものが非負であるため,負方向に丸めることとゼロ方向に丸めることは等価です。丸め効率を向上させるには,量産ターゲットで使用するモードを使用して[モデルコンフィギュレーションパラメーター],[ハードウェア実行],[デバイスの詳細],[符号付き整数の除算の丸め]を設定します。

モデルのブロックで(整数丸めモード]パラメーターを使用して,モデルから生成されるコードをコンパイルするCコンパイラの丸め動作をシミュレートします。この設定は,产品ブロックなど,符号付き整数演算を実行できるブロックのパラメーターダイアログボックスの[信号属性]ペインに表示されます。最も効率的な生成コードを得るには,ブロックの(整数丸めモード]パラメーターを推奨設定に変更します。

丸めモードを選択する際に考慮するプロパティの詳細は,丸め手法の選択を参照してください。