Learning HLS(1)-the for loop(1)

在使用HLS的过程中,时常需要向设计中添加directives来指导从C->RTL的翻译方向,for循环是最最常用的程序结构之一,关于for循环的优化涉及到很多技术。文档的学习(UG902,有中文档哦)是一个重要的方法,但在这里也有一个不错的学习视频来讲解HLS,这就是这一系列博客的主要素材来源。

对HLS下的for循环做一个学习总结,演示文稿截图来自Lauren Gao的HLS讲解,视频链接如下。
HLS-for循环基本性能指标
首先是一些重要指标的定义,结合代码和右侧图示来理解:
在这里插入图片描述
特别注意latency和Iteration Inteval(II)的区别,前者就是我们说的“耗时”的概念,也就是执行某个循环或函数所耗费的时间,而后者则更偏向于描述吞吐量,也就是从一次读入样本数据到下一次读入样本数据中间所经过的时间(II = latency + 下一次读数据的时间?)。
对代码进行综合和联合仿真,得到如下的性能报告和波形图:
在这里插入图片描述
注意因为循环边界的判断,需要额外耗费一个时钟周期。
1.对循环的第一种优化就是循环流水化,这是将循环中的操作从时间上重叠起来并行执行从而节省时间的,流水化之后确实缩短了latency和II:
在这里插入图片描述
将流水化之后的循环综合并生成报告,可以得到如下的仿真波形图:
在这里插入图片描述
2.第二种对循环的优化方法是循环展开:
在这里插入图片描述
默认情况下,循环是闭合的,也就是默认只产生一份对应循环功能的硬件电路,串行的trip count次来实现循环的功能。循环展开则是将一个循环电路拷贝为多份相同的电路,并行的跑循环逻辑来加快速度,这个过程是典型的空间(FPGA资源)换时间(吞吐量)的策略。

下图是部分循环展开的示例,trip count是6,完全展开的话应该复制完全相同的循环电路6份,一次跑6个循环电路,部分切分下只分为三份电路(factor=3),每个电路跑两遍。右上角的橘黄色点表示电路跑的两遍中循环变量i的取值,这是C语言的形象描述,并不代表真实的硬件电路。
在这里插入图片描述
将展开后的代码进行综合,可以看见确实耗用了更多的FPGA资源:
在这里插入图片描述
最后补充说明,循环变量的类型不影响资源的开销:
在这里插入图片描述
本讲总结如下:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值