0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何用LUT做一个可动态配置的卷积核呢?

FPGA之家 来源:AI加速 2023-11-06 09:07 次阅读

引言

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

01

LUT乘法器的实现

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

cc1ccb26-7c3b-11ee-939d-92fbcf53809c.png

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

cc310fa0-7c3b-11ee-939d-92fbcf53809c.png

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

02

Compressor加法树

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

cc4ef740-7c3b-11ee-939d-92fbcf53809c.png

图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或者截位。

cc5999de-7c3b-11ee-939d-92fbcf53809c.png

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

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

cc74112e-7c3b-11ee-939d-92fbcf53809c.png

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

cc8bc94a-7c3b-11ee-939d-92fbcf53809c.png

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

cc9a00aa-7c3b-11ee-939d-92fbcf53809c.png

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

ccb136d0-7c3b-11ee-939d-92fbcf53809c.png

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

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

ccd293a2-7c3b-11ee-939d-92fbcf53809c.jpg

图4.3 动态配置LUT电路图

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

ccefd7dc-7c3b-11ee-939d-92fbcf53809c.png

图4.4 双LUT结构进行计算

05

结果

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

cd00dc58-7c3b-11ee-939d-92fbcf53809c.jpg

图5.1 综合后资源对比

总结

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







审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • dsp
    dsp
    +关注

    关注

    544

    文章

    7686

    浏览量

    344376
  • FPGA
    +关注

    关注

    1602

    文章

    21326

    浏览量

    593216
  • 神经网络
    +关注

    关注

    42

    文章

    4574

    浏览量

    98753
  • 乘法器
    +关注

    关注

    8

    文章

    192

    浏览量

    36586
  • LUT
    LUT
    +关注

    关注

    0

    文章

    49

    浏览量

    12397

原文标题:用LUT来做一个可动态配置的卷积核

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    在FPGA里面做一个NIOS

    我最近在做一个FPGA的设计,在FPGA里面做一个NIOS,用串口向IONS里送数据,但在NIOS的串口初始化设置时,借鉴了位前辈的程序,里面有
    发表于 09-16 23:30

    何用LABVIEW做一个关于离散傅里叶变换

    各位如何用LABVIEW做一个关于离散傅里叶变换??!!!
    发表于 04-08 21:59

    基于FPGA的IP的DDS信号发生器如何用IP

    我毕业设计要做一个基于FPGA的IP的DDS信号发生器,但是我不会用DDS的IP,有没有好人能发我份资料如何用IP
    发表于 03-10 11:46

    请问如何用while loop和cast structure来做一个简单的倒数

    请问如何用while loop和cast structure来做一个简单的倒数? 比如我输入10,然后开始倒数,等到0的时候程序停止,
    发表于 10-25 00:58

    何用labview做一个小区智能出入系统

    何用labview做一个小区智能出入系统
    发表于 04-09 10:57

    OpenMV怎么用?如何用OpenMV做一个电磁炮?

    OpenMV怎么用?如何用OpenMV做一个电磁炮?
    发表于 10-20 07:30

    何用RTC时钟去配置闹钟

    什么是RTC?RTC的工作原理是什么?RTC时钟源有哪些?如何用RTC时钟去配置闹钟
    发表于 11-01 06:46

    何用固件库编程的方式去做一个LED流水灯

    何用固件库编程的方式去做一个LED流水灯?如何用proteus8.7对LED流水灯进行仿真?
    发表于 11-10 07:33

    何用STM32与zigbee技术做一个可以联机的游戏机

    何用STM32与zigbee技术做一个可以联机的游戏机?怎样去做一个基于android和wifi技术的远程控制器
    发表于 11-12 07:49

    何用定时器的外部计数器模式来做一个频率计

    如何使用STM32去测量频率和占空比?如何用定时器的外部计数器模式来做一个频率计
    发表于 11-22 07:17

    何用C++做一个TCP的服务器进行数据观察及采集

    何用C++做一个TCP的服务器进行数据观察及采集?有哪些设计步骤?
    发表于 12-23 09:41

    何用AD603来做一个低频小信号功率放大器

    AD603是什么?使用AD603出现的问题有哪些?如何用AD603来做一个低频小信号功率放大器
    发表于 01-26 06:13

    何用DMA做一个数码管动态扫描

    准备在STM32上用DMA做一个数码管动态扫描的实例第次发文,先问候下大家,你们好啊!####直以来在使用数码显示驱动时,当程序越做愈
    发表于 02-11 07:11

    sTm32可以做卷积滤波图片吗?

    sTm32可以做卷积滤波图片吗
    发表于 09-21 07:17

    请问如何用stm32做一个FFT变换?

    请问如何用stm32做一个FFT变换?官方的库有FFT函数吗
    发表于 11-03 08:16