仅对英特尔可见 — GUID: ewa1462826976357
Ixiasoft
仅对英特尔可见 — GUID: ewa1462826976357
Ixiasoft
6. 组件中的循环
环路流水线

在某些情况下,完全不可能实现流水线。而在其它情况下,直到上一次迭代之后的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++) {...} |
预处理指令 | 描述 |
---|---|
disable_loop_pipelining | 防止编译器将循环流水线化, |
ii | 强制循环具有指定值的循环启动间隔(II)。 |
ivdep | 忽略此循环的迭代之间的存储器依赖关系。 |
loop_coalesce | 尝试将嵌套在此循环内的所有循环融合为单个循环。 |
loop_fuse | 指示编译器尝试将相邻的循环融合成对。 |
max_concurrency | 对于随时都能同时执行的循环,将限制其迭代次数。 |
max_interleaving | 控制内循环的一次调用中嵌套循环的流水线内循环迭代是否可以与内循环中其它调用的迭代在组件数据流水线中交错进行。 |
nofusion | 防止带注释的循环与相邻的循环融合。 |
speculated_iterations | 指定计算循环退出条件可用于计算的时钟周期数。 |
unroll | 完全展开循环或者按一定次数展开循环。 |
关于组件中实现循环和使用循环预处理指令时应遵循的最佳实践的教程列表,请参阅 Intel® High Level Synthesis Compiler最佳实践指南中的循环最佳实践。