ベクトル処理と行列乗算のリソース共有に関するガイドライン
"リソース共有" とは、HDL Coder™ によって行われる面積の最適化の 1 つです。機能的に等価な複数のリソースが特定され、単一のリソースに置き換えられます。同じ演算を実行するために、データが共有リソース全体で時間多重化されます。リソース共有の仕組みの詳細については、リソース共有を参照してください。
次のガイドラインは、1 次元ベクトルおよび 2 次元行列の処理でリソース共有をストリーミングと共に使用する方法について示したものです。各ガイドラインに準拠要件のレベルを示す重大度レベルが割り当てられています。詳細については、HDL モデリング ガイドラインの重大度レベルを参照してください。
ベクトル信号のリソース共有での StreamingFactor の使用
ガイドライン ID
3.1.9
重大度
情報
説明
1 次元ベクトルの各要素に対して同じ計算を実行する Subsystem ブロックの回路の面積を減らすには、Subsystem の HDL ブロック プロパティ [StreamingFactor] を使用します。N 個の要素を含むベクトル信号の場合、[StreamingFactor] を N
に設定します。時分割多重化を使用して各要素を処理することで、結果の処理に使用する演算の数を少なくすることができます。演算子のクロック周波数は、元のモデルの N 倍の速さになります。
共有するリソースを含むサブシステムで異なるサイズの複数のベクトル信号を使用する場合、クロック周波数がベクトル サイズの最小公倍数を掛けた値になり、達成可能な最大ターゲット周波数が低下することがあります。目的の周波数を得るには次のようにします。
サブシステムに入る前にベクトル信号を逆多重化し、サブシステムから出る信号を多重化するロジックを追加します。これにより、[StreamingFactor] の代わりに、サブシステムで [SharingFactor] を指定できるようになります。
最大サイズのベクトル信号と同じサイズになるように他のベクトル信号をパディングしてから、[StreamingFactor] を指定します。
モデル hdlcoder_vector_stream_gain
を開きます。
open_system('hdlcoder_vector_stream_gain') set_param('hdlcoder_vector_stream_gain', 'SimulationCommand', 'Update')
このモデルは、10 要素のベクトル信号を入力として受け入れ、各要素に前の値よりも 1 大きいゲイン値を乗算します。
open_system('hdlcoder_vector_stream_gain/Gain_Stream')
シミュレーション結果を確認するには、モデルをシミュレートして Scope ブロックを開きます。
sim('hdlcoder_vector_stream_gain') open_system('hdlcoder_vector_stream_gain/Show Processing Time')
Gain_Stream
サブシステムでは、[StreamingFactor] が 10
に設定されています。このサブシステムの HDL コードを生成するには、関数 makehdl
を実行します。
makehdl('hdlcoder_vector_stream_gain/Gain_Stream')
HDL コードの生成後、ストリーミング最適化の効果を確認するには、生成されたモデルを開き、Gain_Stream
サブシステム内を移動します。
ベクトル データが入力側で直列化され、その直列データが出力サイズで並列化されています。共有するターゲット回路サイズが小さい場合、この最適化によって合計回路サイズが逆に大きくなります。共有サブシステム内の Gain ブロックをモデルの基本レートの 10 倍のレートで実行することで、サブシステムのレイテンシの増加を防ぎ、ターゲット ハードウェアでの面積の削減を大きくすることによって達成可能な最大周波数の低下とのバランスが取られています。
行列乗算演算の共有での [SharingFactor] と HDL ブロック プロパティの使用
ガイドライン ID
3.1.10
重大度
情報
説明
Matrix Multiply ブロックは、[乗算] ブロック パラメーターが [行列 (*)]
に設定された Product ブロックです。[HDL ブロック プロパティ] ダイアログ ボックスで、HDL アーキテクチャが [Matrix Multiply]
に設定されており、DotProductStrategyを指定できます。
DotProductStrategy の設定
DotProductStrategy | 説明 |
---|---|
'Fully Parallel' (既定の設定) | 乗算と加算の演算を並列に実行します。[MxN]*[NxM] の行列の乗算に N*M*M 個の乗算器が必要です。 |
'Parallel Multiply-Accumulate' | Multiply-Accumulate ブロックの [並列] アーキテクチャを使用して、行列乗算を実装します。このアーキテクチャでは、複数の Multiply-Add ブロックが累積と並列に実行されます。 |
'Serial Multiply-Accumulate' | Multiply-Accumulate ブロックの [シリアル] アーキテクチャを使用して、行列乗算を実装します。このモードでは、オーバーサンプリングが N 回実行され、乗算器の数は M*M 個になります。 |
同じサブシステムに複数の Matrix Multiply ブロックがある場合に、リソースを共有して乗算器の数をさらに少なくするには、[DotProductStrategy] を [Fully Parallel]
に設定し、上位のサブシステムで [SharingFactor] を指定します。
複素数と実数を含む乗算の場合、乗算器の数が 2 倍になります。
[MxN]*[NxM] の乗算で生成される乗算器の数
乗算の種類 | Fully Parallel/Parallel Multiply-Accumulate | Serial Multiply-Accumulate |
---|---|---|
実数と実数 | N*M*M | M*M |
複素数と実数 | N*M*M*2 | M*M*2 |
複素数と複素数 | N*M*M*4 | M*M*4 |
浮動小数点行列の乗算には、[浮動小数点の使用] を選択します。この場合、[DotProductStrategy] には [Fully Parallel]
を使用する必要があります。このモードでは要素単位の演算は使用されず、乗算と加算の演算が並列に実行されるため、リソースを共有して回路の面積を節約するために [StreamingFactor] の代わりに [SharingFactor] を使用します。
浮動小数点型を使用してストリーミング行列乗算を実行する例については、ストリーミング行列乗算 System object の HDL コード生成を参照してください。