インテル®高位合成 (HLS) コンパイラー プロ・エディション: ベスト・プラクティス・ガイド

ID 683152
日付 12/16/2019
Public
ドキュメント目次

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