0 引 言
近年来,卷积神经网络(CNN)被广泛地应用于图像和语音的各项处理任务中,特别是在深度学习中,CNN从海量原始数据中提取特征
[1]取得了较好的效果。
但是随着CNN在诸多领域的广泛运用,其在通用处理器(CPU)上较低的运算效率开始成为亟待解决的问题
[2]。由于CNN所涉及的主要计算过程为矩阵乘法,是一种典型的并行计算,而CPU的串行计算结构严重缺乏并行度,故而运算效率较低
[3~5]。另一方面,虽然GPU的高并行度架构可以提供高效率的CNN计算,但是GPU的高功耗导致其并不适用于嵌入式计算场景
[6]。已有学者提出物联网设备上的CNN加速器
[7]。2020年,Xiao等
[8]提出了一种用FPGA(field programmable gate array)的细粒度重新配置来定制CNN的方法。与此同时,根据不同的应用需求,许多硬件被用来在物联网设备上实现CNN加速
[9,10]。如,2019年,Chen等
[11]关注大规模CNN的耗时训练过程,提出了分布式计算环境下的双层并行训练(BPT-CNN)架构,BPT-CNN在保持精度的同时有效提高了CNN的训练性能,他们在BPT-CNN的外层解决了分布式计算和并行计算的关键问题
[12]。2020年,Nie等
[13]提出了一个在FPGA上实现的8位定点LeNet信息引擎,该引擎可以有效降低能耗,在精度损失小于1%的基础上提高性能。2021年,Shan等
[14]提出了一种在多FPGA平台上有效映射CNN的方法,以最大化应用的吞吐量。2021年,文献[
15]设计了利用多个PE形成脉动阵列结构,并加入双缓冲结构,实现数据复用,在200 MHz时钟频率下,使用单独的Rocket CPU,性能提高了约71倍。
由于嵌入式CNN专用处理器在对CNN计算进行加速的同时也要承担通用处理器的功能,所以需要相应的通用指令集与硬件架构,本文选用当前流行的嵌入式架构RISC-V作为处理器的指令集。RISC-V同时具有开源性和扩展性两个主要特点。开源性,即开发者可以免费使用该指令集;扩展性,即开发者可以通过对编译器的修改在已有指令集架构中增添项目所需的自定义指令。
CNN加速器的硬件实现具有高度的特殊性,而卷积神经网络的关键是卷积层的卷积操作,其本质是大量的矩阵操作,因此针对卷积中矩阵运算设计计算单元成为提升CNN加速器性能的关键。为解决物联网领域实时计算的需求,结合CNN的特点,我们针对RISC-V设计了命名为RCP(RISC-V CNN processor)的专用处理器加速FPGA中的矩阵运算
[15],以提高物联网设备上CNN的运算速度。
1 相关工作
1.1 RISC-V
RISC-V是一种基于RISC的开放指令集架构,在多处理器片上系统MPSoC(multiprocessor system-on-chip)的设计中被采用,作为一种开源化和模块化的处理器,它成为FPGA软核处理器的竞争者
[16]。RISC-V指令集支持具有可变长度指令的ISA扩展。已有的分析证实,在提高计算性能方面,指令扩展比高频操作更具成本效益。RISC-V有6种核心指令格式(R/I/S/U/SB/UJ),如
图1所示
[16],所有指令的长度都是固定的32位。每种指令格式分为多个部分,其中opcode是指令操作代码
[17],不同长度的funct7和funct3选择操作类型,rs1/rs2和rd是5位的源和目的寄存器,imm是不同长度的立即数。
根据RISC-V指令集手册,有4个操作码(0001011/0101011/1011011/1111011)用于自定义指令集。本文所考虑的自定义指令的操作码是0001011。
1.2 CNN的并行性
卷积神经网络是高度并行的,包含大量的卷积计算,本质是乘法和加法的矩阵运算。由于每个权重和输入特征图的每个像素之间的乘法在神经元中是独立的,所以卷积可以并行执行
[18]。因此,卷积操作的速度可以通过并行计算单元加速。由于CPU并不像GPU那样擅长处理并行数据
[19],完成CNN的并行化通常需要很大的成本,而FPGA和自定义指令集可以提高计算的并行能力,并从硬件层面加速卷积神经网络。
1.3 FPGA
FPGA是一种具有高集成度的可编程器件,可以实现大规模数字系统和复杂的算法操作
[20]。FPGA最显著的优势是可重构性,可复用的硬件资源允许开发者通过编程在FPGA芯片上设计一定规模范围内的集成电路。2021年,Merchant等
[21]提出了一个基于FPGA的RISC-V MPSoC探索框架,以帮助平衡芯片上的内核数量、存储子系统和网络。由于FPGA的特性,定制的RCP处理器可以被测试和验证。经过训练的卷积神经网络将被转换为定制处理器的可执行文件,定制的指令可以通过嵌入式汇编插入可执行文件中。然后,可执行文件将被加载到FPGA上以加速卷积,CNN的效率可以在物联网设备上得到改善。
2 RCP(RISC-V CNN Processor)处理器
2.1 RCP处理器的结构
RCP处理器在RISC-V架构的基础上定制了一条五级流水线,并采用哈佛结构将数据存储器和指令存储器分开。数据和指令的独立存储避免了处理器流水线设计中的结构冲突。由于在进行卷积运算时,总线上不会发生数据操作和指令操作的冲突,RCP处理器提高了计算效率。此外,为了通过定制指令加速CNN
[22],RCP处理器增加了卷积处理单元来执行卷积的矩阵操作和池化操作
[23],减少了复杂操作的常规指令
[24]。
图2是RCP处理器的结构,其中ALU是算术和逻辑单元,CNN ALU是CNN的卷积处理单元,SDRAM是同步动态随机存取存储器,SRAM是静态随机存取存储器。
由于采用了五级流水线设计
[18],RCP处理器可以通过同一时间在流水线的不同单元执行多条指令来加快指令的执行速度。一条指令在RCP处理器上执行时将经历五个阶段:指令获取(IF)、指令解码(ID)、执行(EX)、内存访问(MEM)和寄存器回写(WB)。
1) 指令获取IF(Instruction Fetch)
IF单元根据程序计数器(PC)的值从指令存储器中获取一般指令。PC的值分为三种情况:① 当程序正常执行时,PC的值加4得到下一条指令;② 当程序执行转移指令时,PC的值将由转移指令来计算;③当程序执行过程中发生中断时,原PC值首先被保存,然后被更新为中断的地址。
图3显示了IF阶段的过程。
一般一条指令可以被认为是在五级流水线的一个周期内完成的,但还有一些指令,如乘法和除法指令、浮点运算指令,需要多个周期才能完成。当多周期指令被执行时,流水线的某些阶段需要被暂停。暂停是由RCP处理器中的控制器产生的一个五位信号,每一位都控制相应的阶段被暂停。
2) 指令解码ID(Instruction Decode)
ID阶段的功能是将一条指令分解为opcode、rs1、rs2、funct3和funct7。操作码决定了指令的类型,包括整数算术逻辑指令、分支跳转指令、整数乘除指令和浮点运算指令,不同的指令有相应的模块执行操作。算术逻辑指令、乘除法指令和浮点运算指令需要从相应的寄存器地址访问数据或展开立即数,分支跳转指令会计算出下一条指令的地址。ID阶段的过程如
图4所示,可以看出,ID阶段对指令的操作和条件进行解码,然后将其发送到执行阶段。
在指令解码完成后,需要对执行阶段的操作数进行过滤。对于条件跳转指令,两个源操作数需要在执行阶段进行比较,所以寄存器文件中的源操作数将被送入执行阶段。对于无条件跳转指令,目的地址是根据PC计算的,所以inst和立即数应该被送到EX阶段。对于内存访问指令,应在源操作数和立即数的基础上计算地址,所以操作数需要从寄存器文件中取出,立即数被处理。
3) 执行EX(Execution)
EX阶段的任务是根据ID阶段的结果对相应模块进行操作。有两个执行模块,一个是ALU模块,另一个是CNN ALU模块,用于执行定制指令的操作。执行阶段的过程如
图5所示。
两个操作数被送到ALU模块,操作数由立即编号、寄存器文件的编号和转发单元转发的数据组成。转发单元的功能是转发来自内存访问阶段或回写阶段的数据,使对前置指令计算结果具有依赖性的后置指令在结果被写回到存储器之前就获得自身所需要的数据,从而减少了流水线空泡(Pipeline Bubble)的数量,提高了时钟周期的利用率,减少了数据冲突,提高了流水线的运行效率。
4) 内存访问MA(Memory Access)
内存访问阶段实现了内存访问指令的功能。其他不访问数据存储器的指令可以直接向下一个阶段发送信号。指令的is_rw信号决定从内存中读出数据或将数据写入内存,mem_addr是数据的地址,mem_data是需要存储或写入的数据。内存访问阶段的过程如
图6所示。
5) 回写WB(Write⁃Back)
回写阶段是流水线的最后一个阶段。它是将结果或数据写回到寄存器文件中。选择器选择操作指令的数据或内存中的数据回写到寄存器文件中。
2.2 解决管道中的冲突
尽管五级流水线的并行性加速了指令的执行速度,但在指令执行过程中,指令之间存在着关联性
[7]。因此,流水线上存在着结构冲突、控制冲突和数据冲突。如果流水线上的冲突没有得到及时解决,执行的效率就会降低。
1) 结构冲突
结构冲突发生在硬件资源被占用,而一条新指令急需使用该硬件的时候,它也被称为资源冲突。大部分的结构冲突是功能单元的冲突。例如,在早期的冯-诺依曼结构中,指令和数据位于同一个存储器中。当处理器获取指令和内存访问指令访问内存时,会有冲突。RCP处理器使用哈佛结构来解决这个问题。
2) 控制冲突
控制冲突也被称为分支冲突。在这种情况下,当前要取的指令取决于执行阶段的分支指令的结果,导致取出的指令不能在预定的周期内完成。控制冲突是由程序计数器的访问冲突引起的。分支指令被取走后,下一条指令将被立即取走。但是下一条指令的地址还没有被计算出来,流水线不知道哪条指令是真正要执行的。
对于分支冲突有两种解决方案。第一种解决方案是假设分支不发生,正常执行指令。当执行跳转指令时,随后进入流水线的指令将被清空。第二个解决方案是缩短分支延迟。假设分支没有发生,在分支指令执行到MEM阶段时,跳转指令的执行将被知道。缩短分支延迟的策略是提前计算跳转指令和跳转的地址。RCP处理器采用了第二种方案来解决控制冲突。
为了提前执行分支,首先要计算分支的地址和条件。分支的地址和条件很容易计算,因为当前的PC值和立即数已经保存在IF/ID寄存器中。跳转指令的执行将在ID阶段确定,条件可以从ID阶段的寄存器中获得,而且分支预测错误的代价只有一条指令。因此,在使用缩短分支延迟的策略后,分支预测的错误减少到一条指令。因此在跳转发生后,只有一条指令需要被清除。
3) 数据的冲突
数据冲突是由不同指令之间操作数的关联性引起的。根据数据访问的读写顺序,数据的相关性可以分为三种类型:写后读(RAW)、写后写(WAW)和读后写(WAR)
[19]。WAW和WAR出现在失序执行管道中,可以通过寄存器重命名来解决。RAW是指前一条指令要写回的相同的寄存器地址和后一条指令要读的源操作数地址之间的冲突,导致后一条指令在前一条指令写回结果之前不能读到源操作数,读到错误的数据。
为了解决由RAW引起的数据冲突,一种方法是停止流水线,等待前一条指令将结果写回寄存器文件,但这对流水线有负面影响;另一种方法是使用数据旁路技术,将前一条指令的操作结果发送到后面相关指令的源操作数,而不是等待前一条指令被写回,然后从寄存器文件中取出源操作数,数据通过转发单元被转发到前面的执行模块,以提高流水线的执行效率。
RCP处理器不仅可以正常执行常规指令,如算术逻辑运算、移位、跳转、加载等指令,还可以执行定制指令。
2.3 RCP处理器的定制指令
由于卷积操作占据了CNN的大部分计算操作,为了加速卷积的计算,本文设计了4种定制指令:MLOAD, MSTORE, MMUL和MPOOL。这4种定制指令的格式如
图7所示。
1) MLOAD/MSTORE指令
卷积的主要部分是矩阵运算,在数据量很大的情况下,如果使用传统指令集,卷积过程中需要反复调用大量的传统指令。MLOAD指令将数据从片外存储器加载到片内缓冲区,MSTORE指令将缓冲区的数据存储到片外存储器。crs_addr1是原始数据的地址,crs_addr1是目的数据的地址,cimm是数据的大小。MLOAD和MSTORE的格式表示如下:
MLOAD #crd_addr, #crs_addr1, #cimm
MSTORE#crd_addr, #crs_addr1, #cimm
2) MMUL指令
MMUL指令是将矩阵乘法运算中反复进行的乘法和加法操作进行融合的结果,调用一次MMUL指令即可进行矩阵乘法操作。MMUL指令格式如下:crs_addr1和crs_addr2是矩阵的地址;size表示卷积的大小;卷积的结果将以crd_addr的地址存储在内存中。MMUL的格式表示如下:
MMUL #crd_addr, #crs_addr1, #crs_addr2, #size
3) MPOOL指令
MPOOL指令用于完成池化与激活功能,并使用ReLu作为激活函数。当类型为7`b1时,池化的方法是平均池化。否则,7`b0表示最大池化。其他参数与MMUL指令的参数相同。MPOOL的格式表示如下:
MPOOL #crd_addr, #crs_addr1, #size, #type
2.4 定制指令在RCP处理中的工作流程
RCP处理器上定制指令的执行也遵循五级流水线。为了方便描述定制指令的执行,
图8显示了RCP处理器的内部逻辑结构,其中浅灰色寄存器用于存储当前阶段的执行结果。在统一时钟的控制下,数据像流水线一样从IF模块(取指令级)流向回写模块。
1) Instruction Fetch (IF)
这里的IF单元与一般指令相同,根据程序计数器的值从指令存储器中获取自定义指令。根据程序计数器PC的值从指令存储器中获取自定义指令。当程序正常执行时,程序计数器PC加4;当程序计数器PC页可以由转移指令得到;当程序中断时,程序计数器PC会先被保存,再被更新为当前中断地址。
2) Instruction Decode (ID)
在这个阶段,一条指令将被分成多个部分,与一般指令的区别在于增加了编译单元来比较操作码的值。如果操作码是0001011,该指令是一条定制指令,将按照定制指令的格式进行分割。指令的功能由功能代码决定。数据缓冲区存储矩阵操作的数据,它比寄存器文件大。在ID阶段,MMUL指令和MPOOL指令将访问数据缓冲区的数据。数据的最大容量是256字节。如果数据量超过了最大尺寸,数据访问将被重复。
3) Execution (EX)
EX模块主要用于执行MMUL和MPOOL指令。RCP处理器为MMUL和MPOOL等多周期指令提供控制模块和延时控制信号。在执行MMUL和MPOOL指令的过程中会有多个周期,在控制模块和停顿信号的控制下,后续指令的获取和解码会被暂停。之前指令的内存访问和回写继续执行,不受影响。在MMUL和MPOOL指令的执行完成后,滞留信号将被取消。
在MMUL指令和MPOOL指令的执行过程中,数据被发送到CNN ALU模块。通过从ID阶段获得的信息,MMUL指令和MPOOL指令将在CNN ALU模块中完成。CNN ALU模块包含两个部分。第一部分是CNPU,用于执行MMUL指令,另一部分是ReLu,用于执行MPOOL指令。
图9显示了CNN ALU的结构。CNPU(convolution neural processing unit)被分离成MMU单元和AU单元。矩阵的乘法是在MMU单元中执行的。例如,假设矩阵
A 和
B 的大小为5×5。为了计算
A ×
B,首先,矩阵
B 的数据被发送到MMU的处理执行单元(PE),MMU的PE执行乘法操作。然后,矩阵
A 的每一行与矩阵
B 相乘,结果被传送到AU单元进行累加操作,结果被存储在结果寄存器中。MMU单元将以多个周期执行,因为每个周期都有一个乘法和累加操作。乘法和累加操作的并行操作提高了矩阵操作的并行性,从而加速了卷积神经网络的执行。ReLu单元是为MPOOL指令设计的。池化的方法是平均池化或最大池化,这取决于类型的值。包括MMUL和MPOOL操作在内的所有操作完成后,结果被送到下一个阶段。
3 实验与分析
在本节中,我们将模拟在RCP处理器上执行的定制指令,并比较定制指令和一般指令的CNN效率。本方案使用Verilog语言实现卷积神经网络处理器的设计,仿真工具为vivado和modsim。
3.1 CNN在RCP处理器上的可用性
为了验证RCP处理器是否能够实现卷积神经网络的快速计算,用C语言实现卷积神经网络,并用RISC-V工具链进行编译。在编译完成的文件中通过嵌入式汇编在文件中插入自定义指令,最后生成可执行的ELF文件并下载到RCP处理器。在执行之前,需要将图片数据、权重数据和其他信息存储在相应的存储器中。例如,在片外SRAM中存储图片,在片内寄存器中存储权重。编译文件的关键内容如
图10所示。
图像识别的重点在于提取输入的基本特征。由于变形、缩放和平移,主要特征在输入特征图上的位置是不确定的,所以有必要从整个输入特征图中提取基本特征。如果端点在左上和右下区域,并且在左下角检测到一个角,就可以确定数字2,但经过变形变换后,数字2就不能用这种方法识别了,因为它的基本特征发生了很大变化。因此,绝对位置不利于图像的识别。
为了降低特征图的分辨率,在取样不足的情况下,用平均值或最大值来表示同一区域的非重叠(交叉)特征,这样可以在输入变形后保持特征不变。卷积神经网络继续分析和组合这些主要特征,以提取更复杂加高级的特征用于图像识别。
本文使用的数据集为MINIST手写数字数据库,并选择手写数字7的图片作为测试图片。分类的数值显示在
表1中,分类结果如
图11。
将
图11所示分类结果中的10个十六进制数字转换成十进制分数,分别是0.108 43,0.001 46,0.025 58,0.170 05,0.003 76,0.039 35,0.000 11,0.981 43,0.002 43,0.009 09。可以看出,第8个数值最大,所以分类结果为7号,识别率约为98.14%。
3.2 CNN在处理器上的效率
表2显示了所需指令的数量。RCP使用的一般指令数量为83 003,定制指令数量为15 792。由于使用了定制指令,所需的指令数量大大减少。
一个程序通常由各种类型的指令组成,不同种类的指令执行周期不同,相同种类的指令执行周期相同。假设一个程序包含M条不同种类的指令,标记为I1,I2, …, IM,将属于Ii 种类的指令数量表示为IC i,Ii 种类中每条指令的周期表示为CPI1, i=1, 2, …, M。一个程序的执行时间是该程序所有指令的总执行时间,用T表示,计算如下:
表2列出了7种指令的周期、数量和所需的总周期。从
表2可以看出,定制指令的执行总周期数为27 202,一般指令的总周期数为119 315。定制加速器的指令可以提升CNN执行效率约3.38倍。因此,定制的指令大大加速了卷积神经网络在RCP处理器上的执行。
4 结 语
本文在RISC-V架构的基础上,为卷积神经网络定制了RCP处理器,通过定制指令加速硬件视角下的卷积操作。实现了RISC-V处理器的五级流水线设计,并对流水线上的数据冲突和控制冲突提供了相应的解决方案;为具有大量卷积操作的卷积神经网络定制了MLAD/MSTORE/MMUL/MPOOL4种指令,加快了RCP处理器的卷积操作;验证RCP处理器的定制指令集,并通过运行卷积神经网络测试RCP处理器的功能。实验数据表明,RCP处理器对具有大量卷积运算的算法有明显的加速作用,可以促进物联网设备上的图像和语音识别。下一步将改进RCP处理器,使改进后的RCP能处理卷积神经网络中所有的计算任务,提高计算效率达到加速优化效果。
国家自然科学基金(61972293)
国家自然科学基金(62072346)
科技创新2030-“新一代人工智能”重大项目(2021ZD0113304)
湖北省重点研发计划(2020BAA021)
湖北省重点研发计划(2021BBA099)
湖北省重点研发计划(2021BBA029)
武汉市应用基础前沿项目(2020010601012168)
湖北省高等学校优秀中青年科技创新团队计划(T2022060)