前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >HLS案例分析:数组求和(1)

HLS案例分析:数组求和(1)

作者头像
Lauren的FPGA
发布2019-10-30 18:52:45
发布2019-10-30 18:52:45
1.5K0
举报
文章被收录于专栏:Lauren的FPGALauren的FPGA

采用高层次综合(HLS)时既要关注Directive(也就是Pragmas)的设置,也要关注代码风格。而且,有时从代码层面对设计进行优化往往会更有助于获得期望的性能。我们来看一个例子,如下图代码所示。

这个例子很简单,完成的就是数组所有元素的和,需要说明的是这里数组长度为1024,数据类型DIT为float。浮点和定点的加法是不一样的。

采用HLS综合,solution1:不添加任何Directive;Solution2:对for循环设置Pipeline,结果对比如下。可以看到即便是Solution2,Interval也达到了5123。

为了降低Latency,改善Interval,我们先从代码层面着手。

第一次优化

优化后的代码如下图所示。

这里,嵌套的for循环完成的操作如下图所示。tmp[0]完成din[0], din[8], …,din[1016]的和;tmp[1]完成din[1], din[9], …, din[1017]的和,依此类推。

同时,设置如下Directives:将数组tmp打散;嵌套for循环的外层设置pipeline;将第二个for循环展开(Unroll)。

创建两个Solution:Solution1:不添加任何Directive;Solution2:添加上述三个Directives,综合后的性能对比如下图所示。可以看到优化后的代码,其Interval已经从5123降到了693。

还可以注意到,两个for循环之间(嵌套的for循环和第二个独立的for循环)可以应用DATAFLOW,从而可进一步降低Latency和Interval。

第二次优化

进一步优化,将第二个for循环手工展开,如下图所示。

Directive的设置:将数组tmp打散;嵌套for循环的外层设置pipeline。此时,综合后的性能如下图所示。

第三次优化

将第二个for循环手工展开,并同时利用括号实现两两相加,如下图所示。

此时,Interval进一步降低至668。

由此,可以得出一个这样的结论:

相比于 float s =(a+b+c+d), float s =((a+b)+(c+d))可获得更好的性能。

可以看到,第一次代码优化外加一些Directives可获得最佳的性能,而第二次代码优化和第三次代码优化并没有带来性能的明显改善。那么是否可以不修改代码而只是设置Directive来获得更好的性能呢?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Lauren的FPGA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档