デバイスを見つけてプログラムを読み込んだら、ホスト アプリケーションがデバイスで実行されるカーネルを見つけて、そのカーネル引数を設定する必要があります。ホスト アプリケーションが対話するカーネルはすべて、読み込んだ .xclbin
ファイル内で定義されており、そこから見つける必要があります。
XRT 管理のカーネルの場合、.xclbin ファイルに含まれるカーネルにアクセスするため、XRT API によりカーネル クラス (xrt::kernel
) が提供されています。カーネル オブジェクトは、ザイリンクス デバイスに読み込まれた .xclbin 内で XRT 管理のカーネル (ホスト アプリケーションにより実行可能) を見つけます。
カーネル オブジェクトとバッファー オブジェクトを使用するには、ソースコードに次の include
文を追加する必要があります。
#include <xrt/xrt_kernel.h>
#include <xrt/xrt_bo.h>
次のコード例では、device
に読み込まれたプログラム (uuid
) で定義されているカーネル ("vadd"
) を見つけています。
auto krnl = xrt::kernel(device, uuid, "vadd");
ヒント: また、
xclbinutil
コマンドを使用して既存の .xclbin ファイルの内容を調べ、その中に含まれているカーネルを判別することもできます。実行するカーネルを見つけたら、カーネル引数に関連付けるバッファー オブジェクトを定義し、ホスト アプリケーションからカーネル インスタンスまたは計算ユニット (CU) へのデータ転送をイネーブルにする必要があります。
std::cout << "Allocate Buffer in Global Memory\n";
auto bo0 = xrt::bo(device, vector_size_bytes, krnl.group_id(0));
auto bo1 = xrt::bo(device, vector_size_bytes, krnl.group_id(1));
auto bo_out = xrt::bo(device, vector_size_bytes, krnl.group_id(2));
カーネル オブジェクト (xrt::kernel
) には、各カーネル引数に関連付けられたメモリを返すメソッド (kernel.group_id()
) が含まれます。スカラー引数の場合はバッファーが作成されないため、各カーネル バッファー引数にバッファー オブジェクトを割り当てます。