仅对英特尔可见 — GUID: xqi1615327346292
Ixiasoft
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. 流水线化有循环迭代的数据通路
Intel® HLS Compiler起初无法达到“II”为1时,就会从几种优化策略中进行选择:
这些优化由 Intel® HLS Compiler自动应用,此外还可以通过设计中的预处理指令语句进行控制。