仅对英特尔可见 — GUID: yyy1489604310598
Ixiasoft
1. Intel® HLS Compiler Pro版参考手册
2. 编译器
3. C语言和库支持
4. 组件接口
5. 组件存储器(存储器属性)
6. 组件中的循环
7. 组件并发
8. 任意精度数学支持
9. 组件目标频率(Target Frequency)
10. 任务系统
11. 库
12. 高级硬件综合控制
13. Intel® High Level Synthesis Compiler Pro版参考总结
A. 高级数学源代码库
B. 支持的数学函数
C. Cyclone® V限制
D. Intel® HLS Compiler Pro版参考手册存档
E. Intel® HLS Compiler Pro版参考手册修订历史
13.1. Intel® HLS Compiler Pro版i++命令行参数
13.2. Intel® HLS Compiler Pro版头文件
13.3. Intel® HLS Compiler Pro版编译器定义的预处理器宏
13.4. Intel® HLS Compiler Pro版关键字
13.5. Intel® HLS Compiler Pro版模拟API(仅测试台)
13.6. Intel® HLS Compiler Pro版组件存储器属性
13.7. Intel® HLS Compiler Pro版循环预处理指令
13.8. Intel® HLS Compiler Pro版范围预处理指令
13.9. Intel® HLS Compiler Pro版组件属性
13.10. Intel® HLS Compiler Pro版组件默认值接口
13.11. Intel® HLS Compiler Pro版组件调用接口控制属性
13.12. Intel® HLS Compiler Pro版组件宏
13.13. Intel® HLS Compiler Pro版技术性任务系统API
13.14. Intel® HLS Compiler Pro版管道API
13.15. Intel® HLS Compiler Pro版流输入接口
13.16. Intel® HLS Compiler Pro版流输出接口
13.17. Intel® HLS Compiler Pro版存储器映射接口
13.18. Intel® HLS Compiler Pro版加载-存储单元控制
13.19. Intel® HLS Compiler Pro版任意精度数据类型
仅对英特尔可见 — GUID: yyy1489604310598
Ixiasoft
6.3. 循环合并(loop_coalesce预处理指令)
使用 loop_coalesce预处理指令指示 Intel® HLS Compiler将嵌套循环合并为单个循环而不影响循环功能。通过指示编译器减少循环控制所需的开销而合并循环,从而有助于减少 组件的面积使用。
合并嵌套循环还可以减少 组件的延迟,从而进一步减少您 组件的面积使用。但是,在某些情况下,合并循环可能会延长关键循环启动间隔数据通路,因此合并循环可能并不适合所有 组件。
要合并嵌套循环,请指定以下预处理指令:
#pragma loop_coalesce <loop_nesting_level>
<loop_nesting_level>参数为可选,它是一个整数,指定编译器尝试合并嵌套循环的级数。如果您不指定<loop_nesting_level>参数,则编译器会尝试合并所有嵌套循环。
例如,考虑如下嵌套循环组:
如果您将预处理指令置于loop (A)前面,则这些循环的循环嵌套级数的定义如下:
for (A) for (B) for (C) for (D) for (E)
- Loop (A)的循环嵌套级别为1。
- Loop (B)的循环嵌套级别为2。
- Loop (C)的循环嵌套级别为3。
- Loop (D)的循环嵌套级别为4。
- Loop (E)的嵌套级别为3。
取决于您指定的循环嵌套级别,编译器尝试将不同程度地合并循环:
- 如果您在loop (A)上指定#pragma loop_coalesce 1,则编译器不会尝试合并任何嵌套循环。
- 如果您在loop (A)上指定#pragma loop_coalesce 2,则编译器会尝试合并loops (A)和(B)。
- 如果您在loop (A)上指定#pragma loop_coalesce 3,那么编译器会尝试合并loop(A),(B),(C)和(E)。
- 如果在loop (A)上指定#pragma loop_coalesce 4,那么编译器会尝试合并所有循环[loop (A) - loop (E)]。
要了解更多关于应用loop_coalesce循环预处理指令后不同效果的详细信息,请查看以下教程:
<quartus_installdir>/hls/examples/tutorials/best_practices/loop_coalesce
以下实例显示编译器如何将两个循环合并成单个循环。参考如下
以下实例显示编译器如何将两个循环合并成单个循环。
参考简单嵌套循环代码编写如下:
编译器将两个循环合并到一起,因此他们可以像单个循环一样运行,写作如下:
#pragma loop_coalesce for (int i = 0; i < N; i++) for (int j = 0; j < M; j++) sum[i][j] += i+j;
int i = 0; int j = 0; while(i < N){ sum[i][j] += i+j; j++; if (j == M){ j = 0; i++; } }