インテルのみ表示可能 — GUID: yyy1489604310598
Ixiasoft
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++; } }