此时,开发者已经创建了一个数据流架构,其中包含数据运动和处理函数,旨在维持内核的吞吐量目标。下一步是确保每个处理函数的实现方式均能提供期望的吞吐量。
如前所述,函数吞吐量的测量方式是将处理的数量除以函数的时延或运行时间。
T = max(VINPUT, VOUTPUT) / 时延
在本方法论中所述的“由外到内”分解过程的该阶段,函数所耗用和生成的数据量和目标吞吐量都应已知。这样,开发者即可轻松得到每个函数的时延目标。
Vitis HLS 编译器生成有关函数和循环的吞吐量和时延的详细报告。确定目标时延后,HLS 报告即可用于确定哪些函数和循环不满足其时延目标且需要注意,如 HLS 综合报告 中所述。
循环的时延可按如下方式计算:
LatencyLoop = (Steps + II x (TripCount – 1)) x ClockPeriod
其中:
- Steps
- 单循环迭代的持续时间,以时钟周期数来度量
- TripCount
- 循环中的迭代次数。
- II
- 启动时间间隔,两次连续迭代开始之间的时钟周期数。当循环未流水打拍时,其 II 等于步数 (Steps)。
假设时钟周期已给定,有三种方法可以减少循环的时延,从而提高函数的吞吐量:
- 减少循环中的步数(缩短每次迭代的执行时间)。
- 减少循环次数,以便减少循环执行的迭代数量。
- 缩短启动时间间隔,以便提升循环迭代启动频率。
假设循环次数远大于步数,将 II 或循环次数减半可足以使循环的吞吐量加倍。
了解此信息是最优化循环并使时延超过其目标的关键。默认情况下,Vitis HLS 编译器将尝试以尽可能低的 II 生成循环实现。首先看看如何通过减少循环次数或步数来改善时延。