OpenCL カーネル開発 - 2020.2 Japanese

Vitis 統合ソフトウェア プラットフォームの資料: アプリケーション アクセラレーション開発 (UG1393)

Document ID
UG1393
Release Date
2021-03-22
Version
2020.2 Japanese

この 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) にあります。

上記の例の場合、ウォーターマーク カーネルに inputoutput という 2 つのポインター タイプの引数と、widthheight という 2 つのスカラー タイプの int 引数が含まれています。

C/C++ カーネルではこれらの引数に HLS INTERFACE プラグマを使用する必要がありますが、OpenCL カーネルでは Vitis コンパイラおよび Vitis HLS でカーネル引数が認識され、必要に応じてポインター引数は m_axi インターフェイスに、スカラー引数は s_axilite インターフェイスにコンパイルされます。