この
OpenCL™
カーネルの説明は、C/C ++ カーネル の情報に基づいています。カーネルのパフォーマンスを加速する同じプログラミング手法は、C/C++ と OpenCL カーネルの両方に適用されます。ただし、OpenCL カーネルでは、プラグマの代わりに __attribute
構文が使用されます。使用可能な属性の詳細は、OpenCL 属性 を参照してください。
次のコード例は、 Vitis™ アプリケーション アクセラレーション開発フローの OpenCL カーネルの要素をいくつか示したものです。これは、OpenCL またはカーネル開発の入門用のものではなく、OpenCL および C/C++ カーネル間の主な違いを示すためのものです。
カーネル シグネチャ
C/C++ カーネルでは、カーネルは Vitis コンパイラのコマンド ラインで v++ --kernel
オプションを使用すると識別されます。ただし、OpenCL コードの場合は、__kernel
キーワードでカーネルが識別されます。1 つの .cl
ファイル内で複数のカーネルを定義でき、Vitis コンパイラは --kernel
オプションでどのカーネルをコンパイルするか指定している場合を除き、カーネルをすべてコンパイルします。
__kernel __attribute__ ((reqd_work_group_size(1, 1, 1)))
void apply_watermark(__global const TYPE * __restrict input,
__global TYPE * __restrict output, int width, int height) {
{
...
}
apply_watermark
の完全なコードは、Vitis Accel Examples GitHub リポジトリの Global Memory Two Banks (CL) にあります。上記の例の場合、ウォーターマーク カーネルに input
と output
という 2 つのポインター タイプの引数と、width
と height
という 2 つのスカラー タイプの int 引数が含まれています。
C/C++ カーネルではこれらの引数に HLS INTERFACE
プラグマを使用する必要がありますが、OpenCL カーネルでは Vitis コンパイラおよび Vitis HLS でカーネル引数が認識され、必要に応じてポインター引数は m_axi
インターフェイスに、スカラー引数は s_axilite
インターフェイスにコンパイルされます。