このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
モデル アドバイザーを使用した生成コードの最適化
Simulink® モデル アドバイザーを使用すると、効率よく設計して生成コードを最適化できるように固定小数点モデルを設定できます。モデル アドバイザーを使用して固定小数点モデルをチェックするには、以下の手順に従います。
解析するモデルの [モデル化] タブで、[モデル アドバイザー] をクリックします。
システム セレクターで解析するシステムを選択します。
モデル アドバイザーの左側のペインで [製品別] ノードと [Embedded Coder] ノードを展開します。
固定小数点コード生成の場合、選択すべき最も重要なチェック ボックスは [計算量の多い固定小数点および飽和のコードを生成するブロックを特定]、[問題のある固定小数点演算を特定]、[計算量の多い丸めコードを生成するブロックを特定] および [ハードウェア実行をチェック] です。
選択したノードに関連付けられたモデル アドバイザーのチェックをすべて有効にするには、チェックを含むフォルダーのチェック ボックスをオンにします。この例では、[Embedded Coder] チェック ボックスをオンにします。
[チェックの実行] をクリックします。固定小数点モデルの効率性を改善するためのヒントがあれば、モデル アドバイザー ウィンドウに表示されます。
以降の節では、モデル アドバイザーにより検出される固定小数点関連のチェックおよびサブチェックについて説明します。また、これらのチェックと固定小数点コード生成における重要性について説明し、モデルを調整して生成コードを最適化する方法を示します。
計算量の多い固定小数点および飽和のコードを生成するブロックを特定
Sum ブロックの問題のある固定小数点演算を特定
Sum ブロックの入力範囲が出力範囲を超えると、値域エラーが発生します。アプリケーションに必要な任意の加算または減算は、Sum ブロックの前後またはその一方に Data Type Conversion ブロックを挿入することで行えます。
Sum ブロックに、出力の勾配調整係数と異なる勾配調整係数をもつ入力が含まれている場合は、不一致により、入力を出力のデータ型およびスケーリングに変換するたびに、Sum ブロックで乗算演算を実行する必要があります。出力または入力のスケーリングを変更すると、この不一致を解決できます。
Sum ブロックの入力バイアスの正味合計が出力のバイアスと異なる場合、生成コードには正味バイアス調整を正しく行うための加算命令または減算命令が 1 つ余分に含まれます。正味のバイアスの調整を 0 にするように出力スケーリングのバイアスを変更し、余分な演算を除去できます。
MinMax ブロックの問題のある固定小数点演算を特定
MinMax ブロックの入力と出力のデータ型が異なる場合は、ブロックを実行するたびに変換処理が必要になります。データ型を同じにするとモデルはより効率的になります。
MinMax ブロックの入力のデータ型およびスケーリングが出力のデータ型およびスケーリングと一致しない場合は、関係演算を実行する前に変換を行う必要があります。これは、それぞれの変換の実行時のキャストまたは桁落ちによる値域エラーを引き起こす可能性があります。入力または出力のスケーリングを変更して、より効率的なコードを生成してください。
MinMax ブロックの入力の勾配調整係数が出力と異なる場合、ブロックを実行して入力を出力のデータ型およびスケーリングに変換するたびに、MinMax ブロックでは乗算演算が必要になります。この不一致は、入力または出力のスケーリングを変更することにより解決できます。
Discrete Integrator ブロックの問題のある固定小数点演算を特定
Discrete-Time Integrator ブロックの初期条件を使用して状態および出力を初期化する場合、出力方程式によって過度のコードが生成され、追加のグローバル変数が必要になります。[Function ブロック パラメーター]、[初期条件設定] パラメーターを
[状態 (最も効率的)]
に設定することをお勧めします。
Compare To Constant ブロックの問題のある固定小数点演算を特定
Compare to Zero ブロックの入力データ型がゼロを正確に表現できない場合、入力信号はゼロに最も近い表現可能な値と比較されて、パラメーターのオーバーフローを引き起こします。このパラメーター オーバーフローを回避するには、ゼロを表現できる入力データ型を選択します。
Compare to Constant の [定数値] パラメーターが入力データ型が表現できる範囲から外れている場合、入力信号はその定数に最も近い表現可能な値と比較されます。その結果、パラメーターのオーバーフローが発生します。このパラメーター オーバーフローを回避するには、[定数値] を表現できる入力データ型を選択するか、[定数値] を入力データ型が対応できる値に変更します。
Lookup Table ブロックの問題のある固定小数点演算を特定
ルックアップ テーブル データに関係する効率性のトレードオフの詳細は、速度、誤差、およびメモリの使用量に与える間隔の影響を参照してください。モデル アドバイザーはこのトレードオフに基づいて、次のような、効率性を向上させる余地のあるブロックを特定します。
ルックアップ テーブルの入力データが等間隔ではない。
量子化時にルックアップ テーブルの入力データが等間隔に "ならない" が、等間隔に非常に近い状態である。
ルックアップ テーブルの入力データは等間隔であるが、間隔が 2 のべき乗ではない。
ルックアップ テーブルの最適化の詳細については、ルックアップ テーブルの最適化を参照してください。
最適化設定およびハードウェア実行設定のチェック
整数除算の生成コードには、ゼロ除算、INT_MIN/-1、LONG_MIN/-1 などの演算の例外に対する保護が含まれています。入力値を規定することで、例外となる除算が行われないようにモデルを構築する場合、除算の一部として生成される保護コードは冗長になります。
インデックス検索法
[等間隔のポイント] には除算が必要ですが、この計算には時間がかかる場合があります。
勾配設定の計算を呼び出すブロックを識別
固定小数点勾配の変化量が 2 のべき乗でない場合は、正味勾配計算が必要です。通常、正味勾配計算を行うには、整数を乗算してからシフトします。状況によっては、整数を定数で除算するだけで済むこともあります。このような状況の一例として、正味勾配をある整数の逆数として正確に表現できる場合があります。この条件が満たされる場合、除算を行うと数値的な動作がより正確になります。使用しているコンパイラと組み込みハードウェアによっては、乗算とシフトを行うより除算を行う方が効果的な場合もあります。ROM サイズまたはモデル実行サイズにおいて生成コードの効率が高まる可能性があります。
モデル アドバイザーは以下の場合に警告を表示します。
[固定小数点の正味勾配計算に除算を使用] 最適化パラメーターを
[オン]
に設定したが、モデル コンフィギュレーションがこの選択に対応していない場合。モデル コンフィギュレーションが除算を使用して正味勾配計算を処理するのに適しているが、[固定小数点の正味勾配計算に除算を使用] 最適化パラメーターを
[オン]
に設定しない場合。
詳細については、正味勾配計算を参照してください。
効率が良くない Product ブロックを識別
1 つのブロックが実行する乗算と除算の回数は、精度と効率性に大きな影響を及ぼす可能性があります。モデル アドバイザーは、これらの演算を並べ替えて精度または効率性あるいはその両方を向上できる状況の一部を検出します。ただし、すべて検出するわけではありません。
このような状況の一例として、除算を 1 回を超える回数行う計算を実行する場合が挙げられます。数値解析分野の一般的なガイドラインに従うと、最初にすべての分母項を乗算してから、除算を 1 回だけ行います。この方法により、浮動小数点と特に固定小数点の計算で精度が向上し、多くの場合に速度も改善されます。これは、Simulink で Product ブロックをカスケード接続することで実行できます。複数の除算が一連のブロックにまたがる場合はモデル アドバイザーで検出できないことに注意してください。
他の例として、単一の Product ブロックで乗算または除算を 1 回を超えて実行するよう設定されている場合があります。この演算はサポートされていますが、出力データ型が整数または固定小数点の場合、この演算をブロックごとに 1 つの乗算または除算を実行するようにいくつかのブロックに分けた方が良い結果が得られる可能性が高くなります。複数のブロックを使用すると、中間の計算で使用されるデータ型とスケーリングを制御できます。中間計算でのデータ型の選択は精度、値域エラー、効率に影響します。
計算量の多い飽和コードがないかチェック
[整数オーバーフローで飽和] パラメーターを設定すると、アプリケーションに不必要な条件チェック コードが生成される場合があります。
[ブロック パラメーター]、[信号属性]、[整数オーバーフローで飽和] の設定がアプリケーションに必要かどうかをチェックします。必要ない場合は、このパラメーターの選択を解除して、生成されたコード内に最も効率よくブロックを実装します。
問題のある固定小数点演算を特定
このチェックでは、マルチワード処理、煩雑な乗除算、計算量の多い変換コード、非効率なルックアップ テーブル ブロックおよび計算量の多い比較コードを生成するブロックを識別します。
マルチワード処理のチェック
処理によってデータ型がプロセッサの最大ワード サイズよりも大きくなった場合、生成されたコードにマルチワード処理が含まれます。ハードウェアのマルチワード処理は、非効率になる可能性もあります。マルチワード処理を回避するには、処理の入力のワード サイズがプロセッサの最大ワード サイズを超えないように調整します。生成されたコードにおけるマルチワード処理の制御の詳細については、生成されたコード内の固定小数点マルチワード処理を参照してください。
計算量の多い乗算コードがないかチェック
組み込みプロセッサのターゲットでは、組み込みプロセッサの機能と制限事項について説明しています。設計規則では、乗算への入力にプロセッサの基本整数データ型より大きい語長を含めないようにすることを推奨しています。語長が大きい場合もソフトウェアで乗算を処理できますが、必要なコードの量が増え実行速度が大幅に遅くなります。モデル アドバイザーは望ましくないソフトウェア乗算が要求されるブロックを識別します。生成した乗算ユーティリティ関数も含め、生成コードを目視検査すると、これらの演算のコストを明確にすることができます。モデルを調整してこのような演算を回避することを強くお勧めします。
算術演算の規則では、固定小数点の乗算と除算の実装の詳細について説明しています。乗算と除算に非ゼロのバイアスをもつ信号が関係すると、複雑度が大幅に増大します。このような複雑な演算を必要としないように変更することを強くお勧めします。乗算を実装するには、追加ステップが必要です。ブロックが乗算を行う前後に Data Type Conversion ブロックを挿入してください。これにより、バイアスの削除が可能になり、中間の計算に対してデータ型とスケーリングを制御できます。多くの場合、Data Type Conversion ブロックは、(サブ) システムの "端" に移動することが可能です。変換は 1 回だけ行われ、サブシステム内のすべてのブロックは、よりシンプルなバイアスのない数学を学ぶことができます。
計算量の多い除算コードがないかチェック
符号付き整数の除算の丸めの動作は C 言語標準では完全に指定されません。このため、除算用に生成されるコードは、シミュレーションとコード生成の間のビットトゥルー一致を行うには大きくなりすぎます。整数の除算で生成されたコードが大きくなりすぎないようにするには、[コンフィギュレーション パラメーター] ダイアログ ボックスの [ハードウェア実行] ペインで [符号付き整数の除算の丸め] パラメーターを推奨値に設定します。
ブレークポイントの間隔が不均等な Lookup ブロックを特定
ルックアップ テーブル データに関係する効率性のトレードオフの詳細は、速度、誤差、およびメモリの使用量に与える間隔の影響を参照してください。モデル アドバイザーはこのトレードオフに基づいて、効率性を向上させる余地のあるブロックを特定し、次の場合に警告を送信します。
ルックアップ テーブルの入力データが等間隔ではない。
量子化時にルックアップ テーブルの入力データが等間隔に "ならない" が、等間隔に非常に近い状態である。
ルックアップ テーブルの入力データは等間隔であるが、間隔が 2 のべき乗ではない。
計算量の多い pre-lookup 除算がないかチェック
Prelookup または n-D Lookup Table ブロックでは、[インデックス検索法] は [等間隔のポイント]
です。ブレークポイント データの間隔は 2 のべき乗ではありません。
ブレークポイント データが調整不可能な場合、データの間隔が等間隔で 2 のべき乗になるように調整することをお勧めします。そうしない場合は、[ブロック パラメーター] ダイアログ ボックスで別の [インデックス検索法] を指定すると時間のかかる除算を回避できます。
計算量の多いデータ型変換がないかチェック
非効率なデータ型変換コードを生成するようにブロックが設定されている場合、モデル アドバイザーは警告を生成し、モデルを効率化する方法を提案します。
事前に計算された結果との固定小数点比較がないかチェック
Relational Operator ブロックの演算に isInf
、isNaN
、または isFinite
を選択すると、ブロックは 1 入力モードに切り替わります。このモードで入力データ型が固定小数点、boolean または組み込み整数の場合、isInf
と isNaN
の出力は FALSE に、isFinite
の出力は TRUE になります。これは Simulink Coder™ で削除されるデッド コードになる可能性があります。
計算量の多いバイナリ比較演算がないかチェック
Relational Operator ブロックの入力データ型が同じでない場合は、ブロックが実行されるたびに変換処理が必要になります。入力の 1 つが不変の場合、不変入力のデータ型とスケーリングを他の入力と一致するように変更するとモデルの効率が向上します。
Relational Operator ブロックの入力範囲がさまざまな場合、キャスト時に値域エラーが生じ、変換が実行されるたびに桁落ちが発生します。Relational Operator ブロックの前に Data Type Conversion ブロックを挿入すると、両方の入力を十分な範囲と精度で表現できる共通のデータ型に入力を変換できます。
Relational Operator ブロックの入力にさまざまな勾配調整係数が含まれている場合は、より小さい正の範囲をもつ入力がより大きな正の範囲をもつ入力のデータ型およびスケーリングに変換されるたびに、Relational Operator ブロックで乗算演算を実行する必要があります。乗算を追加するとコードも追加しなければならず、実行速度が低下し、通常は桁落ちが生じます。入力のスケーリングを調整することにより、勾配の不一致を排除することができます。
計算量の多い比較コードがないかチェック
ご使用のモデルが、生成コードに計算量の多い比較コードを含めるように設定されている場合、モデル アドバイザーは警告を生成します。
生成コード内の計算量の多い固定小数点データ型のチェック
設計にターゲット ハードウェアに存在しない整数または固定小数点の語長が含まれている場合、生成されたコードには余分な飽和コード、シフト、マルチワード処理が含まれる可能性があります。データ型をターゲット ハードウェアによってサポートされているデータ型に変更することで、生成コードの効率を上げることができます。モデル アドバイザーはモデル内の計算量の多いこれらのデータ型にフラグを付けます。たとえば、ターゲット ハードウェアが 32 ビットであった場合、モデル アドバイザーは語長が 17 の固定小数点データ型にフラグを付けます。
計算量の多い丸めコードを生成するブロックを特定
このチェックは、丸めの最適化が可能な場合に警告を行います。計算量の多い丸めコードを生成するブロックをチェックするために、モデル アドバイザーは次のサブチェックを実行します。
乗算と除算で計算量の多い丸め演算がないかチェック
最適化およびハードウェア実行設定のチェック (Lookup ブロック)
データ型変換に計算量の多い丸めがないかチェック
モデルに計算量の多い丸めモードがないかチェック
従来の手書きコード、特に制御アプリケーション用コードでは、ほとんどの場合に "簡単" な丸めが使用されています。たとえば、符号なしの整数と 2 の補数の符号付き整数の場合、右にシフトしてビットを切り捨てることは負の無限大方向に丸めることと等価です。従来の手書きコードと同等かそれ以上の結果を得るには、最も簡潔な丸めモードを使用してください。一般に、最もシンプルなモードはオーバーフローが発生しない最小コストのソリューションです。最も簡潔なモードを使用できない場合、負方向に丸めてください。
このルールの主な例外は、符号付き整数除算の丸め動作です。C 標準ではこの丸め動作が未指定のままですが、大半の製品ターゲットで "簡単" な丸めモードとはゼロに丸めることです。符号なし除算ではあらゆるものが非負であるため、負方向に丸めることとゼロ方向に丸めることは等価です。丸め効率を向上させるには、量産ターゲットで使用するモードを使用して [モデル コンフィギュレーション パラメーター]、[ハードウェア実行]、[デバイスの詳細]、[符号付き整数の除算の丸め] を設定します。
モデルのブロックで [整数丸めモード] パラメーターを使用して、モデルから生成されるコードをコンパイルする C コンパイラの丸め動作をシミュレートします。この設定は、Product ブロックなど、符号付き整数演算を実行できるブロックのパラメーター ダイアログ ボックスの [信号属性] ペインに表示されます。最も効率的な生成コードを得るには、ブロックの [整数丸めモード] パラメーターを推奨設定に変更します。
丸めモードを選択する際に考慮するプロパティの詳細は、丸め手法の選択を参照してください。