改善综合运行时间和容量 - 2023.2 简体中文

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

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

HLS 编译器会调度对象。无论对象是浮点乘法运算还是单寄存器,它都仍属于要调度的对象。浮点乘法可能需多个周期才能完成,并且使用大量资源来实现,但在调度层次上,它仍是对象。

HLS 编译器会按层级来调度运算。调度顺序如下:循环中的运算、其次循环,最后是函数中的子函数和运算。编译器的运行时间会在下列情况下增加:

  • 需调度的对象数量增加。
  • 有更大自由度和更多可能性可供探索。

展开循环和对阵列进行分区会创建更多需调度的对象并且可能增加运行时间。函数内联会在此层级创建更多需调度的对象,同样会增加运行时间。仅执行下列操作时,请务必谨慎处理:所有阵列的分区、所有循环的展开以及所有函数的内联操作。这些最优化可能是满足性能目标所必需的,但可以预见,综合运行时间会因此增加。请使用 HLS 编程指南 中探讨的最优化策略,并谨慎采用这些最优化。

如果必须展开循环,或者如果在上层层级中使用 PIPELINE 指令已自动展开循环,请考虑将循环主体作为独立函数来捕获。这将把所有逻辑捕获到单一函数内,而不是在展开逻辑时创建多个逻辑副本:在已定义的层级内调度一组对象速度更快。谨记,如果在流水打拍区域内使用展开的循环,请对此函数进行流水打拍。

代码自由程度同样会影响运行时间。请将 HLS 编译器视为设计专家,默认负责的任务是查找含最高吞吐量、最长时延和最小面积的设计。该工具所受约束程度越高,可供使用的选项越少,运行速度越快。请考虑对代码中的作用域使用时延约束:循环、函数或区域。设置所含最小值和最大值相同的 LATENCY 指令可以减少该作用域内可能的最优化搜索次数。