结论 - 性能良方 - 2023.2 简体中文

Vitis 高层次综合用户指南 (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 简体中文

本文档中所演示的设计概念具有一个主要的核心原则,即并行计算模型倾向于通过状态封装和模块化单元或任务内的顺序执行来为并行编程提供更简单的编程模型。随后,任务将与串流相连(以执行同步和通信)。每个串流均可包含不同类型的通道,例如,FIFO 或 PIPO。状态/逻辑区隔化使工具(例如编译器和调度器)能够更加轻松地理清何时何地需要运行应用的哪些部分。基于串流的处理方式日渐流行的另一个原因是,它打破了传统多线程“分叉/连接”模型基于并行执行的观点。通过启用任务级流水打拍和指令级流水打拍,运行时可执行的并发操作数量远远超过了分叉/连接模型现今所能执行的操作数量。这种附加的并行性对于充分利用现今 FPGA 器件上可用的硬件而言至关重要。与启用流水线并行性如出一辙的是,串流同样支持设计师构建并行应用,而无需担心锁定、争用条件等可能导致并行编程无从着手的问题。

最后,建议您依据以下高层次操作检查表为标准,在可重配置 FPGA 平台上实现所期望的性能:

  • 专为 CPU 编写的软件与专为 FPGA 编写的软件有着本质上的不同。要想编写可在 CPU 平台与 FPGA 平台之间进行移植的代码,性能牺牲是不可避免的。因此,FPGA 软件与 CPU 软件的编写方式差异巨大,与其抗拒这个事实,不如坦然接受。
  • 从工程伊始,就应该建立起能够对源代码更改进行功能性验证的流程。基于参考模型或者使用黄金矢量来测试软件是极为常用的实践。
  • 首先专注于设计的宏架构。并考虑使用生产者使用者范例来对解决方案进行建模。
  • 明确设计的宏架构后,即可绘制出期望的活动时间线,其中以横轴表示时间,并显示您期望在多次迭代(或调用)过程中执行每一项功能相对于其他功能的时间。这样您就能够对设计中期望的并行性了然于胸,后续即可用于与最终达成的结果进行比较。HLS GUI 通常可用于直观显示所达成的并行度。
  • 仅当您已掌握宏架构并确立活动时间线之后,再开始进行程序编码或重构。
  • 一般,HLS 编译器仅根据函数调用来推断任务级别并行度。因此,需要在硬件中并发运行的顺序代码块(例如循环)应置于专用函数内。
  • 将原始算法分解/分区为较小的组件,这些组件可通过串流来彼此进行通信。这样您就能在一定程度上掌握数据在设计中流动的方式。
    • 较小的模块化组件的优势在于,可以按需进行赋值,从而提升并行性。
    • 请避免通信通道的位宽过宽。将此类宽通道分解为较窄些的通道,这样有助于在 FPGA 器件上实现。
    • 大型函数(手写或通过内联较小的函数生成)可能包含重要路径,工具可能难以处理此类路径。具有更简单的控制路径的小型函数有助于 FPGA 器件上的实现。
    • 目标是在每个函数内包含单个循环嵌套(可采用 HLS 工具可推断的固定循环边界,或者手动向 HLS 工具提供循环次数信息)。这样可以显著促进吞吐量的测量和最优化。此方法虽然可能不适用于所有设计,但对于大部分案例都很有效。
  • 吞吐量 - 纵观全局,掌握设计每个阶段期间所需的处理速率,这一点至关重要。这会影响您为 FPGA 编写应用的方式。
    • 思考设计中的关键路径(例如,关键任务级别路径,如,ABD 或 ACD),调查此关键路径中哪个部分可能成为瓶颈。通过设计仿真,观察哪几个任务采用流水打拍,以及任一路径的不同分支是否在吞吐量方面存在不一致。随后,可使用 HLS GUI 工具和/或仿真波形查看器来直观显示此类吞吐量问题。
    • 基于串流的通信允许使用者在生产者开始生产时立即开始处理,由此即可支持重叠执行(从而提升并行性和吞吐量)。
    • 为了使生产者和使用者任务保持持续不间断运行,请使用流水打拍和调整串流的相应大小等方法来对每项任务的执行进行最优化,使其能尽快运行。
  • 请思考串流通道的同步粒度(和开销)。您可使用 PIPO 通道来重叠任务执行,而无需担心死锁,显式手动串流 FIFO 通道支持您(比 PIPO)更快开始重叠执行,但请谨慎处理 FIFO 大小调整,以避免死锁。
  • 了解有关可综合的 C/C++ 编码样式的更多信息。
  • 使用 HLS 编译器生成的报告作为指导来完成最优化进程。

请将上述检查表放在附近,以便随时参考。它总结了构建能满足您的性能目标的设计所需的整个设计活动。

设计的另一个需要考量的重要方面在于您的加速函数或内核。内核连接外部的接口是最终系统设计的重要要素。您的内核可能需要插入更大的设计或者与更大的内核系统中的其他内核进行通信,或者与系统外部的存储器或器件进行通信。利用 M_AXI 接口进行设计的最佳实践 提供了另一份检查表,以供您在设计加速内核的外部接口时考量其中所列出的各项内容。