Page 106 - 《软件学报》2020年第10期
P. 106
3082 Journal of Software 软件学报 Vol.31, No.10, October 2020
元以及内部控制器,其中,橙色和灰色箭头分别表示控制流和数据流.矩阵单元接收传入的指令信息以及寄存器
信息后存储到队列中.内部控制器(作为有限状态机)是矩阵单元的控制中心,其根据控制信息将唤醒子组件(如
果可用)以完成相应任务.否则,它将生成一个反馈信号以指示相应的功能单元正忙.缓冲模块本质上是一个片
上存储器,矩阵单元中的计算核心从中获取数据并将产生的结果写入.除融合指令会同时启动多个计算核心外,
计算单元大致上与粗粒度指令一一对应.最后,输入输出模块则负责根据有效地址在矩阵单元与片上便签存储
器之间进行数据传输.
由于矩阵乘法单元被卷积层和全连接层共用,其承担了大部分计算,因此该单元的实现对性能至关重要.这
里我们采用了脉动阵列结构实现的矩阵乘法,其结构如图 10 右侧部分所示.脉动阵列是一种高效且简单的矩阵
乘法实现方式,其通过二维网格将 MAC(multiply-accumulate)单元绑定在一起,除阵列的最外侧层(这里是最左
侧和最上侧)的计算单元直接与片上缓冲相连以获取数据外,其余计算单元均从其邻居中获得输入.这种方式在
MAC 阵列规模变大时将显著减少片上缓冲的扇入扇出.同时,数据在 MAC 单元之间流动性地传递也增加了数
据复用.例如,当 MAC 阵列为 12×16 时,矩阵 B 中的元素按行在不同时刻由左至右在阵列中传递,数据输出时复
用了 16 次;类似地,矩阵 A 中的元素按列在不同时刻由上至下在阵列中传递,输出时复用了 12 次.在这一过程中,
配合流水线优化,每周期只需要向阵列输入 28 个数,就可以进行 192 个 MAC 操作.此外,短的局部互连也降低了
布局布线的难度,因此,这里我们选择使用脉动阵列作为矩阵乘法的实现方式.
Fig.10 The block diagram of the matrix unit
图 10 矩阵单元的结构示意图
4.3 优化细节
数据复用.在处理卷积层时,对输入数据进行 Im2col 操作将在内存占用和带宽方面带来不菲的开销.例如,
当卷积核步幅为 1 时,与原始输入数据相比,转换后的输入矩阵消耗的内存约为原始的 K×K 倍.为了保留 Im2col
操作带来的好处,同时减少额外的开销,我们实现了片上 Im2col 缓冲区,并根据地址在片上对切片数据进行数据
重排和展开.设置 Im2col 缓冲区可以有效地增加数据复用,虽然并未减少输入数据的访问次数,但使用开销较小
的片上访问代替了开销大的片外访问,从而大大减少了该操作造成的额外的数据访问开销和外部带宽压力.
数据量化.传统上,无论是 CNN 的训练阶段还是预测阶段,其数据类型均采用 32 位单精度浮点数,这主要是
因为它是现代 GPU 的标准数据格式.但研究发现,CNN 对有限的数值精度具有固有的鲁棒性,在预测阶段使用
浮点计算并不是必须的.通过重训练和特定的微调手段,采用定点数进行预测造成的精度损失可以忽略不计(小
于 1%) [22] .对于许多 CNN 来说,甚至 8 位位宽就可以达到足够的精度.之所以采取量化操作,是因为权重和激活
的低位宽表示形式有助于避免昂贵的浮点计算,同时显著减少带宽需求和内存占用.DianNao [11] 中显示,在台积
电 65nm 工艺条件下,实现 32 位乘法器的面积和功耗要比 16 位乘法器的功耗高一个数量级.在这种权衡之下,
本文中矩阵单元的所有计算核心均采用 16 位定点数.