使用 XRT 管理的内核 - 2023.2 简体中文

Vitis 统一软件平台文档 应用加速开发 (UG1393)

Document ID
UG1393
Release Date
2023-12-13
Version
2023.2 简体中文

PL 内核的执行与名为 xrt::run 的类相关联,该类用于实现启动和等待内核执行的方法。大部分与内核对象的交互都是通过 xrt::run 对象来完成的,这些对象是从内核创建的,用于表示内核的执行。

运行对象可根据内核对象来显式构造,或者可通过启动内核执行来隐式构造,如下所示。

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

以上代码示例演示的是使用 xrt::kernel() 运算符搭配返回 xrt::run 对象的内核实参列表来启动内核执行。这是异步运算符,在启动运行后返回。xrt::run::wait() 成员函数用于阻塞当前线程直至运行完成为止。

提示: 完成内核执行后,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.set_args() 指定的,运行执行则是由 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");