1.7.2. ループ結合
loop_coalesceプラグマを使用して、ループ機能に影響を与えずにネスト化ループを 1 つのループに統合するように インテル® 高位合成 (HLS) コンパイラーに指示します。ループを結合すると、ループに必要なオーバーヘッドを減らすようにコンパイラーに指示することで コンポーネントのエリア使用率の削減ができます。
ネスト化ループを結合するには、次のようにプラグマを指定します。
#pragma loop_coalesce <loop_nesting_level>
<loop_nesting_level> パラメーターはオプションであり、コンパイラーに結合させたいネスト化ループレベルの数を指定する整数です。<loop_nesting_level> パラメーターを指定しない場合、コンパイラーはすべてのネスト化ループを結合しようとします。
例えば、次のような一連のネスト化ループを考察します。
ループ (A) の前にプラグマを置くと、これらのネスト化ループレベルは次のようになります。
for (A)
for (B)
for (C)
for (D)
for (E)
- ループ (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 つのループに結合する方法を示しています。
次のように記述された簡単なネスト化ループを考察します。
コンパイラーは 2 つのループを結合し、次のように記述された 1 つのループのように実行します。
#pragma loop_coalesce
for(int i = 0; i < N; i++)
for(int j = 0; j < M; j++)
sum[i][j] += i+j;
int i = 0;
int j = 0;
while(i < N){
sum[i][j] += i+j;
j++;
if(j == M){
j=0;
i++;
}
}