算法如图,比较直观。
一、硬件架构设计
需要解决如下问题:
memorybandwidth。存储读取数据功耗和速度称为瓶颈,速度与conv硬件处理部分不匹配。所以文中很老套的方法,通过line buffer来复用每个tile交叠的部分(垂直和水平都有交叠的部分)。
1、整体架构
所有数据(input feature map, filter)都存在外部存储上。
有多通道(M)的input feature map,line buffer 的每一行存储所有channel的同一行。
Winograd PE 从 line buffer 取出数据。通过FIFO,进入FPGA。
使用double buffer 来 交叠数据。
在前向过程中,filter的数据不能全部存在on-chip memory中,所以把其按照channnel分成几组,每次处理一组。
2、Line Buffer Design
在on-chip memory上存储部分(n+m行)的line,用来data reuse。
每一行的输入line buffer,有 MxW 个元素。输出的line buffer每一行有 NxC 个元素,N是输出的channel数,C是output feature map的宽度。
由于不同的层,其feature map的大小也是不同的,所以这里硬件上取W为所有中最大的的width(ResNet处理ImageNet的话,最大就是第一层输入图像224x224,而MxW最大为112x64)。
为了reuse data,on-chip memory每次存 n+m 行input,也就是2个overlap的kernel的长度。 然后循环位移lines,相当于一个circular buffer。
当电路初始化时,处理电路Winograd engine直接从line buffer中读取前n行(存在on-chip),同时 line buffer 从外存中读取接下的m行。
当n行的数据开始处理时,同时并行地,将m行转移到on-chip memory中。(读取数据、移动数据,还是很多,假如就放在原地,只读不搬运,然后增加读取控制逻辑,能减少读取)
处理完该轮数据,pe跳过一个stride = m行,读取余下的n行,同时,该m行数据被重新写入接下来的m行新数据。
3、Winograd PE Design
将算法分解为四个步骤,可以有效的pipeline。
变换矩阵的计算都是offline完成的。
filter的变换相对也是固定的,可以offline完成。但是文中采用线上计算的方式,来节省on-chip BRAM资源。同时两个变换是并行的所以不会增加延迟。
使用DSP array来处理矩阵的点乘。
将变换矩阵和中间变量矩阵存在registers。(而不是local buffer)。这样可以提升访存带宽,因为避免了memory bank conflict。
变换矩阵的常数乘法,不使用DSP,而是用位移操作,其可以用FPGA 的 LUTarray来完成。
4、PE Parallelization
要使用PE并行化处理数据,首先对于数据,有行、列、输入channel、输出channel(row, col, ti, to)四个可以并行化的参数。
【7】有介绍不同的并行化方式。
本文选择对ti和to进行并行化处理,并行度分别为pm和pn,所以PE总的并行度为pm x pn,即采用loopunroll来实现并行化。(row会导致line buffer的增加,col会导致访存冲突)
我们还将输入,输出和滤波器buffer分区以维持高效的内存带宽。
需要处理的filter是4维的,将其划分为row, column, input and output channels。
硬件实现一个2维的输入输出buffer,并划分每一个维度。
下表是Memory 划分的方式:
5、参数设计
Tile size n; 并行参数pm , pn 都是需要考虑的设计参数。
对于n,一般越大,节省的乘法越多;但是其变换矩阵的数值越大,会导致精度损失。
使用16bit 定点数来表示data 和 filter。
取filter的精度为 2^-10。
为了保证上述精度要求,设n最大的取值为8。
资源消耗分析:
只有矩阵点乘需要用到DSP,所以
6、其他层的实现
Fully Connected (FC) layers, Pooling and Rectified Linear Unit (ReLU) layers
(1)全连接层
全连接层 可以看做是 矩阵和矢量相乘,把矢量展开可以看做是 矩阵点乘。
bypass前置处理电路,即可以reuse Win PE的乘法单元。
FC层的weight远大于输入的neuron。根据这个特性,将input neuron数值全部load 到 on-chip memory。weights通过FIFO接口读入。
batch提高memory bandwidth。
(2)ReLU & Pooling
ReLU and Pooling are implemented by introducing comparison operators to the output buffers.