関数インラインは、関数ロジックを呼び出し関数に分解することで、関数階層を削除します。関数をインライン展開するには、INLINE 指示子を使用します。関数をインライン展開すると、関数内でコンポーネントをより共有できたり、呼び出し関数のロジックで最適化できるので、エリアが削減されることがあります。小型の関数についても、このような関数のインライン展開が Vitis HLS で自動的に実行されます。
インライン展開により、関数の共有を制御しやすくなります。関数が共有されるには、それらが同じ階層レベル内で使用される必要があります。このコード例の場合、foo_top
関数により foo
が 2 回呼び出され、foo_sub
関数が呼び出されます。
foo_sub (p, q) {
int q1 = q + 10;
foo(p1,q); // foo_3
...
}
void foo_top { a, b, c, d} {
...
foo(a,b); //foo_1
foo(a,c); //foo_2
foo_sub(a,d);
...
}
関数 foo_sub
をインライン展開し、ALLOCATION 指示子で関数 foo
のインスタンスを 1 つだけ使用するように指定すると、使用するインスタンスが関数 foo
の 1 つのみとなり、エリアが上記例の 1/3 のデザインとなります。このストラテジを使用すると、共有可能なユーザー定義のリソースの範囲をより細かく制御できるため、エリア使用率を考慮する必要がある場合に有効な機能となります。
foo_sub (p, q) {
#pragma HLS INLINE
int q1 = q + 10;
foo(p1,q); // foo_3
...
}
void foo_top { a, b, c, d} {
#pragma HLS ALLOCATION instances=foo limit=1 function
...
foo(a,b); //foo_1
foo(a,c); //foo_2
foo_sub(a,d);
...
}
INLINE 指示子を recursive
オプションを指定して使用すると、指定した関数の下の関数がすべてインライン展開されます。recursive
オプションを最上位関数に使用すると、デザイン内のすべての関数階層が削除されます。
INLINE off
オプションを関数に適用すると、インライン展開されないようにできます。このオプションは、Vitis HLS で関数が自動的にインライン展開されないようにするために使用できます。
INLINE 指示子は、ソース コードに変更を加えずにコードの構造を大きく変更できるので、最適なアーキテクチャを探す効果的な手法として使用できます。