Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >HLS案例分析:数组求和(1)

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

作者头像
Lauren的FPGA
发布于 2019-10-30 10:52:45
发布于 2019-10-30 10:52:45
1.6K0
举报
文章被收录于专栏: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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
HLS案例分析:数组求和(2)
还是回到数组求和的案例。上一篇文章中,我们介绍了如何通过代码优化达到预期性能,主要采用的是将for循环展开的方式。那么,能否在不修改代码的前提下,通过设置合理的Directive达到此目的呢?我们按照如下所示的流程进行优化。
Lauren的FPGA
2019/10/30
1K0
理解Vitis HLS默认行为
相比于Vivado HLS,Vitis HLS更加智能化,这体现在Vitis HLS可以自动探测C/C++代码中可并行执行地部分而无需人工干预添加pragma。另一方面Vitis HLS也会根据用户添加的pragma来判断是否需要额外配置其他pragma以使用户pragma生效。为便于说明,我们来看一个简单的案例。
Lauren的FPGA
2022/12/21
8140
理解Vitis HLS默认行为
嵌入式HLS 案例开发步骤分享——基于Zynq-7010/20工业开发板(3)
本文主要介绍 HLS 案例的使用说明,适用开发环境: Windows 7/10 64bit、Xilinx Vivado
用户8594645
2023/01/02
6930
嵌入式HLS 案例开发步骤分享——基于Zynq-7010/20工业开发板(3)
嵌入式硬件开发学习教程——Xilinx Vivado HLS案例 (3)
本文主要介绍HLS案例的使用说明,适用开发环境:Windows 7/10 64bit、Xilinx Vivado 2017.4、Xilinx Vivado HLS 2017.4、Xilinx SDK 2017.4。
创龙科技Tronlong
2021/11/11
1.6K0
嵌入式硬件开发学习教程——Xilinx Vivado HLS案例 (3)
一个HLS Stream应用案例
对于顶层函数,如果形参类型为hls::stream,HLS会将其综合为ap_fifo类型的接口。
Lauren的FPGA
2019/10/30
1.6K0
Vivado-hls使用实例
本系列教程演示如何使用xilinx的HLS工具进行算法的硬件加速。分为三个部分,分别为HLS端IP设计,vivado硬件环境搭建,SDK端软件控制。
碎碎思
2020/06/30
2.6K0
Vivado-hls使用实例
一张图看懂HLS设计优化流程
那么b_vect[0 +: 8]和b_vect[15 -:8]分别选取b_vect的哪些位?
Lauren的FPGA
2019/10/30
1.5K0
PYNQ上手笔记 | ⑤采用Vivado HLS进行高层次综合设计
实验中文件中包含一个矩阵乘法器的实现,实现两个矩阵inA和inB相乘得出结果,并且提供了一个包含了计算结果的testbench文件来与所得结果进行对比验证。
Mculover666
2020/07/15
1.6K0
Vitis HLS 2022.1:如何阅读C Synthesis生成报告
相比于Vivado HLS,Vitis HLS在C Synthesis之后生成的报告内容更加丰富,更有利于工程师对设计进行分析。这里我们以Vitis HLS 2022.1为例,看看C Synthesis之后的报告都包含哪些内容。
Lauren的FPGA
2022/12/21
2K0
Vitis HLS 2022.1:如何阅读C Synthesis生成报告
Vivado HLS和Vitis HLS什么区别?
Vivado HLS 2020.1将是Vivado HLS的最后一个版本,取而代之的是VitisHLS。那么两者之间有什么区别呢?
Lauren的FPGA
2020/11/09
11.3K0
Vivado HLS和Vitis HLS什么区别?
嵌套的for循环,到底对哪个执行pipeline更好
嵌套的for循环在算法建模时经常遇到,那么采用Vitis HLS进行综合时,到底是对外层for循环还是内层for循环执行pipeline更好呢?我们来看一个简单的案例,如下图代码所示。
Lauren的FPGA
2020/08/18
2.4K0
嵌套的for循环,到底对哪个执行pipeline更好
一张图看懂Vivado HLS设计性能指标
面向C/C++的HLS设计在转化成RTL代码时,Vivado HLS会生成相应的综合报告。通常在报告中会看到这样的一些指标,例如:Latency、II(IterationInterval)、Loop Latency和Loop Interation Interval。往往这些指标成为设计的优化目标,例如,有些设计需要降低Latency,有些设计需要改善II。因此,了解这些指标的含义就显得非常重要。
Lauren的FPGA
2019/10/31
3.8K0
HLS中如何控制流水程度
Vivado HLS会自动决定函数内部操作的流水级数,但用户也可以通过其他方法控制流水程度。
Lauren的FPGA
2020/05/28
1.7K0
HLS通过ALLOCATION减少资源
Vitis HLS会自动探测算法中的并行性,尽可能将函数或逻辑并行执行以降低整体的Latency。例如,我们以如下函数为例。待综合的顶层函数loop_sequential包括两个for循环,这两个for循环彼此独立,不存在数据依赖关系(所谓数据依赖是指前者的运算结果给后者使用,换言之,前者写数,后者读数)。因此,Vitis HLS会将这两个for循环并行执行。这可在Schedule Viewer视图中确认。Vivado HLS在默认情况下则是将这两个for循环顺序执行,这是和Vitis HLS的差异。
Lauren的FPGA
2022/12/21
9630
HLS通过ALLOCATION减少资源
HLS中循环的并行性(1)
Vitis HLS尽可能地探测代码中的并行性,以降低Latency。但对于for循环,即使两个for循环是相互独立、毫无关联的,在默认情形下,工具也不会对其进行并行处理。那么针对这种情形,该如何让工具对其并行处理呢?
Lauren的FPGA
2020/06/30
1.6K0
再谈HLS之任务级并行编程
HLS的任务级并行性(Task-level Parallelism)分为两种:一种是控制驱动型;一种是数据驱动型。对于控制驱动型,用户要手工添加DATAFLOW pragma,工具会在该pragma指定的区域内判别任务之间的并行性,生成各进程之间的模块级控制信号。对于数据驱动型,用于需要明确指定可并行执行的任务。
Lauren的FPGA
2023/08/18
6570
再谈HLS之任务级并行编程
HLS最全知识库
高层次综合(High-level Synthesis)简称HLS,指的是将高层次语言描述的逻辑结构,自动转换成低抽象级语言描述的电路模型的过程。
碎碎思
2023/02/14
2.1K0
HLS最全知识库
HLS综合策略
Loop:rolled00 Array: BRAM Struct:被分解为成员变量 操作符:硬件核 优化策略 The Initial Optimizations INTERFACE DATA_PACK LOOP_TRIPCOUNT对综合没有影响,只是在报告中看循环次数Config Interface去除与顶层设计无关的 Pipeline for Performance PIPELINE减少了II(启动时间)DATA_FLOW使任务级流水线,允许函数和 同时循环执行。用来减少间隔 Directives
瓜大三哥
2018/02/26
1.5K0
Vitis HLS 2022.1新特性: performance pragma
Vitis HLS 2022.1新增了一个pragma名为performance,其施加对象是指定函数或循环。如果是循环,要求循环边界是固定常数,若循环边界是变量,则需要通过pragma TRIPCOUNT指定其取值范围。
Lauren的FPGA
2022/08/23
6910
Vitis HLS 2022.1新特性: performance pragma
SDAccel矩阵乘法优化(四)
现在经过前面两次优化后,代码的组织结构没有什么问题了,现在的关键问题是:矩阵运算的嵌套for循环仅仅实现了内层的pipeline,因为外层for循环无法对内部的for循环flatten,所以外面两层的for循环没有实现pipeline。要解决这个问题,最直接的思路就是将最内层的for循环直接进行循环展开,进一步提高计算过程的并行度。但是在进行循环展开的过程中,需要将内层用到的数组进行切割,否则将无法进行unroll。因此,我们将用到的指令有三个:内层for循环要进行循环展开(unroll),并行计算用到的数组要进行数组切割(array partition),次外层的for循环要流水起来(pipeline)。
AI异构
2020/07/29
1.3K0
SDAccel矩阵乘法优化(四)
相关推荐
HLS案例分析:数组求和(2)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档