XRT 管理のカーネルの使用 - 2023.2 日本語

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

Document ID
UG1393
Release Date
2023-12-13
Version
2023.2 日本語

PL カーネルの実行は、カーネルの実行を開始して待機するメソッドをインプリメントする xrt::run というクラスに関連付けられています。カーネル オブジェクトとのほとんどのやり取りは、カーネルの実行を表すためにカーネルから作成された xrt::run オブジェクトによって実行されます。

run オブジェクトは、カーネル オブジェクトから明示的に構築することも、次のようにカーネルの実行を開始することで暗示的に構築することもできます。

std::cout << "Execution of the kernel\n";
auto run = krnl(bo0, bo1, bo_out, DATA_SIZE);
run.wait();

上記のコード例は、xrt::run オブジェクトを返すカーネルの引数のリストを含めて xrt::kernel() 演算子を使用し、カーネル実行を起動する方法を示しています。これは、run の開始後に返される非同期の演算子です。xrt::run::wait() メンバー関数は、run が完了するまで現在のスレッドをブロックするために使用されます。

ヒント: カーネルの実行が終了したら、必要に応じて xrt::run オブジェクトを使用して同じカーネル機能を再起動できます。
次のコードは、カーネルを実行する別の方法を示しています。
auto run = xrt::run(krnl);
run.set_arg(0,bo0); // Arguments are specified starting from 0
run.set_arg(0,bo1); 
run.set_arg(0,bo_out); 
run.start();
run.wait();

この例の場合、run オブジェクトはカーネル オブジェクトから明示的に構築され、カーネル引数は run.set_args() で指定され、run 実行は run.start() コマンドによって起動されます。現在のスレッドは、カーネルが終了するのを待つ間ブロックされます。

カーネルの実行が完了したら、次の例のようなコードを使用して、カーネルの結果をホスト アプリケーションと同期させることができます。

// Get the output;
bo_out.sync(XCL_BO_SYNC_BO_FROM_DEVICE);

// Validate our results
if (std::memcmp(bo_out_map, bufReference, DATA_SIZE))
   throw std::runtime_error("Value read back does not match reference");