引言

由于卷积核数据在计算过程中保持不变,更新较慢。这样就可以利用LUT来存储权重并同时进行乘法运算。LUT乘法器的实现很早就已经研究过,本论文正是在此基础上,提出了用于实现可配置的卷积实现方法。基于LUT的乘法器不会受到FPGA中DSP资源的限制,能够将神经网络加速应用于低端FPGA芯片。

01

LUT乘法器的实现

一个LUT有固定的输入和输出管脚,例如在xilinx的zynq系列器件中,LUT有5个输入1个输出或者4个输入两个输出。如何用LUT来实现任意大小的乘法运算呢?这里用到了一个基本的数学法则:因式分解。考虑一个补码数据x,其有Bi bit,那么表示为:

如果这个数被一个常数c乘,这个乘法可以被分解为更小bit的乘法,然后对这些小份乘法进行位移和求和。

这样就将一个BcxBi bit的乘法分解成多个BcxL的乘法,而这个小的乘法就可以去利用LUT来实现。将L设置为LUT的输入引脚数量,可以直接将乘法映射到LUT上,并且对LUT资源利用效率最高。

02

Compressor加法树

上述乘法的分解造成了大量的加法,因此需要较大的加法树来完成各个乘法结果移位后的累加。基于Generalized parallel counters(GPC)充分利用了FPGA中的LUT资源以及进位链,可以更好的映射到LUT上,减少LUT使用的浪费。其主要特点就是在一个LUT中实现最多个全加器的运算,这样能保证进位链最短,LUT资源利用率最高。

图2.1 乘法分解求和

03

可配置LUT

LUT是一个查找表,FPGA中对代码逻辑的映射都是映射到查找表中。现代的LUT有个特点就是可以进行动态配置,意味着可以在运行中去更新查找表的值。比如在xilinx的virtex,spartan和zynq器件中LUT就可以通过移位寄存器的方式来更新内部数据,32个时钟周期完成。这样就可以将卷积核数据存放在LUT中,然后在需要更新的时候进行更新。

04

可配置卷积的硬件架构

卷积运算的结构如图4.1所示,N个输入数据(x1, x2, .., xN)每个和c的乘法都被分解为K个乘法,然后将所有的部分乘法结果移位送入加法树。每个BcXL的乘法需要的LUT数量大致为Bc+L个。加法树输出的Bo位宽会远远大于输入位宽,因此需要进行rouding或者截位。

图4.1 基于LUT的卷积运算结构

论文中使用了LUT4输入2输出,使用4输入LUT而不是5输入是因为乘法分解的特点,4bit位宽对于16bit,8bit整型乘法来说更能充分利用LUT资源。这样N个输入数据的每个部分乘法总共花费的LUT数量就是:

乘法和加法导致输出Bo位宽变大,需要减小位宽。论文采用了faithful rouding的办法。比如输入是12bit的数据,要求输出也要截位成12bit,如果在最后求和之后再进行截位,加法树中就因为计算多余位数求和而浪费LUT。如果每个乘法结果都截位为12,那么会造成最后结果精度较大丢失。如果先对每个乘法结果截位大于12bit的数据,根据总共求和的个数可以计算出需要保留的bit位数。这样就能够保证最后加法结果精度等于或者小于直接截位加法结果的精度。比如开始对每个乘法截位2^(-q-g),因为总共有N*Bi/L个部分积结果。所以总共的精度损失为:

通过限制总精度损失在需要范围:

这样就可以得到g的数据。这样就能最大程度减少LUT的使用同时能保证良好精度。

图4.2 3个输入x,bit位宽12bit,分解为4个乘法,输出要求12bit

现在来看如何对LUT进行数据的更新。由于将LUT用作4输入2输出,那么一个LUT可以计算出2bit结果的乘法。于是计算需要的每个个LUT的一部分用于和weights的偶数部分进行乘法,而另一部分用于和weights的奇数部分乘法。而LUT的配置接口只有一个CDI,因此就需要分别对LUT的这两部分进行配置。论文中先计算对应奇数部分weights的乘法结果,存储到LUT中,然后计算对应偶数部分weihts的乘法,存储到LUT中。

图4.3 动态配置LUT电路图

从上述架构中可以看到,当进行LUT配置的时候,LUT是无法进行计算的。这个很好解决,可以通过增加双倍LUT来实现,对没有计算的LUT来进行动态配置,而另一部分LUT进行计算。这样相当于进行了ping-pong操作。

图4.4 双LUT结构进行计算

05

结果

下图给出了不同卷积核大小以及不同位宽所需要的资源对比。相比于其他使用LUT来进行乘法和加法操作的方式来说,这样更能最大化利用LUT资源。

图5.1 综合后资源对比

总结

论文中提出的可配置卷积运算架构,可以改善CNN在FPGA的应用。充分利用了LUT资源,可以更好的改善时序性能。

文献

1 Hardieck, M., et al., Reconfigurable Convolutional Kernels for Neural Networks on FPGAs, in Proceedings of the 2019 ACM/SIGDA International Symposium on Field-Programmable Gate Arrays - FPGA '19. 2019.

往期回顾

1 用LUT来搭建乘法器

2 在FPGA中实现高效的compressor加法树

3 可变位宽的大规模矩阵乘法方法

公众号

AI加速

用FPGA做有趣的事

