本节总结三类的directivs:
- 针对优化数据吞吐率的;
- 针对降低Latency;
- 针对改善资源的。
最后结合Cordic算法介绍如何使用directives以改善数据吞吐率。
1.优化数据吞吐率
主要就是提高并行度
1.1 PIPELINE
PIPELINE既可以针对函数也可以针对循环。两者有什么差异呢?
当PIPELINE针对于函数时,从I/O操作看,操作时是连续的。而当PIPELINE针对于循环时,本次循环与下次循环之间是有空档的,从I/O角度看的话,有一个Bubble,这一段时间是没有操作的。
2. Latency的优化
注意:
用Latency指令来针对循环,那它指的是一次循环。如果想要完成整个循环的total latency,那么就需要指定循环的区域,先要做一个region的设置。
3.优化资源(Optimizing for Area)
案列分析:Cordic
Codic算法本质上是通过一系列的微旋转来实现超越函数,比如正余弦函数Sin/Cos()。在这个过程中,微旋转变成了移位操作。
通过这种方式计算三角函数。如果这里X0 = 1/An ,y0 = 0 ,最后就可以得到正余弦结果。这里要求z0的取值范围是-99到99,这里进一步缩小到-Pi/2到Pi/2 ,对于-Pi到Pi的区间需要先进行预处理,把它映射到-Pi/2到Pi/2,得到结果后在做后处理得到真正的 结果。