関数のインライン展開 - 2023.2 日本語

Vitis 高位合成ユーザー ガイド (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 日本語

関数インラインは、関数ロジックを呼び出し関数に分解することで、関数階層を削除します。関数をインライン展開するには、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 指示子は、ソース コードに変更を加えずにコードの構造を大きく変更できるので、最適なアーキテクチャを探す効果的な手法として使用できます。