FPGA学习笔记#6 Vitis HLS For循环的优化(2)

news2024/11/13 20:30:05

本笔记使用的Vitis HLS版本为2022.2,在windows11下运行,仿真part为xcku15p_CIV-ffva1156-2LV-e,主要根据教程:跟Xilinx SAE 学HLS系列视频讲座-高亚军进行学习


学习笔记:《FPGA学习笔记》索引
FPGA学习笔记#1 HLS简介及相关概念
FPGA学习笔记#2 基本组件——CLB、SLICE、LUT、MUX、进位链、DRAM、存储单元、BRAM
FPGA学习笔记#3 Vitis HLS编程规范、数据类型、基本运算
FPGA学习笔记#4 Vitis HLS 入门的第一个工程
FPGA学习笔记#5 Vitis HLS For循环的优化(1)
FPGA学习笔记#6 Vitis HLS For循环的优化(2)
FPGA学习笔记#7 Vitis HLS 数组优化和函数优化
FPGA学习笔记#8 Vitis HLS优化总结和案例程序的优化


目录

  • 1.循环优化中的基本参数
  • 2.PIPELINE & UNROLL
  •     2.1.PIPELINE
  •     2.2.UNROLL
  • 3.LOOP_MERGE

1.DATAFLOW

1.1.DATAFLOW的使用场景

当循环之间、函数之间、线程之间有顺序数据依赖,可以考虑使用DATAFLOW优化,考虑以下情况:

可以很明显地看出,B依赖A计算得到的x[i],C依赖B计算得到的y[i],三个任务形成了如图所示的关系:

此时我们可以考虑使用DATAFLOW,作用于循环所在函数,对应配置为#pragma HLS DATAFLOW:

优化后,三个循环间的关系如图所示,循环之间使用管道、FIFO、寄存器等进行数据传输,每个Loop只需要每轮完成计算后将结果送入数据通道,即可开始下一轮计算,后一个Loop等待到通道传来数据就可以开始计算。

与PIPELINE的不同:

PIPELINE:对于一个循环内多个循环次数之间的优化
	例如一个循环中每次循环涉及读-计算-写三步,则在操作间无依赖时可以进行流水线,让三个步骤都各自连续执行
DATAFLOW:对于循环间/函数间/线程间的优化
	例如上方的Loop A-B-C,下一个Loop的输入是上一个Loop的输出,则DATAFLOW可以让三个循环都各自连续执行

1.2.DATAFLOW编程约定

1.2.1.Single-producer-consumer Model

一个输出(write)对应一个输入(read),多个consumer依赖同一个producer时,DATAFLOW不成立,以如下代码为例,loop2和loop3同时使用了temp1的数据,如果是图中的情况,那么硬件层面上会产生读冲突,如果使用FIFO,那么temp1只能被读取一次。

此时如果想启用DATAFLOW,那就需要添加一个中间件,其读取一个输入,并写到两个输出,如下图中的loop_copy循环:


1.2.2.Bypassing Tasks Model

Loop1输出temp1和temp2,Loop2读取temp1,输出temp3,Loop3读取temp2和temp3,这样也是不能启用DATAFLOW的:

启用思路:在Loop2将Bypass的数据读取并复制一份。


2.嵌套For循环

2.1.嵌套For循环的优化逻辑

对于嵌套For循环,首先我们要确定什么样的For循环更适合被优化。

首先如下图所示,内外循环的循环上限均为固定值的循环为perfect loop,这是嵌套优化的最理想状况;内部上限为固定值,而外部为变量的为semi-perfect loop,这种情况也是可以优化的。

对于不理想的嵌套循环有两种,第一种是内外部上限均为固定值,但有语句写在循环之间的,如下图中的LOOP_BODY所处位置;第二种是内部上限为变量,外部为固定值的。这两种情况被称为imperfect loop。

那么我们优化的流程就很明显了:perfect/semi-perfect loop就直接优化,imperfect loop就先尝试转变为perfect/semi-perfect loop,如果不能,再考虑直接对imperfect loop进行优化。


2.2.perfect/semi-perfect loop优化

对于可优化的嵌套循环,我们可以考虑对For循环进行PIPELINE优化,如下图为一个perfect loop

