インテル® HLS コンパイラー: リファレンス・マニュアル

ID 683349
日付 6/23/2017
Public
ドキュメント目次

1.7.2. ループ結合

loop_coalesceプラグマを使用して、ループ機能に影響を与えずにネスト化ループを 1 つのループに統合するように インテル® 高位合成 (HLS) コンパイラーに指示します。ループを結合すると、ループに必要なオーバーヘッドを減らすようにコンパイラーに指示することで コンポーネントのエリア使用率の削減ができます。
ネスト化ループを結合するには、次のようにプラグマを指定します。
#pragma loop_coalesce <loop_nesting_level>

<loop_nesting_level> パラメーターはオプションであり、コンパイラーに結合させたいネスト化ループレベルの数を指定する整数です。<loop_nesting_level> パラメーターを指定しない場合、コンパイラーはすべてのネスト化ループを結合しようとします。

例えば、次のような一連のネスト化ループを考察します。
for (A)
  for (B)
    for (C)
      for (D)
    for (E)
ループ (A) の前にプラグマを置くと、これらのネスト化ループレベルは次のようになります。
  • ループ (A) はネスト化ループレベル 1
  • ループ (B) はネスト化ループレベル 2
  • ループ (C) はネスト化ループレベル 3
  • ループ (D) はネスト化ループレベル 4
  • ループ (E) はネスト化ループレベル 3
指定するループのネストレベルに応じて、コンパイラーはループを別々に結合しようとします。
  • #pragma loop_coalesce 1を指定する場合、コンパイラーはどのネスト化ループも結合しようとしない。
  • #pragma loop_coalesce 2を指定する場合、コンパイラーはループ (A) と (B) を結合しようとする。
  • #pragma loop_coalesce 3を指定する場合、コンパイラーはループ (A)、(B)、(C)、および (E) を結合しようとする。
  • #pragma loop_coalesce 4を指定する場合、コンパイラーはループ (A) ~ (E) の全ループを結合しようとする。

次の簡単な例はコンパイラーが 2 つのループを 1 つのループに結合する方法を示しています。

次のように記述された簡単なネスト化ループを考察します。
#pragma loop_coalesce
for(int i = 0; i < N; i++)
  for(int j = 0; j < M; j++)
    sum[i][j] += i+j;
コンパイラーは 2 つのループを結合し、次のように記述された 1 つのループのように実行します。
int i = 0;
int j = 0;
while(i < N){
  
  sum[i][j] += i+j;
  j++;

  if(j == M){
    j=0;
    i++;
  }
}