HLS——六、数据类型优化

一、简介
demo
在这里插入图片描述

(AC)数据类型
- 来自Apache许可下的Mentor Graphics
-HLS工具附带的用户指南
- <path_to_HLS_installation>/include/ref/ac_datatypes_ref.pdf
-
模板类,允许实例化任意大小的整数和任意精度定点数据类型
英特尔®HLS编译器支持ac_int和ac_fixed
英特尔®HLS编译器附带的两个实现
-ref / ac_int.h,ac_fixed.h:Mentor Graphics *参考实现
-HLS / ac_int.h,ac_fixed.h:针对HLS的Intel优化实现
1、在Intel® HLS编译器中使用ac_int
在这里插入图片描述
2、特定精度的定点数包含在ac_fixed
支持AC 特定精度的定点数包含在ac_fixed.h中
AC定点的变量声明
ac_fixed<N, I, signed-ness, Q, O>
-N:总长度
-I:数据位宽用于代表整形数据,可以>N或者小于0
–N-I=bits代表小数部分
-signed-ness:true=signed,false=unsigned
-Q:量化模式(可选),各种舍入和截断选项
-Q:溢出模式(可选),各种饱和度选项
ac_fixed_math.h中ac_fixed类型的数学库
在这里插入图片描述
使用示例:
在这里插入图片描述
3、ac数据操作
1.运算
在这里插入图片描述
2.强制转换
转换为有符号和无符号的C类型
在这里插入图片描述
3.位切割
位选择操作符:[]

切片读取:slc(n)
-读取以LSB n结尾的M位

切片写入:set_slc(n, <ac_intvalue used to set>)
-要设置的宽度(M)是可选的
- 如果未设置,则由值类型确定宽度
在这里插入图片描述
4.自动进位
加法运算自动进位
-用户负责存储容器
在这里插入图片描述
5.高效的bit移位
在移位中,移位的参数是有符号数
在硬件中,移位数是有符号的,左移或者右移都是可以的
在这里插入图片描述

如果移位一直是一个方向,则将shift量声明为无符号数据类型
在这里插入图片描述
使用类型转换和printf
在这里插入图片描述
在这里插入图片描述

二、编译和优化
1、溢出检查
英特尔®HLS编译器提供了在模块仿真期间检查ac_int操作和溢出分配的工具
添加 #define 或者 i++ -D
-使用额外的开销
DEBUG_AC_INT_WARNING
-对检测到的每个溢出发出警告
DEBUG_AC_INT_ERROR
-在溢出时,发出消息然后退出模块并显示错误。
2、浮点编译器优化
由于舍入,浮点运算不可交换或关联。
– 比如: (a + b) + c != a + (b + c)
默认情况下,i ++遵循用户指定的顺序,并在中间操作期间适当地保留舍入。
为了节省空间并可能改善延迟:
-如果排序可以放宽,则使用添加 --fp-relaxed 编译
-如果不需要中间舍入,则使用–fpc进行编译
-尽可能删除中间舍入和转换

3、平衡树
默认情况下,编译器不会重新排序浮点运算
可能会在流水化中造成不平衡,带来时间延迟和可能的资源损失
在这里插入图片描述
使用–fp-relaxed平衡树
允许i++重新排序,改变为一个树流水线的结构
- 可能影响精度
- 设计者需要容忍浮点结果的微小差异
在这里插入图片描述
树平衡和资源节
在这里插入图片描述
4、舍入操作
对于一系列浮点运算,IEEE 754需要多个舍入操作
四舍五入可能需要大量的硬件资源
兼容的浮点操作
-在浮点运算树的末尾只执行一轮
-获得更准确的结果
-其他处理器架构支持某些融合指令,如融合乘法和累加(FMAC)
- i++可以融合任何浮点运算符的组合

使用–fpc减少舍入操作
尽可能删除浮点舍入操作
- 在操作树的末尾只进行一次浮点运算
- 适用于*,+和 -
加载额外的尾数位以保持精度
- 通过计算得出额外的位,在操作树的末尾删除

在这里插入图片描述
三、优化注意事项
1、避免复杂的函数(如果可能的话
复杂函数可能:
-降低性能
-需要大量硬件资源去实现
-增加循环中的启动间隔
例子
-整数除法和模(余数)运算符
- 除加法,乘法,绝对值和比较之外的大多数浮点运算
确保算术表达式的两侧都是相同的类型
- 避免复杂的转换运算符
2、简单的函数
尽可能代替复杂的函数
- 对模块性能的影响最小
- 使用最少的硬件资源
Examples
- 逻辑运算,如AND,NAND,OR,NOR,XOR和XNOR
- 具有一个常量参数的逻辑运算
- 按常量移位
- 整数乘法和2的常数次的除法
- 位交换(尾数法调整)
3、使用最小的复杂数据类型
理解每种数据类型在延迟和逻辑使用方面的成本
- 逻辑使用双精度是浮点操作的4倍
- 浮点和双精度的操作延迟比定点类型要大很多
量化或限制范围和精度(如果可能的话)
-熟悉数据类型的宽度、范围和精度
-使用半精度或单精度代替双精度(默认)
-使用定点/整数代替浮点数
-不要使用浮点如果短整形足够
4、浮点与定点的称述
与浮点表示相比,定点实现总是使用更少的逻辑
- 通过将操作转换为定点来节省硬件
如果所需的数据分辨率不是标准类型,使用适当的数据映射或AC数据类型来节省硬件
- 如果应用于大型设计中,节省是非常重要的
Intel®Arria®10和statix®10设备已经加固了浮点DSP
5、数据映射示例
需要17位整数数据分辨率
- 使用32位数据类型来存储值
- 通过使用静态位掩码避免为高15位生成硬件
- 结果:实现了17位加法而不是32位加法
在这里插入图片描述

6、算术运算注意事项
注意设备性能
默认浮点常数是双精度,使用f来指定单精度
- 例如:sinf(1.0f)
如果复杂的函数的结果不需要全精度,使用简单的算术操作来近似
- 例如:使用重复平方来代替pow(x,n)来节省硬件
- 了解各种功能的资源使用情况
- 考虑使用查找表
提前计算出常数
-在传递到模块函数之前在其他地方计算常数
四、优化库
HLS包含两个FPGA优化的库
- 矩阵乘法
- 随机数生成器
1、矩阵乘法
将两个二维矩阵A和B相乘,并返回一个二维矩阵C
在代码中包含如下库
- #include “HLS/matrix_mult.h”
下面的模板参数可以自己定制
- T:矩阵元素的数据类型
- t_rowsA:矩阵A中的行
- t_colsA:矩阵A中的列(必须等于矩阵B中的行)
- t_colsB:矩阵B中的列
- DOT_VEC_SIZE:单次计算中使用的DSP块数
随机数生成器
均匀或高斯随机数分布
– 使用函数RNG_Uniform 或者 RNG_Gaussian
接受可选种子值
在代码中包含库文件
– #include “HLS/rand_lib.h”

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值