説明
FUNCTION_INSTANTIATE プラグマは、関数の階層を保持するエリアの利点を維持しながら、関数の特定のインスタンスに対してローカル最適化を実行する優れたオプションを提供する最適化手法です。これにより関数呼び出し周辺の制御ロジックが単純になり、レイテンシおよびスループットが向上することがあります。
デフォルトでは次のようになります。
- 関数は、RTL では個別の階層ブロックとして残るか、上位レベルの関数に分解 (インライン展開) されます。
- 同じ階層レベルにある関数のすべてのインスタンスは、同じ RTL インプリメンテーション (ブロック) を使用します。
FUNCTION_INSTANTIATE プラグマは、関数の各インスタンスに固有の RTL インプリメンテーションを作成し、関数呼び出しに応じて各インスタンスをローカルで最適化できるようにします。このプラグマを使用すると、関数が呼び出されたときに関数の一部の入力が定数であることがあるという事実を利用して、周辺の制御構造が単純化され、小型で最適化された関数ブロックが作成されます。
FUNCTION_INSTANTIATE プラグマを使用しない場合、次のコードから、func
内の関数の 3 つのインスタンスすべてに対して関数 func_sub
の RTL インプリメンテーションが 1 つ作成されます。関数 func_sub
の各インスタンスはまったく同じようにインプリメントされます。これは、関数を再利用して、関数の各インスタンス呼び出しに必要なエリアを削減するには良いですが、func_sub
の各呼び出しのバリエーションを考慮するため、関数内の制御ロジックがより複雑なものとなります。
char func_sub(char inval, char incr) {
#pragma HLS INLINE OFF
#pragma HLS FUNCTION_INSTANTIATE variable=incr
return inval + incr;
}
void func(char inval1, char inval2, char inval3,
char *outval1, char *outval2, char * outval3)
{
*outval1 = func_sub(inval1, 1);
*outval2 = func_sub(inval2, 2);
*outval3 = func_sub(inval3, 3);
}
OFF
オプションを使用すると、この自動インライン展開が実行されないようにできます。上記のコード例では、FUNCTION_INSTANTIATE プラグマにより関数 func_sub
の 3 つのインプリメンテーションが生成され、それぞれが incr
の指定値で最適化されるので、エリアが削減されて関数インプリメンテーションのパフォーマンスが向上します。
構文
C ソースの必要なロケーションの境界内に配置します。
#pragma HLS FUNCTION_INSTANTIATE variable=<variable>
説明:
-
variable=<variable>
- 必須の引数で、定数として使用する関数引数を定義します。
例
次の例では、関数 swInt
に FUNCTION_INSTANTIATE
プラグマを配置し、関数 swInt
の各インスタンスが maxv
関数引数に対して個別に最適化されるようにしています。
void swInt(unsigned int *readRefPacked, short *maxr, short *maxc, short *maxv){
#pragma HLS FUNCTION_INSTANTIATE variable=maxv
uint2_t d2bit[MAXCOL];
uint2_t q2bit[MAXROW];
#pragma HLS array partition variable=d2bit,q2bit cyclic factor=FACTOR
intTo2bit<MAXCOL/16>((readRefPacked + MAXROW/16), d2bit);
intTo2bit<MAXROW/16>(readRefPacked, q2bit);
sw(d2bit, q2bit, maxr, maxc, maxv);
}