MATLAB ループの最適化
ループの最適化では、生成されるコードでループをストリームまたは展開できます。ループのストリームは面積の最適化であり、ループ展開は速度の最適化です。MATLAB Function ブロック内の MATLAB® コードのループを最適化するには、MATLAB Function
アーキテクチャを使用します。MATLAB Datapath
アーキテクチャを使用すると、コード ジェネレーターは、ループの最適化設定にかかわらずループを展開します。
ループのストリーム
HDL Coder™ はループの本体を 1 回インスタンス化し、ループを反復するたびにこのインスタンスを使用することで、ループをストリームします。ループ本体のインスタンスはオーバーサンプリングされ、生成されたループは元のループと機能的に同等に維持されます。
ループをストリームする場合のメリットは、ループ本体がインスタンス化される回数が減るため、ハードウェア リソースの使用率が削減されることです。デメリットは、ハードウェア実行の速度が低下する点です。
ループを部分的にストリームできます。部分的にストリームされたループは、ループ本体を複数回インスタンス化するため、完全にストリームされたループよりも多くの面積を使用します。ただし、部分的にストリームされたループはまた、完全にストリームされたループよりもオーバーサンプリングが削減されます。
ループ展開
HDL Coder は、生成されたコード内でループ本体の複数のインスタンスをインスタンス化することにより、ループを展開します。また、ループを部分的に展開することもできます。生成されたコードでは、元のループ本体の複数のインスタンスが含まれるループ ステートメントを元のループよりも少ない反復回数で使用できます。
展開したコードは、分散型パイプライン方式やリソース共有により最適化できます。分散型パイプライン方式では速度を向上できます。リソース共有では面積を削減できます。
ループ展開で複数のインスタンスを作成すると、これらのインスタンスは面積が増加する可能性があります。ループ展開ではまた、コードが読みにくくなります。
MATLAB ループを最適化する方法
HDL ワークフロー アドバイザーまたはコマンド ラインを使用して、グローバル ループの最適化を指定できます。
また、MATLAB コード内の coder.hdl.loopspec
プラグマを使用して、特定のループに対してローカル ループの最適化を指定することもできます。ループの最適化にグローバルとローカルの両方を指定すると、ローカル ループの最適化によってグローバル設定がオーバーライドされます。
グローバル ループの最適化
ワークフロー アドバイザーでループの最適化を指定するには、次の手順に従います。
HDL ワークフロー アドバイザーの左側のペインで [HDL ワークフロー アドバイザー] 、 [HDL コード生成] を選択します。
[最適化] タブの [ループの最適化] で、[なし]、[ループの展開] または [ループのストリーム] を選択します。
MATLAB のコマンド ラインから HDL ワークフローに対してループの最適化を指定するには、coder.HdlConfig
オブジェクトの LoopOptimization
プロパティを指定します。たとえば、coder.HdlConfig
オブジェクト hdlcfg
の場合は、次のいずれかのコマンドを入力します。
hdlcfg.LoopOptimization = 'UnrollLoops'; % unroll loops
hdlcfg.LoopOptimization = 'StreamLoops'; % stream loops
hdlcfg.LoopOptimization = 'LoopNone'; % no loop optimization
ローカル ループの最適化
特定の MATLAB ループを最適化する方法の詳細は、coder.hdl.loopspec
を参照してください。
メモ
coder.unroll
プラグマを指定する場合、このプラグマは coder.hdl.loopspec
より優先されます。coder.hdl.loopspec
は無効になります。
MATLAB ループ最適化の制限
以下の場合、HDL Coder はループをストリームできません。
ループのインデックスがカウント ダウンされる場合。ループのインデックスは、各反復で 1 ずつ増加しなければなりません。
別のループの階層の同じレベルで 2 つ以上のループが入れ子になっている場合。
特定の永続変数がループの内部と外部の両方で更新される場合。
非ゼロ値に初期化された永続変数がループ内で更新される場合。
HDL Coder は、永続変数が以下の場合にループをストリームできます。
ループの内部で更新され、ループの外部で読み取られる場合。
ループの内部で読み取られ、ループの外部で更新される場合。
次の場合は coder.hdl.loopspec('stream')
プラグマを使用できません。
サブ関数内。最上位の MATLAB 設計関数で指定しなければなりません。
別のループ内に入れ子にされたループ。
入れ子にされたループを含むループ。ただし、ストリーミング係数が反復回数と等しい場合を除く。