説明
連続するループを 1 つのループに結合して、全体的なレイテンシを削減し、共有を増やして最適化を向上します。ループを結合すると、次が可能になります。
- RTL でループ本文のインプリメンテーション間の移行に必要なクロック サイクル数を削減できます。
- ループを並列にインプリメントできます (可能な場合)。
LOOP_MERGE プラグマは、適用されたスコープ内のループすべてを結合しようとします。たとえば、LOOP_MERGE プラグマをループの本体に適用した場合、Vitis HLS ツールではプラグマがそのループ自体ではなく、ループ内の下位ループに適用されます。
ループ結合の規則は、次のとおりです。
- ループの境界が変数の場合、同じ値 (反復回数) である必要があります。
- ループの境界が定数の場合、最大定数値が結合されたループの境界として使用されます。
- 境界が変数のループと定数のループを結合することはできません。
- 結合するループ間のコードが、結合により悪影響を受けないようにします。コードを複数回実行しても常に同じ結果になるようにする必要があります。たとえば、a=b は許容されますが a=a+1 は許容されません。
- ループに FIFO 読み出しが含まれる場合は、ループは結合できません。結合により読み出しの順序が変更されてしまうためです。FIFO または FIFO インターフェイスからの読み出しは、常に順序どおりに実行される必要があります。
構文
C ソースの必要なスコープまたは領域内に配置します。
#pragma HLS loop_merge force
説明:
-
force
- HLS ツールで警告が出力されてもループが結合されるようオプションのキーワードです。重要: この場合、結合したループが問題なく動作するかどうかをユーザーが確認する必要があります。
例
次の例では、関数 foo
の連続するすべてのループを 1 つのループに結合しています。
void foo (num_samples, ...) {
#pragma HLS loop_merge
int i;
...
loop_1: for(i=0;i< num_samples;i++) {
...
次の例では、loop_2
内の loop_2
を除くすべてのループを force
オプションを使用して結合しています。プラグマを loop_2
の本体に記述します。
loop_2: for(i=0;i< num_samples;i++) {
#pragma HLS loop_merge force
...