XRT 管理のカーネルおよびカーネル引数の設定 - 2022.1 日本語

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

Document ID
UG1393
Release Date
2022-05-25
Version
2022.1 日本語

デバイスを見つけてプログラムを読み込んだら、ホスト アプリケーションがデバイスで実行されるカーネルを見つけて、そのカーネル引数を設定する必要があります。ホスト アプリケーションが対話するカーネルはすべて、読み込んだ .xclbin ファイル内で定義されており、そこから見つける必要があります。

XRT 管理のカーネルの場合、.xclbin ファイルに含まれるカーネルにアクセスするため、XRT API によりカーネル クラス (xrt::kernel) が提供されています。カーネル オブジェクトは、ザイリンクス デバイスに読み込まれた .xclbin 内で XRT 管理のカーネル (ホスト アプリケーションにより実行可能) を見つけます。

ヒント: .xclbin ファイル内のユーザー管理のカーネルは、ユーザー管理のカーネルと引数バッファーの設定 で説明するように、IP クラス (xrt::ip) を使用して見つける必要があります。

カーネル オブジェクトとバッファー オブジェクトを使用するには、ソースコードに次の 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()) が含まれます。スカラー引数の場合はバッファーが作成されないため、各カーネル バッファー引数にバッファー オブジェクトを割り当てます。