对嵌套循环的不同层进行PIPELINE优化存在差异,如下图是默认情况、给内层添加PIPELINE、给外层添加PIPELINE的结果。

给内层添加PIPELINE时,会进行FLATTEN操作,将外部循环2次执行4次内部循环展平为执行8次循环。
给外层添加PIPELINE时,会将内部所有循环进行UNROLL,然后统一进行PIPELINE,可以看到给外层添加PIPELINE时,乘法器使用了4个,共执行2次循环。


2.3.imperfect loop优化

如果想要优化的循环是任意一种形式的imperfect loop,那么我们最好先考虑将其转化为perfect/semi-perfect loop,如果无法转化,那么我们要知道直接优化会带来怎样的结果。

以下图所示的imperfect loop为例,在Col循环和Product循环之间多了一个res[i][j]=0的重置操作,这使得Col->Product是imperfect的。


2.3.1.最内层PIPELINE

首先,在最内层的Product打上PIPELINE。从debug信息,我们可以看到HLS会将外层Row展平,但因为Col->Product是imperfect的,所以Col无法执行Flatten。

最终可以看到Flatten之后,Row和Col展平为9次循环,然后每次循环执行Product循环:


2.3.2.中间层PIPELINE

然后,对Col层打PIPELINE。通过debug信息,可以看到HLS将内部所有循环做UNROLL,然后对本次与外层进行FLATTEN。

最终得到的结果是执行一个9次的循环,每次循环将Product的操作一轮执行完。


2.3.3.最外层PIPELINE

最后,对Row层打PIPELINE。通过debug信息,可以看到HLS将Row内部所有子循环都进行了UNROLL操作。

最终,函数会执行Row的三次循环,内部会将Col和Product的操作一次性执行完毕,消耗的乘法器变为9个。


2.3.4.对函数进PIPELINE

根据上面三次优化,很自然的可以想到再进一步将Row循环也UNROLL可以换取更高的效率,那么我们直接对其所在函数打PIPELINE,得到的DEBUG信息如下,三个循环都被UNROLL了:


2.3.5.优化结果

通过对比四次优化的结果,很明显PIPELINE越往外性能越高,但同时资源消耗也成倍上涨,对于任意循环打PIPELINE时,HLS会对其子循环进行UNROLL,对其外层非imperfect loop进行FLATTEN。


3.其他For优化

3.1.函数多次实例化

对于一个函数内多次调用另一个函数的情况,如下图,HLS默认会分时复用该函数,即串行执行。

我们可以使用ALLOCATION约束,这个约束会增加函数的实例化数量,对loop_sequential添加directive如下,其中limit是最多实例化个数。

#pragma HLS ALLOCATION instances=Accumulator limit=2 function

在生成信息中,我们可以看到HLS为该函数生成了两个实例。


3.2.循环之间的间隔

如下图,多次调用同一个函数,并且该函数只有一个循环时,循环之间会产生间隔,此时可以使用PIPELINE中的rewind参数:

#pragma HLS PIPELINE rewind

便可以将循环之间的间隔消除:

注意,一个函数包含多个Loop的情况下不能进行rewind优化


3.3.自动PIPELINE

在config_compile中配置,只要一个for循环的循环边界小于等于pipeline_loops配置的值,那么编译时就会HLS就会自动进行PIPELINE。

在启用自动PIPELINE时,如果某些符合条件但不想PIPELINE的,可以配置:

#pragma HLS PIPELINE off

3.3.Latency的确定

当循环边界是变量时,Vivado无法确定latency,设计的性能未知

此时可以采取以下方案:

1.使用trip count directive,不做优化,只用于报告的显示和比较

#pragma HLS LOOPTRIPCOUNT min=4 max=8 avg=6

2.定义循环边界为ap_int<>或ap_uint<>(在自减时要注意无符号)

3.使用断言assert

#include <assert.h>
assert(width < 5)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2238103.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MTK6833/MT6833(天玑700)安卓核心板_联发科5G智能通讯模块安卓主板定制

