利用 XRT API 控制 PL 内核 - 2022.1 简体中文

Versal ACAP AI 引擎编程环境 用户指南 (UG1076)

Document ID
UG1076
Release Date
2022-05-25
Version
2022.1 简体中文

赛灵思提供了 OpenSource XRT API 用于在对 Linux 主机代码进行编程时控制 PL 内核的执行。

用于控制 PL 内核的 XRT API 的执行模型如下:

  1. 获取器件句柄并加载 XCLBIN。按需获取 uuid
  2. 分配缓冲器对象并映射到主机存储器。处理来自主机存储器的数据,并将其传输到器件存储器。
  3. 获取内核与运行句柄、设置内核实参并启动内核。
  4. 等待内核完成。
  5. 将数据从器件中的全局存储器传回主机存储器。
  6. 主机代码继续处理主机存储器中的新数据。

使用本机 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()