pragma HLS loop_merge - 2023.2 日本語

Vitis 高位合成ユーザー ガイド (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 日本語

説明

連続するループを 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
...