天玑700定位主流级&#xff0c;让5G技术惠及所有人。 MT6833采用7nm制程工艺&#xff0c;旨在为大众市场带来先进的5G功能和体验&#xff0c;依托5G双载波聚合技术&#xff08;2CC&#xff09;及双5G SIM卡功能&#xff0c;实现优异的功耗表现及实时连网功能。 CPU部分由2个2…

Spring Boot框架的知识分类技术解析

2 开发技术 2.1 VUE框架 Vue.js&#xff08;读音 /vjuː/, 类似于 view&#xff09; 是一套构建用户界面的渐进式框架。 Vue 只关注视图层&#xff0c; 采用自底向上增量开发的设计。 Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。 2.2 Mysql数据库 …

面试:TCP、UDP如何解决丢包问题

文章目录 一、TCP丢包原因、解决办法1.1 TCP为什么会丢包1.2 TCP传输协议如何解决丢包问题1.3 其他丢包情况&#xff08;拓展&#xff09;1.4 补充1.4.1 TCP端口号1.4.2 多个TCP请求的逻辑1.4.3 处理大量TCP连接请求的方法1.4.4 总结 二、UDP丢包2.1 UDP协议2.1.1 UDP简介2.1.2…

关于我、重生到500年前凭借C语言改变世界科技vlog.17——字符函数字符串函数

文章目录 1.字符函数1.1 字符分类函数1.1.1 islower 1.2 字符转换函数1.2.1 tolower 2.字符串函数2.1 strlen2.2 strcpy和strncpy2.3 strcat和strncat2.4 strcmp和strncmp2.5 strstr2.6 strtok2.7 strerror 希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力&am…

可视化建模与UML《类图实验报告》

史铁生&#xff1a; 余华和莫言扛着我上火车&#xff0c; 推着走打雪仗&#xff0c; 还带我偷西瓜&#xff0c; 被人发现后他们拔腿就跑&#xff0c; 却忘了我还在西瓜地里。 一、实验目的&#xff1a; 1、熟悉类图的构件事物。 2、熟悉类之间的泛化、依赖、聚合和组合关系…

基于梧桐数据库的实时数据分析解决方案

一、背景 在当今信息时代&#xff0c;数据的价值不言而喻。然而&#xff0c;处理海量数据并将其转化为有意义的洞察力是一项艰巨的任务。传统的数据处理方法已经无法满足我们日益增长的需求。为了满足这一挑战&#xff0c;实时数据处理系统应运而生。 ​ 实时数据处理系统是一…

javascript实现国密sm4算法(支持微信小程序)

概述&#xff1a; 本人前端需要实现sm4计算的功能&#xff0c;最好是能做到分多次计算。 本文所写的代码在现有sm4的C代码&#xff0c;反复测试对比计算过程参数&#xff0c;成功改造成sm4的javascript代码&#xff0c;并成功验证好分多次计算sm4数据 测试平台&#xff1a; …

jmeter常用配置元件介绍总结之jsr223执行python脚本

系列文章目录 安装jmeter jmeter常用配置元件介绍总结之jsr223执行python脚本 1.安装jsr223执行python插件2.基础语法介绍2.1.log2.2.parameters向脚本传参与接参2.3.vars2.4.props2.5.prev 3.常用脚本3.1.MD5加密单个参数&#xff1a;3.2.MD5加密多个参数&#xff1a;3.3.URLe…

【MongoDB】MongoDB的聚合(Aggregate、Map Reduce)与管道(Pipline) 及索引详解(附详细案例)

文章目录 MongoDB的聚合操作&#xff08;Aggregate&#xff09;MongoDB的管道&#xff08;Pipline操作&#xff09;MongoDB的聚合&#xff08;Map Reduce&#xff09;MongoDB的索引 更多相关内容可查看 MongoDB的聚合操作&#xff08;Aggregate&#xff09; 简单理解&#xff…

快速了解SpringBoot 统一功能处理

拦截器 什么是拦截器&#xff1a; 拦截器是Spring框架提供的重要功能之一&#xff0c;主要进行拦截用户请求&#xff0c;在指定方法前后&#xff0c;根据业务需求&#xff0c;执行预先设定的代码。 也就是说,允许开发⼈员提前预定义⼀些逻辑,在⽤⼾的请求响应前后执⾏.也可以…

