2.3 卷积计算加速单元的设计思路
作为cnn网络中比重最大、最为核心的卷积计算加速单元,是cnn软核性能加速的关键,也占用了fpga芯片的大部分算力分配和逻辑资源消耗。下面将针对edgeboard卷积计算加速单元的设计思路进行简要介绍,此章节也是理解cnn软核算力弹性配置的技术基础。
每一层网络的卷积运算,有m个输入图片(称之为feature map,对应着一个输入通道),n个输出feature map(n个输出通道),m个输入会分别进行卷积运算然后求和,获得一幅输出map。那么需要的卷积核数量就是m*n。
针对上述计算特点,edgeboard的卷积单元采用脉动阵列的数据流动结构,将数据在pe之间通过寄存器进行打拍操作,可以实现在第二个pe计算结果出来的同时完成和前一个pe的求和。这样可以使数据在运算单元的阵列中进行流动,减少访存的次数,并且结构更加规整,布线更加统一,提高系统工作频率,避免了采用加法树等并行结构所造成的高扇出问题。
因此,如上图所示,我们可以分别从feature map和kernel两个维度去定义脉动阵列的并行结构。从feature map的角度,纵向的行与行直接卷积窗口相互独立,也就是输出的每行之间所对应的数据计算互不干扰,在此维度定义的多并发计算称之为window维度的并行度。从kernel的角度,为了达到计算结果的快速流出减少片上缓存占用,我们设计了每个kernel核之间的多并发计算,称之为kernel维度的并行度。以上两个维度同时并发既可以提高整体并行计算效率,也充分利用了脉动阵列的数据流水特性。
2.4 卷积计算加速单元的通用性扩展
前一章节详细介绍了基于pl实现的卷积计算加速单元的设计原理,那么如果是由于芯片的sram存储资源不够而导致的cnn网络参数支持范围较小,edgeboard将如何拓展cnn软核的网络支持通用性? 我们可以利用灵活的sdk调度管理单元提前将feature map或者kernel数据进行拆分,然后再执行算子任务的下发。
一条滑窗链的feature map数据不够存储
sdk可以将一条滑窗链的feature map数据分成b块,并将分块数b和每个块的数据量告诉卷积计算加速单元,那么后者则可以分批依次从ddr读取b次feature map数据,每次的数据量是可以存入到image sram内。
kernel的总体数据不够存储
sdk可以将kernel的数量分割成s份,使得分割后的每份kernel数量可以下发到pl侧的filter sram中,然后sdk分别调度s次卷积算子执行操作,所有的数据返回ddr后,再从通道(channel)维度做这s次计算结果的数据拼接(concat)即可。不过要注意的是,我们的filter sram虽然不需存储所有kernel的数据量,但至少要保证能够存储一个kernel的数据量。
由此看来,即使edgeboard三兄弟中最小的fz3拥有极其有限的片上存储资源,也是能够很好地完成大多数cnn网络的参数适配。