VIVADO HLS数组的优化

  • 参考文献
  • 项目简述
  • 数组的分割
  • 对数组采用Partition展开操作
    • 对一维数组采用Partition展开操作
    • 对多维数组采用Partition展开操作
  • 数组的映射和重组
    • 数组的MAP
    • 数组的ARRAY_RESHAPE
  • 总结

参考文献

[1]、lauren的FPGA(微信公众号)
[2]、Xilinx暑期学校

项目简述

前面一篇文章,我们已经进行了讲解软件程序中最重要的两个指标是时间复杂度、空间复杂度。上面循环语句的优化主要体现在时间复杂度的优化,那么这篇文章我们将着重于空间复杂度的优化。时间复杂度体现在循环语句上面,而空间复杂度则体现在数组上面,所以这篇文章我们将讲解VIVADO HLS数组的优化。但是需要注意的是,我们并不是为了少使用FPGA的资源,而是为了设计更高的性能,因为HLS最主要的贡献也在加速上面,如果速度上不来,就失去了原来的意义。

数组的分割

这里首先从一个例子说明数组优化的重要性,

首先从1中的代码可以看出是对数组的累加赋值操作,从2中分析的结果可以看出HLS软件将数组mem自动优化成双端口ram,但是输出sum依然是单端口ram,这就严重限制了编译之后的latency,但是将输出sum的单端口ram改成了双端口ram,同时将loop循环展开,可以看出HLS的性能得到了很大程度的改善。由此可见,HLS中数组时大多数编译中性能的瓶颈,决定了HLS跑的快慢。

对数组采用Partition展开操作

对一维数组采用Partition展开操作

如下图:

1,2,3都采用了Partition对数组进行了展开,这里主语对于多维数组,dim的设置哦很重要,由于这里是一维数组只能选择为1.也要注意Block与Cyclic的作用,这里Cyclic是比较常用的。进行编译之后的比较如下:

上面Partition的个数取决于数据流的个数。

对多维数组采用Partition展开操作

对于多维数组dim的指定如下:

举一个使用Partition优化多维数组的例子如下:

结果如下:

数组的映射和重组

数组的MAP

MAP:意思是将C语言中比较小的数组映射成一个数组,从而减少FPGA内部资源的用量。
Horizontal Mapping示意图如下:

这里的名字很重要。

Vertical Mapping示意图如下:

数组的MAP与Partition一起使用的例子如下:

这样一拆一和可以让数组节省资源的条件下获得一定的数据吞吐率。

数组的ARRAY_RESHAPE

ARRAY_RESHAPE:将数组的Partition与纵向的MAP结合在一起。
原理如下:

举一个实际的例子如下:


从上面可以看出MAP可以获得资源的节省,ARRAY_RESHAPE可以获得吞吐率的提高。

总结

创作不易,认为文章有帮助的同学们可以关注、点赞、转发支持。为行业贡献及其微小的一部分。对文章有什么看法或者需要更近一步交流的同学,可以加入下面的群:

