CN115617741A - 基于fpga的池化方法及fpga芯片 - Google Patents

基于fpga的池化方法及fpga芯片 Download PDF

Info

Publication number
CN115617741A
CN115617741A CN202211290848.3A CN202211290848A CN115617741A CN 115617741 A CN115617741 A CN 115617741A CN 202211290848 A CN202211290848 A CN 202211290848A CN 115617741 A CN115617741 A CN 115617741A
Authority
CN
China
Prior art keywords
data
pooling
pooled
subdata
transverse
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202211290848.3A
Other languages
English (en)
Inventor
王炳松
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Shanghai Anlu Information Technology Co ltd
Original Assignee
Shanghai Anlu Information Technology Co ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Shanghai Anlu Information Technology Co ltd filed Critical Shanghai Anlu Information Technology Co ltd
Priority to CN202211290848.3A priority Critical patent/CN115617741A/zh
Publication of CN115617741A publication Critical patent/CN115617741A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F15/00Digital computers in general; Data processing equipment in general
    • G06F15/76Architectures of general purpose stored program computers
    • G06F15/78Architectures of general purpose stored program computers comprising a single central processing unit
    • G06F15/7867Architectures of general purpose stored program computers comprising a single central processing unit with reconfigurable architecture
    • G06F15/7871Reconfiguration support, e.g. configuration loading, configuration switching, or hardware OS
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F5/00Methods or arrangements for data conversion without changing the order or content of the data handled
    • G06F5/06Methods or arrangements for data conversion without changing the order or content of the data handled for changing the speed of data flow, i.e. speed regularising or timing, e.g. delay lines, FIFO buffers; over- or underrun control therefor
    • G06F5/065Partitioned buffers, e.g. allowing multiple independent queues, bidirectional FIFO's
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Image Processing (AREA)

Abstract

本发明公开了一种基于FPGA的池化方法及FPGA芯片,包括:逐一获取一特征图的若干待池化数据;在每获取一待池化数据后,将待池化数据进行横向池化处理,得到一横向池化数据,并将横向池化数据写入FPGA内的一FIFO存储模块中;其中,所述FPGA内设置有若干FIFO存储模块;将各FIFO存储模块中的横向池化数据读出;对读出的各横向池化数据进行纵向池化,得到一纵向池化数据;根据所得到的各纵向池化数据进行尺度变换,并将尺度变换后的数据输出。通过实施本发明能够实现基于FPGA的池化运算。

Description

