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 はループをストリームできません。
特定の永続変数がループの内部と外部の両方で更新される場合。
非ゼロ値に初期化された永続変数がループ内で更新される場合。
HDL Coder は、永続変数が以下の場合にループをストリームできます。
ループの内部で更新され、ループの外部で読み取られる場合。
ループの内部で読み取られ、ループの外部で更新される場合。
次の場合は coder.hdl.loopspec('stream')
プラグマを使用できません。
サブ関数内。最上位の MATLAB 設計関数で指定しなければなりません。
別のループ内に入れ子にされたループ。
入れ子にされたループを含むループ。ただし、ストリーミング係数が反復回数と等しい場合を除く。