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

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

4.1. ループでの呼び出しによるハードウェアの再利用

ループは、ハードウェアを再利用する便利な方法です。コンポーネント関数で別の関数をコールすると、コールされた関数はトップレベルのコンポーネントになります。関数を複数回コールすると、ハードウェアが重複します。

例えば、次のコード例では、関数 foo 複数のハードウェアコピーがコンポーネント myComponent 内に作成されます。これは、関数 foo がインライン化されているためです。
int foo(int a)
{
    return 4 + sqrt(a) /
}

component
void myComponent()
{
  ...
  int x =
  x += foo(0);
  x += foo(1);
  x += foo(2);
  ...
}
関数 foo をループ内に配置すると、 foo のハードウェアの再利用が呼び出しごとにできます。関数は引き続きインライン化されますが、インライン化されるのは1回だけです。
component
void myComponent()
{
  ...
  int x = 0;
#pragma unroll 1
  for (int i = 0; i < 3; i++)
  {
    x += foo(i);
  }
  ...
}
switch/case ブロックを使用することもできます。ただしこれは、再利用可能な関数の異なる値のうちループ誘導変数 i に関連しないものを渡す場合のみです。
component
void myComponent()
{
  ...
  int x = 0;
#pragma unroll 1
  for (int i = 0; i < 3; i++)
  {
     int val = 0;
     switch(i)
     {
     case 0:
         val = 3;
         break;
     case 1:
         val = 6;
         break;
     case 2:
         val = 1;
         break;
     }
     x += foo(val);
  }
  ...
}
H

ハードウェアの再利用とインラインの最小化ついては、リソース共有チュートリアルを参照してください。これは、次のウェブサイトで入手可能です。 <quartus_installdir>/hls/examples/tutorials/best_practices/resource_sharing_filter