postgres 把一个表的值转成另一个表的字段名_用LUT来做一个可动态配置的卷积核...相关推荐

  1. FANUC机器人_通过ROBOGUIDE从零开始做一个离线仿真项目(1)

    FANUC机器人_通过ROBOGUIDE从零开始做一个离线仿真项目(1) 打开ROBOGUIDE软件,如下图所示,然后点击新建工作单元, 如下图所示,选择"HandlingPRO" ...

  2. postgres 把一个表的值转成另一个表的字段名_Postgres索引那些事

    本文转自Greenplum中文社区官方网站:greenplum.cn: 最实时最权威的Greenplum技术文档.博客,以及热点新闻,请关注greenplum.cn: Postgres内部提供了很多种 ...

  3. postgres 把一个表的值转成另一个表的字段名_希望一个数据同步,包治百病

    小姐姐味道[ID:xjjdog] 作者:十年架构,日百亿流量经验,与你分享. 哎!这是一个脏活,而且是个高风险的活. 大多数情况下,应用架构设计不好,引入什么新存储,引入什么DDD,治标不治本,都是扯 ...

  4. postgres 把一个表的值转成另一个表的字段名_Phoenix系列创建Phoenix映射表

    目前,在公司小部分的业务场景中有用到 Phoenix,但也仅限基于 Phoenix 的二级索引机制来进行查询上的优化.虽然使用的频次不大,但偶尔用到时,有些语句的使用方式和注意事项总记不太熟,每次都需 ...

  5. mysql join 去重_MySQL Update inner join数据库去重,以及根据一张表的值更新另一张表...

    1 问题来源 这几天在项目中遇到一个问题:由于前期设计不合理,导致后期用户录入数据时,基础数据表中有重复多余数据.如下: 出现两个 2G网络测试手机 这样类似的基础数据,直接后果就是用户在使用这个基础 ...

  6. bootstraptable 怎么在特定行添加数据_手把手教你做一个“渣”数据师,用Python代替老情人Excel...

    大数据文摘出品 来源:medium 编译:张大笔茹 十年前,你说你是做数据的,大家的反应就是 -- 用 Excel 做做表. 现在,要成为一个合格的数据分析师,你说你不会 Python,大概率会被江湖 ...

  7. linux目录表及功能n鸟哥,鸟哥linux私房菜_笔记_Linux的文件权限与目录配置

    5.1 使用者与群组 1. 文件拥有者: 2. 群组概念: 3. 其他人的概念: Linux 使用者身份与群组记录的文件 默认的情况下,所有的系统上的帐号与一般身份使用者,还有那个root的相关信息, ...

  8. opencv交通标志识别_教你从零开始做一个基于深度学习的交通标志识别系统

    教你从零开始做一个基于深度学习的交通标志识别系统 基于Yolo v3的交通标志识别系统及源码 自动驾驶之--交通标志识别 在本文章你可以学习到如何训练自己采集的数据集,生成模型,并用yolo v3算法 ...

  9. python制作聊天机器人原理_用 Python 来做一个聊天机器人吧!(一)

    在我的一个回答里,我提到了用 Python 搭建聊天机器人.从今天开始,我就带着大家从0开始搭建一个聊天机器人. (顺便说一句,我喜欢把链接像上面这样加在文字里,如果找不到文中所说的资源,可以看看周围 ...

最新文章

  1. Shell:传递命令行参数
  2. python打印小数
  3. 解决postman请求乱码问题
  4. Beego 学习笔记9:Boostrap使用介绍
  5. Bailian4003 十六进制转十进制【入门】
  6. IDEA运行main,junit方法报错Class not found
  7. 韦根协议——STM32收发
  8. 电脑基础知识入门:键盘上的英文,意思和功能汇总!
  9. linux进入rescue,进入Linux rescue模式后有几种方法引导系统
  10. 路由器接交换机再接无线路由器,应该怎么设置
  11. 钢绞线的弹性模量的计算方法_钢绞线伸长量计算方法.doc
  12. [2018-03-06] 基于Django的轻量级CMS Mezzanine搭建笔记
  13. docker-部署lnmp
  14. 马斯克将Twitter算法开源、谷歌向CNCF捐赠Istio、甲骨文修复Java年度加密漏洞 | 开源月报 Vol. 05...
  15. 可免费下载的最新人民日报分词语料库(NEPD)发布(转载)
  16. Github如何添加合适的开源License(Apache License 2.0、MIT License、GPL3)
  17. stm32倒计时秒表proteus_倒计时秒表 单片机
  18. 【实战模拟】下载安装并配置虚拟kali Linux 和 OWASP Broken Web Apps 靶机
  19. 转载:林仕鼎: 系统架构领域的一些学习材料
  20. STL中容器vector迭代器失效的相关问题

热门文章

  1. Java 解决采集UTF-8网页空格变成问号乱码
  2. 宿主机为linux、windows分别实现VMware三种方式上网(转)
  3. 应用层——使用 Socket 通信实现 FTP 客户端程序
  4. Linux下如何同时启动多个Tomcat服务器
  5. Mysql 使用正则表达式
  6. VMware配置额外内存设置
  7. ebnf范式_使用Scala基于词法单元的解析器定制EBNF范式文法解析
  8. python发短信脚本_python脚本发送短信
  9. python中把输出结果写到一个文件中_Python3.6笔记之将程序运行结果输出到文件的方法...
  10. android 释放bitmap fragment,,为什么重复Replace Fragment会内存泄漏