Main Content

MATLAB ループの最適化

ループの最適化では、生成されるコードでループをストリームまたは展開できます。ループのストリームは面積の最適化であり、ループ展開は速度の最適化です。MATLAB Function ブロック内の MATLAB® コードのループを最適化するには、MATLAB Function アーキテクチャを使用します。MATLAB Datapath アーキテクチャを使用すると、コード ジェネレーターは、ループの最適化設定にかかわらずループを展開します。

ループのストリーム

HDL Coder™ はループの本体を 1 回インスタンス化し、ループを反復するたびにこのインスタンスを使用することで、ループをストリームします。ループ本体のインスタンスはオーバーサンプリングされ、生成されたループは元のループと機能的に同等に維持されます。

ループをストリームする場合のメリットは、ループ本体がインスタンス化される回数が減るため、ハードウェア リソースの使用率が削減されることです。デメリットは、ハードウェア実行の速度が低下する点です。

ループを部分的にストリームできます。部分的にストリームされたループは、ループ本体を複数回インスタンス化するため、完全にストリームされたループよりも多くの面積を使用します。ただし、部分的にストリームされたループはまた、完全にストリームされたループよりもオーバーサンプリングが削減されます。

ループ展開

HDL Coder は、生成されたコード内でループ本体の複数のインスタンスをインスタンス化することにより、ループを展開します。また、ループを部分的に展開することもできます。生成されたコードでは、元のループ本体の複数のインスタンスが含まれるループ ステートメントを元のループよりも少ない反復回数で使用できます。

展開したコードは、分散型パイプライン方式やリソース共有により最適化できます。分散型パイプライン方式では速度を向上できます。リソース共有では面積を削減できます。

ループ展開で複数のインスタンスを作成すると、これらのインスタンスは面積が増加する可能性があります。ループ展開ではまた、コードが読みにくくなります。

MATLAB ループを最適化する方法

HDL ワークフロー アドバイザーまたはコマンド ラインを使用して、グローバル ループの最適化を指定できます。

また、MATLAB コード内の coder.hdl.loopspec プラグマを使用して、特定のループに対してローカル ループの最適化を指定することもできます。ループの最適化にグローバルとローカルの両方を指定すると、ローカル ループの最適化によってグローバル設定がオーバーライドされます。

グローバル ループの最適化

ワークフロー アドバイザーでループの最適化を指定するには、次の手順に従います。

  1. HDL ワークフロー アドバイザーの左側のペインで [HDL ワークフロー アドバイザー][HDL コード生成] を選択します。

  2. [最適化] タブの [ループの最適化] で、[なし][ループの展開] または [ループのストリーム] を選択します。

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 設計関数で指定しなければなりません。

  • 別のループ内に入れ子にされたループ。

  • 入れ子にされたループを含むループ。ただし、ストリーミング係数が反復回数と等しい場合を除く。

参考