文档目录

6. 组件中的循环

The Intel® HLS Compiler Pro Edition尝试通过流水线循环来最大化您定义的各个组件的吞吐量。

环路流水线

流水线循环使 Intel® HLS Compiler Pro Edition能够以流水线并行方式执行循环的后续迭代。流水线并行执行意味着循环中处于不同执行点的多个迭代可以同时执行。由于循环的所有阶段始终有效,因此流水线循环有助于最大化已生成硬件的用途。此循环流水线类似于Intel HLS Compiler硬件模式中描述的硬件流水线。
图 11. 具有三个阶段和四次迭代的流水线化循环在该图中,一个阶段就是逻辑运行的一个时钟周期。


在某些情况下,完全不可能实现流水线。而在其它情况下,直到上一次迭代之后的N个周期后,循环的新迭代才能开始。

循环迭代在开始之前必须等待的周期数称为循环的启动间隔(II)。此循环流水线状态可以在高层次设计报告(report.html)中获得。通常,II为1最理想。

其中II > 1通常是指循环的一部分以某种方式依赖于同意循环的上一次迭代而导致。电路必须等到这些循环依赖关系得到解决,然后才能开始循环的新迭代。优化报告中会指出这些循环依赖关系。

对于嵌套循环,如果关键的内部循环执行了大部分工作,则II > 1的外部循环执行效率不会被视为显著的性能限制因素。一个常见的性能限制因素是HLS 编译器无法静态计算内循环的行程计数(例如,可变的内循环行程计数)。如果不知道行程计数,则编译器就无法流水线化外循环。

关于循环流水线的更多信息,请参阅 Intel® High Level Synthesis Compiler最佳实践指南中的流水线循环

编译器预处理指令控制循环流水线

Intel® HLS Compiler具有几个预处理代码,可以在您的代码中指定这几个代码来控制编译器如何流水线化您的循环。

大多数循环预处理指令必须紧接在应用该指令的循环之前。循环指令不能位于循环上的标签等元素之前。下表显示了如何正确应用循环预处理指令的实例。
错误示范(产生编译时错误) 正确实例
#pragma ivdep
TEST_LOOP: for(int idx = 0; idx < counter; idx++) {...}
TEST_LOOP:
#pragma ivdep
for(int idx = 0; idx < counter; idx++) {...}
表 17.   Intel® HLS Compiler Pro版循环预处理指令总结
预处理指令 描述
disable_loop_pipelining 防止编译器将循环流水线化,
ii 强制循环具有指定值的循环启动间隔(II)。
ivdep 忽略此循环的迭代之间的存储器依赖关系。
loop_coalesce 尝试将嵌套在此循环内的所有循环融合为单个循环。
loop_fuse 指示编译器尝试将相邻的循环融合成对。
max_concurrency 对于随时都能同时执行的循环,将限制其迭代次数。
max_interleaving 控制内循环的一次调用中嵌套循环的流水线内循环迭代是否可以与内循环中其它调用的迭代在组件数据流水线中交错进行。
nofusion 防止带注释的循环与相邻的循环融合。
speculated_iterations 指定计算循环退出条件可用于计算的时钟周期数。
unroll 完全展开循环或者按一定次数展开循环。

关于组件中实现循环和使用循环预处理指令时应遵循的最佳实践的教程列表,请参阅 Intel® High Level Synthesis Compiler最佳实践指南中的循环最佳实践