主机编程最佳实践 - 2023.2 简体中文

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

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

Vitis 环境中,可使用 Xilinx Runtime (XRT) 本机 C++ API 以 C++ 语言来编写主机应用。正如内核代码需重构后才能在硬件上启用并行度和最优化存储器访问一样,主机编程对于确保性能显著高于 CPU 同样至关重要。您可凭借经最优化的内核来满足所需性能,但如果 CPU 和 FPGA 使用率不够高,则应用性能就无法达到最优化。创建主机程序时的部分注意事项如下所述:

  • 减少内核排队开销:主机先将命令和实参分派给内核,随后进行内核排队,这其中存在开销。通过最大程度减少需由主机进行排队的内核数量,即可降低此开销的影响。
  • 最大程度提升主机与器件之间的数据传输带宽:主机与器件存储器之间的数据传输应足够大到能够最大程度发挥 PCIe 带宽。与此同时,缓冲器不应过大,以便发起内核执行。
  • 内核计算的数据可用性:主机应尽快将数据发送至 FPGA 存储器,以便发起计算,并使内核免于因数据可用性而出现数据匮乏。
  • 使数据传输与内核计算重叠:诸如数据库分析或视频等应用所含的数据集大小远超加速器件上可用的全局器件存储器中可存储的量。这就要求以块的形式来处理数据。将数据传输与计算加以重叠的技巧对于为这类应用实现高性能而言,显得至关重要。

您可能需要尝试为主机与器件存储器之间的数据移动设置不同的缓冲器大小,以便最优化应用性能。Vitis 工具可供您使用仿真目标探索性能以获取估算的性能结果,并最终在硬件上运行应用以获取准确的性能结果。运行应用后,您可使用 Vitis 分析器来直观显示主机与 FPGA 存储器之间的数据移动以及内核与器件存储器之间的数据移动。

以下快照是基于 Vitis 分析器的“Analysis”(分析)视图中对应主机应用时间线的“Timeline Trace”(时间线轨迹)而生成的。此视图的横轴上将数据移动显示为“时间”以便识别任何可能改善性能的机会。

图 1. 时间线轨迹(主机应用时间线)

“Data Transfer:Read”(数据传输:读取)行会显示何时主机从器件存储器读取数据,“Data Transfer:Write”(数据传输:写入)则显示何时主机将数据写入器件存储器。“Kernel Enqueue”(内核排队)行显示何时执行内核。

正如内核内部达成的任务级并行度一样,在主机与 CPU 之间也可以达成类似的并行度。通过启用该设置,CPU 与 FPGA 可同时保持处于活动状态以实现高性能。进行主机编程时,您需要思考通过何种方式使 FPGA 与 CPU 同时保持繁忙。这通常属于算法的属性,设计师必须审慎编写主机程序,才能最大程度利用 FPGA 和 CPU。

通过观察以上“应用时间线”可以轻松发现 CPU 保持空闲的间隙。同样,当主机传输数据时,FPGA 保持空闲。因此,主机程序需尽快将数据馈送给器件存储器,以免 FPGA 上的内核出现数据匮乏。此处从主机向 CPU 一次性发送了一个大型缓冲器,以供 CPU 用于计算。FPGA 保持空闲直至数据完成传输至器件存储器。当 FPGA 执行计算函数时,CPU 会保持空闲。对于此应用,无需发送大型缓冲器,应用可通过使主机传输与内核计算保持重叠来生成更好的结果。

图 2. 改善时间线

在主机侧执行更改,将数据拆分为多个区块,这样即可尽早发起内核计算,并且可隐藏主机与 FPGA 之间的数据传输。FPGA 上的主机数据传输和加速功能现在即可并行运行,从而改善整体应用性能。在 Bloom 筛选器教程中对此技巧进行了解释和演示。

Vitis 分析器并非仅限于显示时间线轨迹,还可提供有关剖析的应用指南,并显示含时序和资源信息以及设计中的关键路径的综合报告。如需了解更多信息,请参阅 使用“Analysis”视图 (Vitis Analyzer)

如需了解有关主机编程的更多信息,请参阅 XRT 本机 API示例 - 主机程序与内核执行的重叠