百兆网络变压器在无人机系统起到什么作用

华强盛电子 导读&#xff1a; 百兆网络变压器&#xff08;通常指的是100M Ethernet Transformer&#xff09;在无人机系统中扮演着重要的角色&#xff0c;尤其是在网络通信和电气隔离方面 1.电气隔离 网络变压器通过提供电气隔离&#xff0c;帮助保护无人机的电子设备免受电流…

在双显示器环境中利用Sunshine与Moonlight实现游戏串流的同时与电脑其他任务互不干扰

我和老婆经常会同时需要操作家里的电脑&#xff0c;在周末老婆有时要用电脑加班上网办公&#xff0c;而我想在难得的周末好好地Game一下&#xff08;在客厅用电视机或者平板串流&#xff09;&#xff0c;但是电脑只有一个&#xff0c;以往我一直都是把电脑让给老婆&#xff0c;…

【Vue】Vue3.0(十七)Vue 3.0中Pinia的深度使用指南(基于setup语法糖)

上篇文章&#xff1a; 【Vue】Vue3.0&#xff08;十一&#xff09;Vue 3.0 中 computed 计算属性概念、使用及示例 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Vue专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年11月10日15点23分 文章…

深度学习基础练习:从pytorch API出发复现LSTM与LSTMP

2024/11/5-2024/11/7&#xff1a; 前置知识&#xff1a; [译] 理解 LSTM(Long Short-Term Memory, LSTM) 网络 - wangduo - 博客园 【官方双语】LSTM&#xff08;长短期记忆神经网络&#xff09;StatQuest_哔哩哔哩_bilibili 大部分思路来自于&#xff1a; PyTorch LSTM和LSTMP…

【芯智雲城】Sigmastar星宸科技图传编/解码方案

一、图传技术简介 图传是指将图像或媒体内容从一个设备传输到另外一个设备的技术&#xff0c;传输的媒介可以是无线电波、光纤、以太网等。图传系统主要由图像采集设备、传输设备和接收设备组成&#xff0c;图像采集设备负责采集实时图像&#xff0c;传输设备将采集到的图像转…

JavaFX史上最全教程 - Shape - JavaFX矩形椭圆

avaFX Shape类定义了常见的形状&#xff0c;如线&#xff0c;矩形&#xff0c;圆&#xff0c;Arc&#xff0c;CubicCurve&#xff0c;Ellipse和QuadCurve。 在场景图上绘制矩形需要宽度&#xff0c;高度和左上角的&#xff08;x&#xff0c;y&#xff09;位置。 要在JavaFX中…

【Windows修改Docker Desktop(WSL2)内存分配大小】

记录一下遇到使用Docker Desktop占用内存居高不下的问题 自从使用了Docker Desktop&#xff0c;电脑基本每天都需要重启&#xff0c;内存完全不够用&#xff0c;从16g扩展到24&#xff0c;然后到40G&#xff0c;还是不够用&#xff1b;打开Docker Desktop 运行时间一长&#x…

使用QLoRA和自定义数据集微调大模型

大家好&#xff0c;大语言模型&#xff08;LLMs&#xff09;对自然语言处理&#xff08;NLP&#xff09;的影响是非常深远的&#xff0c;不仅提高了任务效率&#xff0c;还催生出新能力&#xff0c;推动了模型架构和训练方法的创新。尽管如此强大&#xff0c;但LLMs也有局限&am…

Mac M1 Docker创建Rocketmq集群并接入Springboot项目

文章目录 前言Docker创建rocketmq集群创建rocketmq目录创建docker-compose.yml新增broker.conf文件启动容器 Springboot 接入 rocketmq配置maven依赖修改appplication.yml新增消息生产者新增消费者测试发送消息 总结 前言 最近公司给配置了一台mac&#xff0c;正好有时间给装一…

golang分布式缓存项目 Day2

注&#xff1a;该项目原作者&#xff1a;https://geektutu.com/post/geecache-day1.html。本文旨在记录本人做该项目时的一些疑惑解答以及部分的测试样例以便于本人复习。 支持并发读写 接下来我们使用 sync.Mutex 封装 LRU 的几个方法&#xff0c;使之支持并发的读写。在这之…