Page 103 - 《软件学报》2020年第10期
P. 103
娄文启 等:一种神经网络指令集扩展与代码映射机制 3079
2.3 代码示例
为了阐述提出的专用指令集的用法,我们列举了使用 RV-CNN 构建的 CNN 中两个具有代表性的部分,即卷
积层和池化层.其中,卷积层的实现通过融合指令包含了激励层的操作.而全连接层的代码实现与卷积层代码类
似,仅在配置参数上略有不同,故不作列举.
2.3.1 卷积层代码示例
RV-CNN 实现的卷积层代码如图 7 所示,其中,左侧是在 Caffe 框架中编写的卷积层代码(用以示意),其完成
对输入特征图(14×14×512),使用 512 组尺寸为 3×3、步幅为 1 的卷积核进行特征提取的过程.图中右侧则是使
用专用指令完成相同功能的示意代码,其中假设硬件片上资源充足且数据排列顺序合适.
由于指令从寄存器中获取参数信息,因此我们首先需要向寄存器中加载必要的信息.这里首先加载立即数
0×0E0E0301 至$5 寄存器,根据第 2 节对指令格式的描述,该 32 位数据中由高至低的 4 个字节分别代表了输入
数据的高度(14)、宽度(14)、卷积核尺寸(3)以及步幅(1).之后设置向量寄存器 VLR 为 16,代表一次处理的向量
长度为 16.由于采用分片技术,这里设置循环计数器$11、$12 来完成深度方向和不同卷积核的遍历.随后,通过在
寄存器$6、$8、$10 中加载数据在片外 DDR 中的实际地址,以便通过 MLOAD/MSTORE 完成数据传输.以上寄
存器中的信息应由指令生成器或者用户根据网络模型以及硬件参数信息生成.在此基础上,开始实际计算过程.
首先分别将数据从片外 0×30000 和 0×50000 处加载至由$1 和$2 指定的片上目的地址.数据加载完毕后,通过执
行 MMM 指令完成计算.计算过程中的中间结果保存在片上便签存储器中.之后的计算通过使用 MMMS 指令完
成计算与片上中间结果累加,以减少不必要的片外访存.最终,通过执行 MMMSA 指令完成部分最终结果的激
活,并由 MSTORE 指令将结果传输至片外.
Fig.7 Convolutional layer code example implemented by RV-CNN
图 7 RV-CNN 实现的卷积层代码示例