赛灵思提供了 OpenSource XRT API 用于在对 Linux 主机代码进行编程时控制 PL 内核的执行。
用于控制 PL 内核的 XRT API 的执行模型如下:
- 获取器件句柄并加载 XCLBIN。按需获取
uuid
。 - 分配缓冲器对象并映射到主机存储器。处理来自主机存储器的数据,并将其传输到器件存储器。
- 获取内核与运行句柄、设置内核实参并启动内核。
- 等待内核完成。
- 将数据从器件中的全局存储器传回主机存储器。
- 主机代码继续处理主机存储器中的新数据。
使用本机 XRT API 时,主机应用如下所示。
1.// Open device, load xclbin, and get uuid
auto dhdl = xrtDeviceOpen(0);//device index=0
xrtDeviceLoadXclbinFile(dhdl,xclbinFilename);
xuid_t uuid;
xrtDeviceGetXclbinUUID(dhdl, uuid);
2. Allocate output buffer objects and map to host memory
xrtBufferHandle out_bohdl = xrtBOAlloc(dhdl, output_size_in_bytes, 0, /*BANK=*/0);
std::complex<short> *host_out = (std::complex<short>*)xrtBOMap(out_bohdl);
3. Get kernel and run handles, set arguments for kernel, and launch kernel.
xrtKernelHandle s2mm_khdl = xrtPLKernelOpen(dhdl, top->m_header.uuid, "s2mm"); // Open kernel handle
xrtRunHandle s2mm_rhdl = xrtRunOpen(s2mm_khdl);
xrtRunSetArg(s2mm_rhdl, 0, out_bohdl); // set kernel arg
xrtRunSetArg(s2mm_rhdl, 2, OUTPUT_SIZE); // set kernel arg
xrtRunStart(s2mm_rhdl); //launch s2mm kernel
// ADF API:run, update graph parameters (RTP) and so on
……
4. Wait for kernel completion.
auto state = xrtRunWait(s2mm_rhdl);
5. Sync output device buffer objects to host memory.
xrtBOSync(out_bohdl, XCL_BO_SYNC_BO_FROM_DEVICE , output_size_in_bytes,/*OFFSET=*/ 0);
//6. post-processing on host memory - "host_out"
完成数据后处理之后,释放已分配的对象:
graph.end();
xrtRunClose(s2mm_rhdl);
xrtKernelClose(s2mm_khdl);
xrtBOFree(out_bohdl);
xrtDeviceClose(dhdl);
重要: 完成
graph.end()
后,AI 引擎内核将不再恢复。graph.end()
API 会等待 graph 终止。当 graph 的所有活动处理器都退出其 main 线程并禁用自身后,此 graph 即被视为已终止。这对于 PS 应用属于阻塞运算。graph.end()
还会清除 graph 的状态,例如强制释放所有锁定和清除 graph 中使用的串流交换机配置。要多次运行 graph,请将 graph.end()
替换为 graph.wait()
。