Intel®高层次综合编译器专业版: 最佳实践指南

ID 683152
日期 12/04/2023
Public
文档目录

3.3.3.1.2.1. 组件内的流水线循环

在组件内,循环是流水线并行性的主要来源。

Intel® HLS Compiler流水线化循环时,会尝试调度循环执行,以便循环的下一次迭代在上一次迭代完成之前进入流水线。该循环迭代流水线可以带来更高的吞吐量。

循环迭代之间的时钟周期数称为Initiation Interval (II)(启动间隔II)。

为了获得最高性能,循环迭代将在每个时钟周期开始,这样II对应为1。

从一个循环迭代到另一循环迭代的数据依赖关系可能会影响实现“II”为1 的能力。这些依赖关系称为循环携带的依赖关系

循环的“II”必须足够高才能容纳所有循环携带的依赖项。

提示: 满足该约束所需的“II”是设计的fMAX函数。如果fMAX越低,“II”也可能越低。相反,如果fMAX越高,可能需要更高的“II”。

Intel® HLS Compiler自动识别这些依赖关系,并尝试构建硬件来解决它们,同时根据目标fMAX最小化“II”。

单纯为流水线化有循环迭代的数据通路中的代码生成硬件会导致两次加载:一次来自存储器b,另一次来自存储器c。因为编译器知道对c[i-1]的访问在上一次迭代中为“写入”,而从c[i-1]来的负载可以被优化掉。

图 17. 流水线化有循环迭代的数据通路


上一个迭代中储存到 C的值所代表的以来关系会在单个时钟周期内解决,因此即使该迭代不是独立的,循环的“II”也会达到1。

关于流水线循环的其他信息,请参阅流水线循环

Intel® HLS Compiler起初无法达到“II”为1时,就会从几种优化策略中进行选择:

这些优化由 Intel® HLS Compiler自动应用,此外还可以通过设计中的预处理指令语句进行控制。