[0021] 下面结合说明书附图和实施例对本发明作进一步限定,但不限于此。
[0022] 如图1,2所示,本发明RISC‑V自定义加速指令设计在卷积神经网络中的应用方法具体包括以下步骤:
[0023] S1、RISC‑V指令集架构是一个灵活可扩展的架构,RISC‑V的可扩展性主要体现在两方面:1预定义的Custom指令,2预留的指令编码空间。本设计采用预留的指令编码空间来实现加速指令。
[0024] RISC‑V架构定义的指令集只使用了少部分的指令编码空间。更多的指令编码空间被预留给用户作为扩展指令使用。由于RISC‑V架构支持多种不同的指令长度,不同的指令长度均预留有不同的编码空间。根据常用的32位长度指令opcode表。对于没有定义的,reserved类型的指令类型组,可以用来设计自定义指令。
[0025] 由于SIGMOD函数经常用于神经网络的算法中,所以以SIGMOD函数的硬件计算加速指令为例进行研究。SIGMOD函数计算公式是:
[0026]
[0027] 指令格式:采用I类基本指令格式,指令格式如图1所示。Rd是目标寄存器,Rs1是源寄存器1。funct3是SIG sigmod的函数缩写,imm是保留部分(可用于软件编译时修改该值,向模块传递一个立即数),opcode使用reserved编码空间1101011。
[0028] SIGMOD函数属于超越函数,不能够直接实现,所以采用查找表的方式实现SIGMOD函数。根据SIGMOD函数图像,输入‑16以下的数值几乎为0,+15以上的数值几乎为1,所以对输入范围是‑16~+15的所有整数进行编码计算。输入一共有32个输入值。输出范围0.0000001125~0.999999694。系统最小分度5.96046E‑08(1/(2^24)),取值是24位的2进制分之一。采用平均编码方式,将1分为2^24段,用输出数值除以分度值的方法得出输出编码值。
[0029] S2、设计环境要求:
[0030] (1)机器的位宽是32位,即认为寄存器与指令位宽32位,ROM访存以4字节对齐。
[0031] (2)所有模块时钟设计为同步时钟,异步复位。
[0032] (3)模块本身不包含取指、译码操作,即认为操作数和操作码已经通过前序指令或步骤得到。
[0033] SIGMOD运算模块6种状态转换图如图2:
[0034] IDLE空闲状态:此状态下系统等待START线上的上升沿信号到来,此信号由外部模块产生,START信号产生后转入READ_INPUT状态。
[0035] READ_INPUT读源寄存器状态:此状态下系统读取源寄存器的数据到累加器中,读取并写入完毕后转入JUDGE_INPUT状态。
[0036] JUDGE_INPUT判断输入范围状态:此状态下系统判断输入寄存器的值是否在输入范围内,若在输入范围内转入CAL_ADDR状态,不在输入范围内转入WIRTE_OUTPUT状态。
[0037] CAL_ADDR地址计算状态:此状态表示模块正在根据输入计算得到合法的ROM地址,计算结束后转入READ_ROM状态。
[0038] READ_ROM读ROM阶段:此状态表示模块正在读取ROM数据寄存器中的数据到累加器中,读取并写入完毕后转入WRITE_OUTPUT阶段。
[0039] WRITE_OUTPUT写输出状态:此状态表示模块将累加器中的数据写入到目标寄存器中,写入后转入IDLE状态。
[0040] S3、以最简单的手写数字识别卷积神经网络为例验证SIGMOD指令的加速功能。在PC端搭建虚拟机ubuntu16.04+tensorflow‑cpu神经网络训练环境。设计一个基于mnist数据集的6层手写数字识别网络。输入图片为28×28像素黑底白字,输出为图片的识别数值。中间包含三种主要计算:卷积,激活函数(SIGMOD),池化。表1为每层具体输入输出特征,卷积核大小参数设计表。每个卷积层后面接一个激活函数SIGMOD。训练完准确度98%,保存权重和偏置参数文件。
[0041] 表1每层参数设计表
[0042] 输入特征 卷积核 输出特征
卷积层1 28×28×1 3×3×1×16 28×28×16
池化层1 28×28×16 2×2 14×14×16
卷积层2 14×14×16 3×3×16×32 14×14×32
池化层2 14×14×32 2×2 7×7×32
全连接层1 7×7×32 7×7×32×128 128
全连接层2 128 128×10 10
[0043] S4、在pynq‑z2板卡上面实现神经网络推理计算。把PC端训练好的权重和偏置参数值转化为二进制格式存储到SD卡并把搭建好的底层硬件设计导入到FPGA板卡。安装RISC‑V工具链依赖项,下载RISC‑V工具链,编译并安装RISC‑V工具链。
[0044] 添加一个指令到指令集:添加了一个sig指令,指令格式表示为sig r1,r2。此指令格式表示sigmod函数的硬件实现,具体表现为:R[r1]=sigmod(r2)。
[0045] 添加操作码:打开工具链文件夹下的riscv‑opcodes/opcodes,添加操作码。sig rd rs1 rs2 31..25=1 14..12=0 6..2=0x1A 1..0=3。
[0046] 运行指令:添加好新的操作码后在命令行界面进行对指令的运行。
[0047] cat opcodes‑pseudo opcodes opcodes‑rvc opcodes‑rvc‑pseudo opcodes‑custom|./parse‑opcodes‑c>~/temp.h
[0048] 重编译:打开temp.h并找到对应的两行SIG定义并添加到riscv‑gnu‑toolchain/riscv‑binutils‑gdb/include/opcode/riscv‑opc.h。然后再编辑文件riscv‑gnu‑toolchain/riscv‑binutils‑gdb/opcodes/riscv‑opc.c。同时添加SIG指令定义{"SIG","I","d,s,t",MATCH_SIG,MASK_SIG,match_opcode,0}至结构体riscv_opcode riscv_opcodes[]。在结构体修改完成之后,进行重新编译,即可完成自定制指令的添加。
[0049] 使用增加的SIGMOD指令进行图片推理测试。测试集10000张图片集识别率98.72%,速度434.09帧每秒。使用ARM‑A9实现推理运算,识别率98.94%,速度为40.71帧每秒,实现10.66倍加速比。证明RISC‑V自定义加速指令SIGMOD加快了卷积神经网络的推理速度。
[0050] 以上实施例的说明只是用于帮助理解本发明的方法及其核心思想。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以对本发明进行若干改进和修饰,这些改进和修饰也落入本发明权利要求的保护范围内。
[0051] 对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。