VIVADO HLS数组的优化相关推荐

  1. Vivado HLS 中DATAFLOW优化Bypass的一些问题

    最近在项目开发中使用到了DATAFLOW优化数据流,从而提高整个系统的运行效率.在设计程序时,发现虽然在官方的文档中明确指出Bypass的情况需要通过打节拍的方式处理掉,否则会出现错误,但在实际的程序 ...

  2. Vivado HLS常用优化命令介绍

    HLS 简介 Xilinx Vivado HLS工具可以将用户使用C++编写的逻辑自动转化为硬件语言(如Verilog或VHDL语言)编写的RTL级硬件逻辑,目的是为了让软件工程师将算法快速部署在FP ...

  3. Vivado HLS(High-level Synthesis)笔记一:HLS基本流程

    前言 实验室项目需要,需要将在服务器段跑出的网络参数配置到FPGA上,一种方法是直接利用verilog或者vhdl直接去写一个网络的前向传播模型,另一种就是用 C/C++ 来描述网络的前向传播模型,然 ...

  4. Vivado HLS 入门实验

    当我们安装好Vivado 的时候,也同时装好了Vivado HLS.. 这是个什么东西?我就有一种想一探究的感觉.网上一查,Vivado High-Level Synthesis.学习了一段时间的Zy ...

  5. Vivado HLS加速卷积层运算

    源代码链接:https://github.com/happyday22/HLS_accelerator 1.Introduction 卷积神经网络(CNN)主要由卷积层.池化层.全连接层和激活层等网络 ...

  6. FPGA硬件加速学习 vivado hls --------------- 002

    参考如下链接: https://github.com/xupsh/pp4fpgas-cn 简介 需要充分理解 内存层级和带宽.空间局部性与时间局部性.并行结构和计算与存储之间的取舍和平衡. 可参考UC ...

  7. HLS for循环优化 dataflow_有疑问

    有依赖关系,无法用合并. 对于有依赖关系的数据流,可以使得一有输出就执行,提高交叠率,降低了 latency,提高了数据吞吐率. .数据流优化就是在三个循环之间插入 Channel(可以是 Ping- ...

  8. Vivado HLS基本应用

    Vivado HLS基本应用 1.双击Vivado HLS图标 2.创建工程可以,点快捷键或者从File->创建新工程 3.填写工程名和工程存放路径 3.添加主函数名,添加文件(如果有需要的话) ...

  9. Vitis初探—1.将设计从SDSoC/Vivado HLS迁移到Vitis上

    〇.前言 2020.11.25日,Xilinx更新了Vitis2020.2版本.正好之前报名里Xilinx的自适应计算挑战赛,比赛要求使用Vitis平台进行开发,所以今天趁着新版本发布把我之前参加DA ...

  10. 如何在zynq中调用并驱动vivado HLS生成的ip core

    vivado HLS 为赛灵思开发的高层次综合工具,可实现直接使用 C,C++ 以及 System C 语言对Xilinx的FPGA器件进行编程.赛灵思官方给出了ug902文档,很详细的介绍了官方提供 ...

最新文章

  1. 五连阳回调买入法_“4连阳+1阴”这种股票,吃透主升浪!挣得万贯家财
  2. LeetCode Swap Nodes in Pairs
  3. R eentrantLock的源码分析
  4. 酒鬼随机漫步(一个矢量类)
  5. spring boot输出hello world几种方法
  6. 坚果pro2s android 8,锤子坚果Pro2S 安卓8.1 稳定版 超级流畅 火力全开 智能调频 省电稳定 优化简约...
  7. mysql xtrabackup 遭遇严重bug
  8. _attribute_((packed))
  9. Highcharts双饼图使用实例
  10. 背包形动态规划 fjutoj2375 金明的预算方案
  11. ubuntu执行python脚本_在启动时运行python脚本作为守护进程(Ubuntu)
  12. MinGW-w64的安装及配置教程
  13. 3dmax2016软件一打开文件就程序错误的原因及解决方法
  14. MFC基于对话框程序启动时隐藏窗口的实现
  15. 见面会 | 创新工场执行董事王嘉平:高性能可伸缩性区块链系统揭秘!
  16. 网站被攻击如何修复网站漏洞
  17. mybatis中只查询部分字段的处理方式
  18. java毕业生设计中学线上作业评判系统计算机源码+系统+mysql+调试部署+lw
  19. ClickHouse快速安装-可视化工具连接-创建第一个ck库表(一)
  20. 数字冰雹-智慧监所可视化分析决策系统

热门文章

  1. java基础巩固-宇宙第一AiYWM:为了维持生计,JVM_Part4~(4种垃圾收集算法(标清、标整、复制、分代)、判断是否是垃圾(引用计数、根可达算法))、四种引用类型、整起
  2. An Underwater Image Enhancement Benchmark Dataset and Beyong
  3. kali 暴力破解 WiFi破解+fluxion安装使用(保姆级超详细)
  4. 中国第一代***骄傲
  5. cocos2d-x : csb的加载
  6. python-26-字典:当索引不好用时
  7. Java带宽限速器、Springboot限速器
  8. C语言程序——输入三角形的边长求面积
  9. JAVA--计算长方体、四棱锥的表面积和体积
  10. 「笔耕不辍」zookeeper的节点加密方式及分布式锁实现过程