説明
ALWAYS_INLINE 属性は、関数をインライン展開する必要があることを示します。この属性は GCC の標準機能であり、Vitis コンパイラの標準機能でもあります。
ヒント: NOINLINE 属性は GCC の標準機能であり、Vitis コンパイラでもサポートされます。
この属性は、関数を呼び出し関数内でインライン展開するコンパイラ最適化をイネーブルにします。インライン展開された関数は、RTL で別の階層としては表示されなくなります。
関数をインライン展開すると、関数内の演算が共有され、呼び出し関数の周辺の演算と効率よく最適化されることがあります。ただし、インライン展開された関数はほかの関数と共有できなくなるので、インライン展開された関数とその関数の別のインスタンス (より広く共有可能) でロジックが複製される可能性があります。これによりパフォーマンスを向上できますが、RTL をインプリメントするのに必要なエリアが増加します。
OpenCL カーネルの場合、Vitis コンパイラでは独自の規則を使用して、関数がインライン展開または非インライン展開されます。インライン関数を直接制御するには、ALWAYS_INLINE または NOINLINE 属性を使用ます。
デフォルトでは、インライン展開は関数階層のすぐ下の階層でのみ実行され、サブ関数では実行されません。
重要: XCL_DATAFLOW 属性を使用すると、コンパイラで ALWAYS_INLINE 属性が無視され、関数がインライン展開されません。
構文
OpenCL API ソースで関数の前に記述し、その関数が呼び出されたときに常にインライン展開されるようにします。
__attribute__((always_inline))
例
次の例では、関数 foo
に ALWAYS_INLINE 属性を追加しています。
__attribute__((always_inline))
void foo ( a, b, c, d ) {
...
}
次の例では、関数 foo
がインライン展開されないようにしています。
__attribute__((noinline))
void foo ( a, b, c, d ) {
...
}