HLS Learning P17 - Optimization-of-for-loop - Nested Loop
1. Three Types of Nested Loop
以第一种 Perfect loop nest 作为基础类型,根据循环边界是否为变量和循环体位置扩展出其他类型的 Nested Loop
- 循环变量是否为常数
- Semi-Perfect loop nest : 最外层循环体为变量
- Imperfect loop nest 2 : 最内层循环体为变量
- 循环体位置
- Imperfect loop nest 1 : 循环体位于内层和外层中间

2. Case 1 - Perfect Loop
以下面代码为例,是一个 Perfect Loop,这里 M = 2, N = 4。然后对比了三种 solution,分别是不做任何设置,只对内部 loop 做 pipeline 和只对外部 loop 做 pipeline。从 latency 上看对外部做 pipeline 是最小的,但 utilization 确实最大的,这是因为在外部 loop 做 pipeline 的话其下的所有 loop 都会被打开,可以看到这里 DPS48E 使用了 4 个。

对 inner loop 做 pipeline,可以理解成将两个 loop 展开(计算一共执行了多少次),得到的次数是 8。
使用 LOOP_FLATTEN 实现上面的结果,来将两个 loop collapsed into 一个,以提升 latency。这种方式只适用于 perfect 和 semi-perfect 。

3. Case 2 - Imperfect Loop
a. Innermost Loop
因为最内层 for 循环外面有循环体,所以这里不能使用上面的 LOOP_FLATTEN。因此可以看到这里的 Trip Count 是 9,然后 product 是 3 即执行最内部的 for 循环。

b. Sub-inner Loop
接下来看下如何对第二层 for 循环做流水,即 Col 对应的 for 循环。
注意 Unroll 和 LOOP_FLATTEN 是不一样的概念

c. Outer-most Loop

d. Comparison



4. Optimization

5. Summary

All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
