基于 FPGA的HLS技术与应用
1、hls简介
HLS ( high level synthesis )即高层次综合,主要是利用高级编程语言实现算法。
2、循环优化
约束语法:
#pragma HLS unroll
#pragma HLS PIPELINE II=1
绝大多数循环都以串行的方式执行,这种执行方式比较浪费时间。对于串行的循环有两种优化方式,转为 并行( Unroll ) 或者是 管道( Pipeline )。
并行分为以下几种:
数据并行:对不同的数据处理。
线程并行:多线程并发处理。
指令并行:同一时间执行多条指令。
管道并行:多条指令同时执行,但不同时间执行指令的不同部分。
其中,数据并行为最理想的循环执行方式;不过大多数时候数据存在复杂的依赖关系,常采用管道并行的循环执行方式。
3、性能度量
在软件开发领域,通过使用算法复杂度 O(n)进行度量;
在FPGA中,使用启动时间间隔( Initiation Interval ,II )进行度量;
1、II 表示每次迭代之间的时间间隔
2、理想情况下,II = 1
3、如果 II 非常大,说明 对应的代码不能在FPGA中被展开或者pipeline。
循环依赖
在循环过程中存在内存依赖或者数据依赖都会导致操作延时,例如下面代码就存在内存4、依赖
for( ... )
{A[x] = A[y] ;
}
这样的代码会导致 II 比较大,应为 A[x] 依赖于 A[y] ,对应的硬件必须等待对应的依赖关系完成之后才能完成。
4.1、 消除依赖
消除依赖是指通过算法优化或者一些技巧对 内存依赖 或者 数据依赖 进行消除,从而减小 II。
先看一段未经优化的代码:外层for每个 clk都会启动,而内层for需要外层的sum,导致循环变成串行结构。
int sum = 0 ;
for( i = 0;i < N;i++ )
{for( j = 0;j < N;j++ ){sum += A[i*N+j] ;}sum += B[i] ;
}
修改如下:对于内层的for增加一个sum2,使内层for和外层for之间没有依赖,从而使串行变成 unroll or pipeline执行流程,降低代码的 II 。
int sum = 0 ;
for( i = 0;i < N;i++ )
{int sum2 = 0 ; for( j = 0;j < N;j++ ){sum2 += A[i*N+j] ;}sum += sum2 ;sum += B[i] ;
}
4.2、 将 依赖放宽
先看一段未经优化的代码:假如执行一个乘的 II 为 6 ,该例存在数据依赖,消耗时间为 6N
float mul = 1.0f ;
for( i = 0 ;i < N ; i++ )
{mul = mul * A[i] ;
}
修改如下:
#include "learn_for.h"#define M 6
#define N 12void learn_for(uint32 A[10])
{int i ,j ;float mul = 1.0f ;float mul_copies[M] ;loop_initialized:for( i = 0 ; i < M ; i++ ){mul_copies[i] = 1.0f ;}loop_assign_mul_cur:for( i = 0 ; i < N ; i++ ){float cur = mul_copies[M-1] * A[i] ;loop_assign_copies:for( j = M - 1 ; j > 0 ; j-- ){#pragma HLS unrollmul_copies[j] = mul_copies[j-1] ;}mul_copies[0] = cur ;}loop_assign_mul:for( i = 0 ; i < M ; i++ ){#pragma HLS unrollmul = mul * mul_copies[i] ;}
}
循环展开的优点:
1、直接利用FPGA硬件,对循环内部逻辑进行复制
2、编译器会重新分析所有的依赖,允许编译器进行最大程度的代码优化
3、降低模块的延迟
4、提高资源的利用率
5、设置端口为bram端口
#pragma HLS BIND_STORAGE variable=out_data type=ram_1p impl=bram
#pragma HLS BIND_STORAGE variable=in_data type=ram_1p impl=bram
#pragma HLS INTERFACE mode=bram port=out_data
#pragma HLS INTERFACE mode=bram port=in_data
6、嵌套循环
编写嵌套循环时,需要注意的事项:
1、内层循环通常是影响性能的关键部分
2、通常情况下,大多数工作要置于内层循环
3、因 尽可能将内层循环的 II 接近 1
HLS代码优化的总体原则:
1、避免指针别名
2、最小化内存依赖
3、将嵌套循环改为单层循环
说明如下:
1、指针别名:是指多个不同的指针指向相同的内容。
注:
ARRAY_PARTITION :用于优化数组的存储和访问,将一个大数组分割成多个小数组,以提高并行处理能力和减少访问延迟。
相关文章:
基于 FPGA的HLS技术与应用
1、hls简介 HLS ( high level synthesis )即高层次综合,主要是利用高级编程语言实现算法。 2、循环优化 约束语法: #pragma HLS unroll #pragma HLS PIPELINE II1 绝大多数循环都以串行的方式执行,这种执行方…...
Redis原理:Monitor 实现
在调用 Redis 的 MONITOR 命令后,可以在对应的客户端上实时查看服务器的执行情况。今天,我们将从源码的角度来深入探讨 MONITOR 机制是如何处理这些请求以及如何将数据反馈给用户的。 MONITOR 命令的实现 Redis 中所有命令的具体实现细节都可以在其源代…...
计算机工具基础(七)——Git
Git 本系列博客为《Missing in CS Class(2020)》课程笔记 Git是一种分布式版本控制系统,被其跟踪的文件可被查询精细到行的修改记录、回退版本、建立分支等 模型 一般流程:工作区 → \to →暂存区 → \to →仓库(本地 → \to →远端) 工作区࿱…...
鸿蒙开发:父组件如何调用子组件中的方法?
前言 本文基于Api13 很多的场景下,父组件需要触发子组件中的某个方法,来实现一些特定的逻辑,但是ArkUI是声明式UI,不能直接调用子组件中的方法,那么怎么去实现这个功能呢? 举一个很常见的案例,通…...
23种设计模式-创建型模式-工厂方法
文章目录 简介场景问题1. 直接依赖具体实现2. 违反开闭原则3. 条件分支泛滥4. 代码重复风险 解决根本问题完整类图完整代码说明核心优势代码优化静态配置表动态策略 总结 简介 工厂方法是一种创建型设计模式,它提供了在父类中创建对象的接口,但允许子类…...
142. 环形链表 II——考察数学,难!
142. 环形链表 IIhttps://leetcode.cn/problems/linked-list-cycle-ii/ 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,…...
C++常见问题与思考
TLS(线程本地存储)原理 线程本地存储(Thread Local Storage,TLS)是一种机制,它允许每个线程拥有自己独立的变量实例,这些变量的生命周期与线程相同。也就是说,不同线程对同一个 TLS…...
从零开始:使用Luatools工具高效烧录Air780EPM核心板项目的完整指南
本文将深入讲解如何使用Luatools工具烧录一个具体的项目到Air780EPM开发板中。如何使用官方推荐的Luatools工具(一款跨平台、命令行驱动的烧录利器),通过“环境配置→硬件连接→参数设置→一键烧录”四大步骤,帮助用户实现Air780E…...
关于c++的几个简单算法
一. 动态规划(Dynamic Programming) 难点:状态转移方程的构建和初始化条件的设计 典型问题:01背包问题 分析: 状态定义 dp[i][j] 表示前i个物品放入容量为j的背包的最大价值。状态转移需要判断是否选择当前物品。 #i…...
WPF MergedDictionaries详解
在 WPF 中,ResourceDictionary.MergedDictionaries 是一个非常重要的特性,用于将多个资源字典(ResourceDictionary)合并到一个主资源字典中。这种机制使得资源的管理和复用变得更加灵活和高效。 1. MergedDictionaries 的作用 Me…...
一套云HIS系统源码,系统融合HIS与EMR,基于云端部署,采用B/S架构与SaaS模式
云HIS系统完全基于云端部署,采用B/S架构,并通过软件即服务(SaaS)的形式面向二级及以下医院可快速交付、便捷运维、云化的医院核心业务平台产品。融合医院HIS和EMR两大主营系统,构建涵盖患者、费用、医嘱、电子病历等核…...
DisplayPort(DP)详解
一、DisplayPort的定义与核心特性 DisplayPort(DP) 是由 视频电子标准协会(VESA) 制定的 高性能数字音视频接口,专为高分辨率显示器和多屏应用设计。其核心特性包括: 高带宽:DisplayPort 2.0支…...
C++数据结构(搜索二叉树)
1.二叉树搜索的概念 二叉搜索数也成为二叉排序树,它或者是一颗空树,或者是满足以下性质的树: 1.若他的左子树不为空,则左子树上的所有节点的值都小于等于根节点的值。 2.若他的右子树不为空,则右子树上的所有节点的值…...
OpenCV图像拼接(6)图像拼接模块的用于创建权重图函数createWeightMap()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::detail::createWeightMap 是 OpenCV 库中用于图像拼接模块的一个函数,主要用于创建权重图。这个权重图在图像拼接过程中扮演着重…...
Micropython RPI-PICO 随记-双PICO串口传数据
开发环境 MCU:双 Pico1(无wifi版),串口相连,需要共地使用固件:自编译版本开发环境:MacBook Pro Sonoma 14.5开发工具:Thonny 4.1.6开发语言:MicroPython 1.24.0 上位机…...
炫酷的HTML5粒子动画特效实现详解
炫酷的HTML5粒子动画特效实现详解 这里写目录标题 炫酷的HTML5粒子动画特效实现详解项目介绍技术栈项目架构1. HTML结构2. 样式设计 核心实现1. 粒子类设计2. 动画效果实现星空效果烟花效果雨滴效果 3. 鼠标交互 性能优化效果展示总结 项目介绍 本文将详细介绍如何使用HTML5 C…...
YoloV8训练和平精英人物检测模型
概述 和平精英人物检测,可以识别游戏中所有人物角色,并通过绘制框将人物选中,训练的模型仅仅具有识别功能,可以识别游戏中的视频、图片等文件,搭配Autox.js可以推理,实现实时绘制,但是对手机性…...
BC93 公务员面试
🚀个人主页:BabyZZの秘密日记 📖收入专栏:C语言练习题分享 🌍文章目入 #include <stdio.h> int main() {int score 0, max 0, min 100, sum 0, count 0; while (scanf("%d", &score) ! EOF){…...
3.0 Disruptor的使用介绍(一)
Disruptor: 其官网定义为:“A High Performance Inter-Thread Messaging Library”,即:线程间的高性能消息框架,与Labview的生产者、消费者模型很相似。 其组成部分比较多,先介绍几个常用的概念: …...
基础实验2-2.1 整数的分类处理
基础实验2-2.1 整数的分类处理 - 浙大版《数据结构学习与实验指导(第2版)》题目集 (pintia.cn) 给定 N 个正整数,要求你从中得到下列三种计算结果: A1 能被 3 整除的最大整数A2 存在整数 K 使之可以表示为 3K1 的整数的个数A3…...
[深度学习]图像分类项目-食物分类
图像分类项目-食物分类(监督学习和半监督学习) 文章目录 图像分类项目-食物分类(监督学习和半监督学习)项目介绍数据处理设定随机种子读取文件内容图像增广定义Dataset类 模型定义迁移学习 定义超参Adam和AdamW 训练过程半监督学习定义Dataset类模型定义定义超参训练过程 项目介…...
有价值的面试问题
迅雷一面 都是c和网络问题 了解epoll吗?解释下水平触发和边缘触发,医院的叫号系统应该算哪一种 c类a有成员b,成员b调用了a的函数,但是a不小心把b的成员删除了,会发生什么,怎么解决 c类a有一个static的函数…...
禁用ONLY_FULL_GROUP_BY模式
这是由于MySQL启用了ONLY_FULL_GROUP_BY模式导致的。以下是禁用该模式的三种方法,结合你的需求选择最合适的方案: 一、临时禁用(重启后失效) 1. 当前会话禁用 直接在SQL客户端执行以下命令,仅对当前数据库连接有效&…...
SAP 获取RFC的WSDL文件
主要是CPI要用到WSDL文件做mapping,客户的SAP服务器不一定直接可在浏览器访问http或者https的地址,所以在SAP里面开发程序内部调用地址获取WSDL文件 *&---------------------------------------------------------------------* *& Report YXX_…...
SQLite优化实践
1. 启用写入批处理 使用事务将多条插入操作包装在一起,这样可以减少磁盘I/O和日志的写入。 BEGIN TRANSACTION; -- 执行多个INSERT语句 COMMIT;通过将多个插入操作包装在一个事务中,可以显著减少每次写入数据库时的磁盘I/O操作。 2. 使用更大的页大小…...
56.fm解调最简单的方法过零检测,如何确定计时器的更新速率
,...
java8循环解压zip文件---实现Excel文件数据追加
java8循环追加Excel数据 实际遇到问题:定期获取zip文件,zip文件内有几个固定模板的Excel文件,有的Excel文件可能还包含多个sheet。 有段时间一次性获取到好几个zip包,需要将这些包都解压,并且按照不同的文件名、sheet进…...
基于SpringBoot的电影售票系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
SQL Server 2022 安装问题
一、安装与配置问题 1. SQL Server 2022 安装失败怎么办? 常见原因: 硬件或操作系统不满足最低要求(如内存、磁盘空间不足)。未关闭防火墙或杀毒软件。之前版本的 SQL Server 残留文件未清理。 解决方案: 确保硬件配…...
MySQL 8.0.41安装教程(附安装包)mysql8.0.41图文详细安装教程
文章目录 前言一、MySQL 8.0.41下载安装包二、MySQL 8.0.41安装教程1.启动安装程序2.选择安装模式3.选定安装组件4.确认安装设置5.执行安装操作6.安装进行中7.设置数据库密码8.继续点击下一步9.执行配置操作10.完成配置11. 再次点击下一步12.结束安装向导 三、MySQL 8.0.41配置…...
