インテルのみ表示可能 — GUID: xct1506087469426
Ixiasoft
4.6. ネスト化ループから単一ループへの変換
パフォーマンスを最大限に高めるには、可能な限りネスト化ループを結合して単一ループにします。ループの制御フローでは、ロジックで必要なオーバーヘッドとFPGAのハードウェア・フットプリントのオーバーヘッドの両方が追加されます。ネスト化ループを単一ループに結合すると、これらの側面が緩和し、コンポーネントのパフォーマンスが向上します。
次のコード例は、ネスト化ループから単一ループへの変換を示しています。
ネスト化ループ | 変換された単一ループ |
---|---|
for (i = 0; i < N; i++) { //statements for (j = 0; j < M; j++) { //statements } //statements } |
for (i = 0; i < N*M; i++) { //statements } |
また、loop_coalesce プラグマを指定して、ネスト化ループを単一ループに結合することができます。このとき、ループの機能には影響を与えません。次に示すシンプルな例では、loop_coalesce プラグマを指定した場合に、コンパイラーによって2つのループを単一ループに結合します。
シンプルなネスト化ループを検討します。その記述は、次のとおりです。
#pragma loop_coalesce for (int i = 0; i < N; i++) for (int j = 0; j < M; j++) sum[i][j] += i+j;
コンパイラーでは、2つのループを結合して、単一ループのように実行します。その記述は次のとおりです。
int i = 0; int j = 0; while(i < N){ sum[i][j] += i+j; j++; if (j == M){ j = 0; i++; } }
loop_coalesce プラグマについて詳しくは、 インテル®HLS (高位合成) コンパイラー: リファレンス・マニュアル内のループ結合 ( loop_coalesce プラグマ) を参照してください。
次のチュートリアルでも確認できます。 <quartus_installdir>/hls/examples/tutorials/best_practices/loop_coalesce