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");