基于FPGA的池化方法及FPGA芯片
技术领域
本发明涉及卷积神经网络技术领域,尤其涉及一种基于FPGA的池化方法及FPGA芯片。
背景技术
卷积神经网络(Convolutional Neural Networks,CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deeplearning)的代表算法之一。
早期卷积神经网络内的池化函数主要在CPU中实现,但CPU的串行计算和复杂的指令集,面对大数量并行,显得力不从心,如果提高主频和增加核心数又代价太高;后来GPU应用到卷积神经网络中,它使用的SIMD(单指令流多数据流)架构可以完美支持并行运算,加速神经网络的计运算过程,因此GPU在训练场景中占据着主导地位,大规模产品化时,因功耗过高而使用受限。最近几年ASIC异军突起,它完美的满足了并行运算和低功耗,但灵活性不足,当算法有更新时,又需要重新设计兼容,成本过高。因此现有CPU、GPU和ASIC不能同时兼容并行运算、低功耗和灵活性的特点等;而FPGA可进行并行多路处理,优化的得当时可以实现高性能低功耗,另外FPGA独有的显著特点是可重构性,允许被多次变成改变硬件功能,使得它可以通过不断实验,测试多种不同的硬件设计和对应程序,找出性能的优化点,从而得出特定神经网络在特定应用场景下的最优解决方案。所以才用FPGA进行池化运算是一个较优的选择。而如何基于FPGA实现池化运算是一个亟需解决的问题。
发明内容
本发明实施例提供一种基于FPGA的池化方法及FPGA芯片,能够实现基于FPGA的池化运算。
本发明一实施例提供了一种基于FPGA的池化方法,包括:
逐一获取一特征图的若干待池化数据;
在每获取一待池化数据后,将待池化数据进行横向池化处理,得到一横向池化数据,并将横向池化数据写入FPGA内的一FIFO存储模块中;其中,所述FPGA内设置有若干FIFO存储模块;
将各FIFO存储模块中的横向池化数据读出;
对读出的各横向池化数据,进行纵向池化,得到一纵向池化数据;
根据所得到的各纵向池化数据进行尺度变换,并将尺度变换后的数据输出。
进一步的,将待池化数据进行横向池化处理,得到一横向池化数据,包括:
将待池化数据延迟一拍得到第一延拍数据,将待池化数据延迟两拍后得到第第二延拍数据;
将待池化数据、第一延拍数据以及第二延拍数据作为基准数据,继而根据基准数据生成在所述池化窗口尺寸下,池化窗口所需的并置数据;
根据所述并置数据生成所述横向池化数据中各字节位置上的横向池化子数据,继而将各横向池化子数据并行输出,得到所述横向池化数据;
其中,根据并置数据生成横向池化数据中一字节位置上的横向池化子数据,包括:
根据所需生成的横向池化子数据在横向池化数据中的字节位置以及池化窗口尺寸,确定对并置数据进行数据选取时的初始字节位置和终止字节位置;
根据所述初始字节位置和终止字节位置从并置数据中截取若干并置子数据;
根据各并置子数据重复执行数据运算操作,生成横向池化数据中一字节位置上的横向池化数据;
所述数据运算操作包括:以两个并置子数据为一组,从初始的并置子数据起,按顺序将各并置子数据分为若干横向池化组,并在存在落单的并置子数据时,将落单的并置子数据进行延拍后,生成延拍并置子数据;
将各横向池化组中的两并置子数据进行池化计算,得到每一横向池化组的计算结果;
在不存在延拍并置子数据时,将各横向池化组的计算结果作为下一次数据运算操作时的各并置子数据;
在存在延拍并置子数据时,将各横向池化组的计算结果以及延拍并置子数据作为下一次数据运算操作时的各并置子数据。
进一步的,根据基准数据生成在所述池化窗口尺寸下,池化窗口所需的并置数据,包括:
在所述池化窗口尺寸为N*N时,从所述待池化数据的低位开始截取
Figure BDA0003901296400000031
个字节的数据,得到若干第一数据;
从所述第二延拍数据的高位开始截取
Figure BDA0003901296400000032
个字节的数据,得到若干第二数据;
根据并置数据所需的预设字节数、各第一数据的字节数、各第二数据的字节数以及第一延拍数据的字节数,计算所需补零的字节数,继而根据所述补零的字节数确定补零数据;
将补零数据、各第一数据、第一延拍数据以及各第二数据进行拼接,得到所述并置数据。
进一步的,根据所需生成的横向池化子数据在横向池化数据中的字节位置以及池化窗口尺寸,确定对并置数据进行数据选取时的初始字节位置和终止字节位置,包括:
将所需生成的横向池化子数据在横向池化数据中的字节位置,作为初始字节位置;
将终止字节位置设为第N个字节。
进一步的,所述FIFO存储模块的数量为N。
进一步的,对读出的各横向池化数据进行纵向池化,得到一纵向池化数据包括:
在读出N个横向池化数据后,根据N个横向池化数据生成若干数据集;其中,每一数据集包括N个横向池化子数据且各个横向池化子数据在其所对应的横向池化数据中的字节位置相同;
根据各数据集并行生成所述纵向池化数据中对应字节位置上的纵向池化子数据,继而将各纵向池化子数据并行输出得到一纵向池化数据;
其中,根据一数据集生成所述纵向池化数据中一对应字节位置上的纵向池化子数据,包括:
根据数据集中各横向池化子数据,重复执行第二数据运算操作,生成纵向池化数据一对应字节位置上的纵向池化子数据;
所述第二数据运算操作包括:以两个横向池化子数据为一组,从初始的横向池化子数据起,按顺序将横向池化子数据分为若干纵向池化组,并在存在落单的横向池化子数据时,将落单的横向池化子数据延拍,生成延拍横向池化子数据;
将各纵向池化组中的两横向池化子数据进行池化计算,得到每一纵向池化组的计算结果;
在不存在落单的横向池化子数据时,将各纵向池化组的计算结果作为下一次执行第二数据运算操作时的各横向池化子数据;
在存在落单的横向池化子数据时,将各纵向池化组的计算结果以及延拍并置子数据作为下一次执行第二数据运算操作时的各横向池化子数据。
进一步的,根据所得到的各纵向池化数据进行尺度变换,并将尺度变换后的数据输出,包括:
根据池化步长所对应的数据抽取间隔,对各纵向池化数据进行数据抽取,并根据抽取后的数据生成若干待变换数据;
根据预设的缩放比例对每一待变换数据进行尺度变换并输出。
在上述方法项实施例的基础上,本发明另一实施例提供了一种FPGA芯片,所述FPGA芯片执行预存计算机程序时实现本发明任意一项所述的基于FPGA的池化方法。
通过实施本发明实施例具有如下有益效果:本发明实施例提供了一种基于FPGA的池化方法,所述方法先将一特征图的若干待池化数据在FPGA内进行横向池化,然后存入FPGA内的FIFO存储模块中;将各FIFO存储模块中的横向池化数据读出;对读出的各横向池化数据进行纵向池化,得到一纵向池化数据;然后对所得到的各纵向池化数据进行尺度变换,并将尺度变换后的数据输出,完成整个池化流程。通过实施本发明上述实施例能够基于FPGA实现数据的池化,且先横向池化再纵向池化的方式能够大幅度降低算法的复杂度。
附图说明
图1是本发明一实施例提供的一种基于FPGA的池化方法的流程示意图。
图2是现有神经网络的结构示意图。
图3是本发明一实施例提供池化算法在FPGA内实现的框图。
图4是本发明一实施例提供的一横向池化的流程示意图。
图5是本发明一实施例提供的池化时FIFO的读写时序示意图。
图6是本发明一实施例提供的一纵向池化的流程示意图。
图7是本发明一实施例提供的尺度变化的流程示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
如图1所示,本发明一实施例提供了一种基于FPGA的池化方法,至少包括如下步骤:
S101:逐一获取一特征图的若干待池化数据。
S102:在每获取一待池化数据后,将待池化数据进行横向池化处理,得到一横向池化数据,并将横向池化数据写入FPGA内的一FIFO存储模块中;其中,所述FPGA内设置有若干FIFO存储模块。
S103:将各FIFO存储模块中的横向池化数据读出。
S104:读读出的各横向池化数据,进行纵向池化,得到一纵向池化数据。
S105:根据所得到的各纵向池化数据进行尺度变换,并将尺度变换后的数据输出。
对于步骤S101、典型的LeNet5神经网络一般由以下层组成,如图2所示。其数据从输入层输入,依次经过卷积层、池化层、全连接层,最后到输出层,数据单向流动。而后来的卷积神经网络都是在这个基础上发展的。每一功能层(如卷积层、池化层等)都有着输入特征图(Input Feature Map)和输出特征图(Output Feature Map)。由图2可知,紧随卷积层之后一般都有个池化层,由此可见池化层用的很多,所以设计一个高性能且通用度强的池化层实现方案特别重要。本发明以YOLO V5s(一种目标检测模型)网络为例,它支持int8和uint8两种数据类型、步长1*1、尺寸有5*5、9*9等、行数据位宽64bit;其池化方法在FPGA中实现的过程大致如图3所示。
在此步骤中,从DDR中读出的某一层FM(特征图)的数据被转成一行行的数据,输入到FPGA中。每一行数据包括若干待池化数据,然后进行后续的池化操作。
对于步骤S102、在一个优选的实施例中,将待池化数据内的进行横向池化处理,得到一横向池化数据,包括:将待池化数据延迟一拍得到第一延拍数据,将待池化数据延迟两拍后得到第二延拍数据;将待池化数据、第一延拍数据以及第二延拍数据作为基准数据,继而根据基准数据生成在所述池化窗口尺寸下,池化窗口所需的并置数据;根据所述并置数据生成所述横向池化数据中各字节位置上的横向池化子数据,继而将各横向池化子数据并行输出,得到所述横向池化数据;其中,根据并置数据生成横向池化数据中一字节位置上的横向池化子数据,包括:根据所需生成的横向池化子数据在横向池化数据中的字节位置以及池化窗口尺寸,确定对并置数据进行数据选取时的初始字节位置和终止字节位置;根据所述初始字节位置和终止字节位置从并置数据中截取若干并置子数据;根据各并置子数据重复执行数据运算操作,生成横向池化数据中一字节位置上的横向池化数据;所述数据运算操作包括:以两个并置子数据为一组,从初始的并置子数据起,按顺序将各并置子数据分为若干横向池化组,并在存在落单的并置子数据时,将落单的并置子数据进行延拍后,生成延拍并置子数据;将各横向池化组中的两并置子数据进行池化计算,得到每一横向池化组的计算结果;在不存在延拍并置子数据时,将各横向池化组的计算结果作为下一次数据运算操作时的各并置子数据;在存在延拍并置子数据时,将各横向池化组的计算结果以及延拍并置子数据作为下一次数据运算操作时的各并置子数据。
优选的,根据基准数据生成在所述池化窗口尺寸下,池化窗口所需的并置数据,包括:在所述池化窗口尺寸为N*N时,从所述待池化数据的低位开始截取
Figure BDA0003901296400000071
个字节的数据,得到若干第一数据;从所述第二延拍数据的高位开始截取
Figure BDA0003901296400000081
个字节的数据,得到若干第二数据;根据并置数据所需的预设字节数、各第一数据的字节数、各第二数据的字节数以及第一延拍数据的字节数,计算所需补零的字节数,继而根据所述补零的字节数确定补零数据;将补零数据、各第一数据、第一延拍数据以及各第二数据进行拼接,得到所述并置数据。
优选的,根据所需生成的横向池化子数据在横向池化数据中的字节位置以及池化窗口尺寸,确定对并置数据进行数据选取时的初始字节位置和终止字节位置,包括:将所需生成的横向池化子数据在横向池化数据中的字节位置,作为初始字节位置;将终止字节位置设为第N个字节。
优选的,所述FIFO存储模块的数量为N。
以下对横向池化的操作进行详细的介绍,如图4所示,图4展示的是生成横向池化数据的第一字节位置上的横向池化子数据的流程,具体如下:
图4中,fmc_dt为行数据输入即上述一待池化数据,总线位宽64bit,共分为8个子数据并行,每个子数据为8bit,fmc_dt_d1和fmc_dt_d2分别为fmc_dt打一拍和打两拍之后的值,即fmc_dt_d1为上述第一延拍数据,fmc_dt_d2为上述第二延拍数据;构成{fmc_dt,fmc_dt_d1,fmc_dt_d2}(即为上述基准数据)。
优选的在上述基准数据准备好后,可以开始在FM的外围补Padding(边界填充),之所以要插入Padding是由于窗口移动到FM的边界时,会出现部分位置没有数据的情况,此时为了不做特例运算,插入最小值作为Padding,Padding的值为{cfg_work_mode,7'd0},此处的cfg_work_mode为数据类型变量,1'b0对应uint8,1'b1对应int8。以3*3窗口为例,插入Padding之后的某层FM如下表一所示,黑体data00为窗口中心值,与周围带阴影的8个数据构成3*3窗口。表中data00为第一个行数据的bit7~0。在本发明中,运行池化算法时这是将一数据的8个子数据并行运算的,如果不并行运算,会串行计算完8个子数据,再开始接收新数据,效率非常低。
表一:3*3窗口的池化算法插入Padding之后的FM
Padding Padding Padding Padding Padding Padding Padding Padding
Padding data00 data01 data02 data03 data04 …… Padding
Padding data10 data11 data12 data13 data14 …… Padding
Padding data20 data21 data22 data23 data24 …… Padding
Padding data30 data31 data32 data33 data34 …… Padding
Padding data40 data41 data42 data43 data44 …… Padding
Padding …… …… …… …… …… …… Padding
Padding Padding Padding Padding Padding Padding Padding Padding
Padding插入完成之后,根据窗口尺寸,选取有效的数据并置组成窗口需要的值,获得上述并置数据。并置方法如下:并置数据的数据量固定,有一个预设值,即上述预设字节数,示意性的,在本发明并置数据的的大小为160个bit即为20个字节数。并置将第一延拍数据全部选取,然后从待池化数据的低位开始截取
Figure BDA0003901296400000091
个字节的数据、从第二延拍数据的高位开始截取
Figure BDA0003901296400000092
个字节的数据、然后计算需要补零数据,最终将所选取的数据和补零的数据拼接,最终得到并置数据。以图4为例,对于一个5*5的窗口,经过计算要从第二延拍数据的高位开始截取两个字节的数据,即截取得到fmc_dt_d2{63:48},要从待池化数据的低位开始截取两个字节的数据,即截取得到fmc_dt{15:0},然后选取整个第一延拍数据fmc_dt_d1;此时fmc_dt_d2{63:48}、fmc_dt{15:0}和fmc_dt_d1、加起来一共是96个bit即12个字节,那么还差8个字节,此时需要补上一个8个字节64bit的补零数据,即64’d0;最终形成的并置数据为{64’d0,fmc_dt{15:0},fmc_dt_d1,fmc_dt_d2{63:48}}。
在得到并置数据后,则需要根据并置数据生成各个字节位置上的横向池化子数据,最终形成横向池化数据;以横向池化数据中的第一个字节位置上数据(即0-7bit的数据)的生成为例:假设池化窗口尺寸为5*5,此时需要从并置数据{64’d0,fmc_dt{15:0},fmc_dt_d1,fmc_dt_d2{63:48}}中选取5个字节的数据,为后续表述方便,将并置数据用hdt[159:0]表示,此时由于是要生成横向池化数据中的第一个字节位置上的横向池化子数据,因此在对并置数据进行数据选取时的初始字节位置也就是并置数据中第一个字节的位置。而由于是5*5的窗口,因此在对并置数据进行数据选取时的终止字节位置也就是并置数据中第5个字节的位置;最终选取出来的各并置子数据分别为:hdt[7:0]、hdt[15:8]、hdt[23:16]、hdt[31:24]和hdt[39:32];紧接着进行两两分组,hdt[7:0]和hdt[15:8]为一横向池化组、hdt[23:16]和hdt[31:24]为一横向池化组,hdt[39:32]为落单的;然后对hdt[7:0]和hdt[15:8]进行池化计算(可以是对两个数据进行求和,或取最大值等),得到池化后的结果mv0hO[7:0];将hdt[23:16]和hdt[31:24]进行池化运算得到池化后的结果mv0h1[7:0];图4中的“&”表示将两个数据进行比较;将hdt[39:32]进行延拍生成延拍并置子数据tv0h,紧接着,将mv0hO[7:0]、mv0h1[7:0]和tv0h一起作为下一轮数据运算操作时的并置子数据;在下一轮数据运算操作时,将mv0hO[7:0]和mv0h1[7:0]作为一横向池化组,进行池化计算得到mv1hO[7:0],tv0h落单,对tv0h进行延拍生成延拍并置子数据tv1h;将mv1hO[7:0]和tv1h作为下一轮数据运算操作时的并置子数据,最后将mv1hO[7:0]和tv1h作为一横向池化组,进行池化计算得到最终的一个8bit的结果,此时将这一结果作为横向池化数据第一个字节的数据;可以理解的在横向池化的过程中当某一轮数据运算操作执行完毕后,仅剩下一个字节的数据,则横向池化完成。
参照上述示意,根据池化窗口的尺寸和所需生成的横向池化子数据在横向池化数据中的字节位置,并行生成各个字节位上的横向池化子数据;最后将各横向池化子数据并行输出,得到上述一横向池化数据。
当池化步长为1*1时,横向池化完成之后,第一个横向池化数据随后写入FPGA内的第一个FIFO存储模块中,第二个横向池化数据过来之后,用它的时序写第一个FIFO存储模块的同时把第一个FIFO数据读出并写入第二个FIFO,依此类推直到第(M-1)个FIFO数据读出并写入到第M个FIFO,上述M=[(N+1)/2],紧接着并行读出N个数据。
在本发明中当池化步长不为1*1时,池化窗口的尺寸与池化步长保持一致。即当池化步长为S*S,S等于N,池化窗口的尺寸为N*N。则此时,第一横向池化数据写入第一个FIFO、第二行横向池化数据写入第二个FIFO、第三行横向池化数据写入第三个FIFO……以此类推,当N个FIFO均存储有一横向池化数据后,并行读出N个横向池化数据。
对于步骤S103,具体的,并行读出N个横向池化数据;优选的,当某一层特征图读到1~(N-M)行或者(H-(N-M-1))~H行时(H为特征图中数据的总行数),由于FIFO中已经存入了下一层的数据,或者这时FIFO为空,此时需要把这些FIFO统一置从伪空。示意性的,当池化窗口尺寸5*5,步长1*1时,本发明中FIFO的读写时序示意图如图5所示。
对于步骤S104、在一个优选的实施例中,对读出的各横向池化数据进行纵向池化,得到一纵向池化数据包括:根据N个横向池化数据生成若干数据集;其中,每一数据集包括N个横向池化子数据且各个横向池化子数据在其所对应的横向池化数据中的字节位置相同;根据各数据集并行生成所述纵向池化数据中对应字节位置上的纵向池化子数据,继而将各纵向池化子数据并行输出得到一纵向池化数据;其中,根据一数据集生成所述纵向池化数据中一对应字节位置上的纵向池化子数据,包括:根据数据集中各横向池化子数据,重复执行第二数据运算操作,生成纵向池化数据一对应字节位置上的纵向池化子数据;所述第二数据运算操作包括:以两个横向池化子数据为一组,从初始的横向池化子数据起,按顺序将横向池化子数据分为若干纵向池化组,并在存在落单的横向池化子数据时,将落单的横向池化子数据延拍,生成延拍横向池化子数据;将各纵向池化组中的两横向池化子数据进行池化计算,得到每一纵向池化组的计算结果;在不存在落单的横向池化子数据时,将各纵向池化组的计算结果作为下一次执行第二数据运算操作时的各横向池化子数据;在存在落单的横向池化子数据时,将各纵向池化组的计算结果以及延拍并置子数据作为下一次执行第二数据运算操作时的各横向池化子数据。
具体的,当N个横向池化数据正在读出时,同时也在进行下一步操作纵向池化,第一个FIFO的输出bit位为fdt[63:0],第二个FIFO为fdt[127:64],第N个FIFO的输出bit为fdt[N*64-1:(N-1)*64](第一个横向池化数据的bit位为fdt[63:0],第二个横向池化数据的bit位为fdt[127:64],第N个横向池化数据的bit位为fdt[N*64-1:(N-1)*64])。
紧接着开始进行纵向池化,先根据N个横向池化数据中字节位置相同的横向池化子数据归入一个数据集内,生成若干各数据集;例如将每个横向池化数据中处于第一个字节位置的横向池化子数据提取出来,生成第一个数据集合{fdt[7:0]、fdt[64+7:64]、fdt[128+7:128]……fdt[(N-1)*64+7:(N-1)*64]};将每个横向池化数据中处于第二个字节位置的横向池化子数据提取出来,生成第二个数据集合:{fdt[15:8]、fdt[64+15:64+8]……fdt[(N-1)*64+15:(N-1)*64+8]};以此类推生成N个数据集;
然后根据池化窗口池化以及数据集,生成纵向池化数据中对应字节位置上的纵向池化子数据,示意性的如图6所示,图6为生成纵向池化数据中第一个字节位置上的纵向池化子数据的示意图,由于是要生成纵向池化数据中第一个字节位置上的纵向池化子数据,因此需要选取由每个横向池化数据中处于第一个字节位置的横向池化子数据所组成的数据集,即上述第一个数据集(如果是要生成纵向池化数据中第二个字节位置上的纵向池化子数据,则需要选取由每个横向池化数据中处于第二个字节位置的横向池化子数据所组成的数据集,即上述第二个数据集,以此类推);此时,第一个数据集中的横向池化子数据包括图示的:fdt[7:0]、fdt[64+7:64]、fdt[128+7:128]、fdt[192+7:192]和fdt[256+7:256];紧接着开始第一轮的第二数据运算操作:将fdt[7:0]和fdt[64+7:64]作为一纵向池化组,将fdt[128+7:128]和fdt[192+7:192]作为一纵向池化组,fdt[256+7:256]为落单的,将其进行延拍,生成延拍横向池化子数据tv0v;对fdt[7:0]和fdt[64+7:64]进行池化计算(对两个数据进行求和或取最大值等),得到计算结果mv0v0[7:0];对fdt[128+7:128]和fdt[192+7:192]进行池化计算,得到计算结果mv0v1[7:0];将mv0v0[7:0]、mv0v1[7:0]和tv0v作为第二轮的第二数据运算操作时的横向池化子数据;在第二轮的第二数据运算操作中,将mv0v0[7:0]和mv0v1[7:0]作为一纵向池化组,进行池化计算得到mv1v0[7:0],tv0v落单,对tv0v进行延拍生成延拍横向池化子数据tv1v[7:0];最后,在第二轮的第二数据运算操作中,将mv1v0[7:0]和tv1v[7:0]进行池化计算,得到最终的一个8bit的结果,此时将这一结果作为纵向池化数据第一个字节的数据;可以理解的在纵向池化的过程中当某一轮第二数据运算操作执行完毕后,仅剩下一个字节的数据,则纵向池化完成。
参照上述示意,根据池化窗口的尺寸和所需生成的纵向池化子数据在纵向池化数据中的字节位置,并行生成各个字节位上的纵向池化子数据;最后将各纵向池化子数据并行输出,得到上述一纵向池化数据。
对于步骤S105、在一个优选的实施例中,根据所得到的各纵向池化数据进行尺度变换,并将尺度变换后的数据输出,包括:根据池化步长所对应的数据抽取间隔,对各纵向池化数据进行数据抽取,并根据抽取后的数据生成若干待变换数据;根据预设的缩放比例对每一待变换数据进行尺度变换并输出。
具体的,纵向池化完成之后,下一步根据步长抽取有效数据,以步长2*2为例,假设一纵向池化数据为:
{Byte7,Byte6,Byte5,Byte4,Byte3,Byte2,Byte1,Byte0},
则选取{Byte6,Byte4,Byte2,Byte0},再抽取下一个纵向池化数据的两个32bit拼成64bit输出;当数据个数不够拼时,高32位补0,其它步长依次类推,如上文一直提到的S*S步长,Byte与Byte间隔S。
截取数据完成之后,进入尺度变换部分,尺度变换流程图如下图7所示。上文已经提到,本设计都是以int8或uint8为例展开说明的,所以图7中的非int8类型即为uint8。图中的半精度系数为1<<(右移位数-1);另外由于缩放比例是个小数,所以乘法之前做了左移变成整数,然后相乘;后续计算时,再通过右移把放大的倍数缩放回去;最后输出时为了统一输入输出数据格式,又转换成int8或uint8输出。同时,前文已经提到,截取后的数据仍然是64bit,尺度变化时也是8个子数据并行进行尺度变换。至此,池化算法实现完成,数据输出到下一个模块,其它的时序控制信号打相同的拍数后也同步输出。
在上述方法项实施例的基础上,本发明另一实施例提供了一种FPGA芯片,所述FPGA芯片执行预存计算机程序时实现本发明中任意一项所述的基于FPGA的池化方法。
以上所述是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围。

Claims (8)

1.一种基于FPGA的池化方法,适用于在FPGA内执行,其特征在于,包括:
逐一获取一特征图的若干待池化数据;
在每获取一待池化数据后,将待池化数据进行横向池化处理,得到一横向池化数据,并将横向池化数据写入FPGA内的一FIFO存储模块中;其中,所述FPGA内设置有若干FIFO存储模块;
将各FIFO存储模块中的横向池化数据读出;
对读出的各横向池化数据进行纵向池化,得到一纵向池化数据;
根据所得到的各纵向池化数据进行尺度变换,并将尺度变换后的数据输出。
2.如权利要求1所述的基于FPGA的池化方法,其特征在于,将待池化数据内进行横向池化处理,得到一横向池化数据,包括:
将待池化数据延迟一拍得到第一延拍数据,将待池化数据延迟两拍后得到第第二延拍数据;
将待池化数据、第一延拍数据以及第二延拍数据作为基准数据,继而根据基准数据生成在所述池化窗口尺寸下,池化窗口所需的并置数据;
根据所述并置数据生成所述横向池化数据中各字节位置上的横向池化子数据,继而将各横向池化子数据并行输出,得到所述横向池化数据;
其中,根据并置数据生成横向池化数据中一字节位置上的横向池化子数据,包括:
根据所需生成的横向池化子数据在横向池化数据中的字节位置以及池化窗口尺寸,确定对并置数据进行数据选取时的初始字节位置和终止字节位置;
根据所述初始字节位置和终止字节位置从并置数据中截取若干并置子数据;
根据各并置子数据重复执行数据运算操作,生成横向池化数据中一字节位置上的横向池化数据;
所述数据运算操作包括:以两个并置子数据为一组,从初始的并置子数据起,按顺序将各并置子数据分为若干横向池化组,并在存在落单的并置子数据时,将落单的并置子数据进行延拍后,生成延拍并置子数据;
将各横向池化组中的两并置子数据进行池化计算,得到每一横向池化组的计算结果;
在不存在延拍并置子数据时,将各横向池化组的计算结果作为下一次数据运算操作时的各并置子数据;
在存在延拍并置子数据时,将各横向池化组的计算结果以及延拍并置子数据作为下一次数据运算操作时的各并置子数据。
3.如权利要求2所述的基于FPGA的池化方法,其特征在于,根据基准数据生成在所述池化窗口尺寸下,池化窗口所需的并置数据,包括:
在所述池化窗口尺寸为N*N时,从所述待池化数据的低位开始截取
Figure FDA0003901296390000021
个字节的数据,得到若干第一数据;
从所述第二延拍数据的高位开始截取
Figure FDA0003901296390000022
个字节的数据,得到若干第二数据;
根据并置数据所需的预设字节数、各第一数据的字节数、各第二数据的字节数以及第一延拍数据的字节数,计算所需补零的字节数,继而根据所述补零的字节数确定补零数据;
将补零数据、各第一数据、第一延拍数据以及各第二数据进行拼接,得到所述并置数据。
4.如权利要求3所述的基于FPGA的池化方法,其特征在于,根据所需生成的横向池化子数据在横向池化数据中的字节位置以及池化窗口尺寸,确定对并置数据进行数据选取时的初始字节位置和终止字节位置,包括:
将所需生成的横向池化子数据在横向池化数据中的字节位置,作为初始字节位置;
将终止字节位置设为第N个字节。
5.如权利要求4所述的基于FPGA的池化方法,其特征在于,FIFO存储模块的数量为N。
6.如权利要求5所述的基于FPGA的池化方法,其特征在于,:
在读出N个横向池化数据后,根据N个横向池化数据生成若干数据集;其中,每一数据集包括N个横向池化子数据且各个横向池化子数据在其所对应的横向池化数据中的字节位置相同;
根据各数据集并行生成所述纵向池化数据中对应字节位置上的纵向池化子数据,继而将各纵向池化子数据并行输出得到一纵向池化数据;
其中,根据一数据集生成所述纵向池化数据中一对应字节位置上的纵向池化子数据,包括:
根据数据集中各横向池化子数据,重复执行第二数据运算操作,生成纵向池化数据一对应字节位置上的纵向池化子数据;
所述第二数据运算操作包括:以两个横向池化子数据为一组,从初始的横向池化子数据起,按顺序将横向池化子数据分为若干纵向池化组,并在存在落单的横向池化子数据时,将落单的横向池化子数据延拍,生成延拍横向池化子数据;
将各纵向池化组中的两横向池化子数据进行池化计算,得到每一纵向池化组的计算结果;
在不存在落单的横向池化子数据时,将各纵向池化组的计算结果作为下一次执行第二数据运算操作时的各横向池化子数据;
在存在落单的横向池化子数据时,将各纵向池化组的计算结果以及延拍横向池化子数据作为下一次执行第二数据运算操作时的各横向池化子数据。
7.如权利要求6所述的基于FPGA的池化方法,其特征在于,根据所得到的各纵向池化数据进行尺度变换,并将尺度变换后的数据输出,包括:
根据池化步长所对应的数据抽取间隔,对各纵向池化数据进行数据抽取,并根据抽取后的数据生成若干待变换数据;
根据预设的缩放比例对每一待变换数据进行尺度变换并输出。
8.一种FPGA芯片,其特征在于,所述FPGA芯片执行预存计算机程序时实现如权利要求1-7中任意一项所述的基于FPGA的池化方法。
CN202211290848.3A 2022-10-21 2022-10-21 基于fpga的池化方法及fpga芯片 Pending CN115617741A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202211290848.3A CN115617741A (zh) 2022-10-21 2022-10-21 基于fpga的池化方法及fpga芯片

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202211290848.3A CN115617741A (zh) 2022-10-21 2022-10-21 基于fpga的池化方法及fpga芯片

Publications (1)

Publication Number Publication Date
CN115617741A true CN115617741A (zh) 2023-01-17

Family

ID=84864281

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202211290848.3A Pending CN115617741A (zh) 2022-10-21 2022-10-21 基于fpga的池化方法及fpga芯片

Country Status (1)

Country Link
CN (1) CN115617741A (zh)

Similar Documents

Publication Publication Date Title
CN108108809B (zh) 一种针对卷积神经元网络进行推理加速的硬件架构及其工作方法
CN111414994B (zh) 一种基于FPGA的Yolov3网络计算加速系统及其加速方法
EP4156079A1 (en) Image data storage method, image data processing method and system, and related apparatus
CN107656899A (zh) 一种基于fpga的模板卷积实现方法和系统
US20200104669A1 (en) Methods and Apparatus for Constructing Digital Circuits for Performing Matrix Operations
CN110674927A (zh) 一种用于脉动阵列结构的数据重组方法
CN112286864B (zh) 加速可重构处理器运行的稀疏化数据处理方法及系统
CN108897716A (zh) 通过存储器读写操作来缩减计算量的数据处理装置及方法
CN112257844B (zh) 一种基于混合精度配置的卷积神经网络加速器及其实现方法
CN111008691B (zh) 一种权值和激活值都二值化的卷积神经网络加速器架构
CN110580519A (zh) 一种卷积运算结构及其方法
CN114781629A (zh) 基于并行复用的卷积神经网络的硬件加速器及并行复用方法
CN112395549A (zh) 一种用于矩阵乘法密集型算法的可重构矩阵乘法加速系统
CN113313244B (zh) 面向加法网络的近存储神经网络加速器及其加速方法
CN114003201A (zh) 矩阵变换方法、装置及卷积神经网络加速器
CN116382617B (zh) 基于fpga的带并行排序功能的奇异值分解加速器
CN111222090B (zh) 卷积计算模块、神经网络处理器、芯片和电子设备
CN115617741A (zh) 基于fpga的池化方法及fpga芯片
CN109800867B (zh) 一种基于fpga片外存储器的数据调用方法
CN114022366B (zh) 基于数据流架构的图像尺寸调整装置、调整方法及设备
CN112905526B (zh) 一种多种类型卷积的fpga实现方法
CN112181356B (zh) 一种可配置的多进多出fifo的设计方法及装置
CN111368250B (zh) 基于傅里叶变换/逆变换的数据处理系统、方法及设备
US20220164127A1 (en) Memory for an Artificial Neural Network Accelerator
CN113610221A (zh) 一种基于fpga的可变膨胀卷积运算硬件系统

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination