Reading Note(1)——DianNao

0.Briefly Speaking

本文于2014年发表于ASPLOS(Architectural Support for Programming Languages and Operating Systems ),文章的主要工作是提出了一个面向先进的(state-of-the-art)深度学习算法的高效加速器。
与之前的工作不同的地方在于,这篇文章专注于访存行为对加速器设计、性能和能耗的影响,而非像传统的加速器论文一样只注重对计算部分的实现。以往的加速器设计专注于对计算性能的极致挖掘,但是受制于Amdahl定律,当计算性能提高到一个水平时,访存行为就成为了制约性能提升的瓶颈。

这篇文章为加速器的设计提供了一个新思路,也就是在挖掘高性能计算架构的同时,不要忘记也要精心地设计加速器的存储结构,极大程度的挖掘算法的局部性,这同样会带来极大的性能和功耗提升。

1.Introduction

首先,文中介绍了面向深度学习场景设计加速器的可行性。特别的,作者提到目前发展的三点趋势:

  1. 计算设备的架构正在朝着由处理器和加速器混合的异构多核(heterogeneous multi-cores)的方向发展
  2. 深度学习算法在各个领域应用的场景越来越多
  3. 先进的机器学习算法数量十分有限(CNNs and DNNs),且行为有很多相同之处

以上三点使得做出一款兼顾高能效与广泛使用场景的加速器成为可能

2.Primer on Recent Machine-Learning Techniques

本部分简要的回顾了神经网络的发展历史和应用现状,并对神经网络的推理和训练、通用结构、卷积层、池化层、分类器层做了一些介绍。

3.Processor-Based Implementation of (Large) Neural Networks

这部分其实是对现有的神经网络层次进行了基于处理器的软件实现(Implemented In C),为后面的测试基准和加速器设计与实现做准备,在软件实现的过程中尽可能挖掘了各个层次的访存局部性问题,因此存在大量的分块技术的应用。对于CNNs和DNNs的软件设计与实现,这部分还是相当有借鉴意义的。

  1. 分类器层
    分类器层示意图
  2. 卷积层
    在这里插入图片描述
    3.池化层
    在这里插入图片描述
    另,这部分有很多关于访存局部性的分析,值得学习和理解。

4.Accelerator for Small Neural Networks

这部分介绍了一些关于小规模神经网络加速器的硬件实现思路,一个简单粗暴的方法就是将神经网络的结构一一映射到硬件单元上。神经元被映射为逻辑电路突触映射为锁存器或RAMs,但这样的实现方法只适用于网络规模较小的嵌入式场景下。
在这里插入图片描述
这样做会导致能够实现在硬件上的神经元数量十分有限,为了实现数量有限的硬件单元可以完成任意规模的神经网络运算,这里引入了分时复用硬件神经元的处理原则,将中间计算结果存放在片上RAMs中。但是随着网络结构越来越大,片上RAMs也不再够用。

5.Accelerator for Large Neural Networks

这部分是本文的核心,该部分从NFU(Neural Functional Unit)存储控制与编程三个部分对本文提出的加速器结构进行了叙述。以下是加速器结构示意图:
在这里插入图片描述

  1. NFU
    NFU本质上就是是用来完成网络不同层次计算任务的模块,在文章中分成3个阶段。在神经网络执行到不同层次(卷积、池化、分类器)的时候,NFU-1、NFU-2、NFU-3分别对应不同功能,甚至可以停止工作(对于池化层)。梳理如下:

    其中:
    NFU-1完成并行乘法
    NFU-2完成以加法树为硬件基础的快速加法/完成池化层的Max与Average操作
    NFU-3使用分段线性插值的方式完成激活函数运算。

    由于流水段之间的计算具有依赖性,故NFU-3的计算要等到NFU-2完成之后再进行。
    最后,相当多的实验数据表明,小字长数据类型不会对神经网络精度产生大的影响。所以本文中采用了16位定点数(其中6位用来表示整数部分,10为用来表示小数部分)代替浮点数进行运算。

  2. 存储
    因为本文的主要思路是专注于访存行为,所以对于存储器的结构设计自然的也到了核心地位。
    文章中主要有三方面的贡献:

    首先,在设计中,所有的缓冲区都是按照算法要求定制化的。文中称其为划分缓冲区(Split Buffer),也就是根据缓冲区存储数据种类的不同,定制化的设计它的位宽,这可以实现读取速率和功耗的双赢同时消除了数据冲突

    其次,存储结构有效地挖掘了输入数据和突触的局部性。包括使用DMA预读取将输入神经元缓冲器实现为一个环形缓冲器以获取时间重用对池化层输入缓冲器进行局部变换这部分因为图片损毁,细节难以理解 ) 等设计技术。

    最后,则是对输出数据局部性的挖掘。通过在NFU-2中设置专用寄存器,保证了部分和始终不退出流水线。另外,通过将部分和流转到输出缓存器中,在下一分块到来时将输出缓存器中的数据再次重新载入专用寄存器,保证了临时的分片部分和不会在内存和加速器之间传输,成功挖掘了输出数据局部性。

  3. 控制与编程
    加速器的一条指令中包含有5个槽,分别对应到加速器的控制处理器各个缓冲区NFU中,示意如下:
    在这里插入图片描述

6.Experimental Methodology

本部分是对实验平台和基准测试程序规格的介绍,文章中测量了三类计算平台。分别是C++版本的加速器模拟器计算机辅助设计工具实现的Verilog版本的加速器SIMD运算核心(按照第三部分对其进行分块优化、内层循环使用汇编书写)。基准测试程序示意如下:
在这里插入图片描述

7.Experimental Results

这部分对实验结果进行了汇报,从布局之后的加速器特征时间与吞吐量功耗三个角度进行阐述。

  1. 布局之后的加速器特征阐述了使用的硬件数量和理论算力,以及按照组成部分分类的面积功耗报告,展示如下
    在这里插入图片描述

  2. 时间和吞吐量部分给出了文章中实现的加速器SIMD核心的性能指标,并就此差异产生的原因进行了细致地剖析。实验结果图如下:
    在这里插入图片描述
    3.功耗部分证实了Amdahl定律和本文研究思路的正确性,事实证明,访存功耗确实是加速器功耗开销的主要来源。
    在这里插入图片描述

8.Related Work

介绍了与本文相关的其他工作,从略。

9.Conclusion

由于在Introduction部分介绍的几个趋势,所以兼顾高能效与广泛应用场景是可能的。通过挖掘各个层次的局部性特征,证实研发一款兼顾小尺寸与高性能的加速器是可行的。

Guess you like

Origin blog.csdn.net/zzy980511/article/details/120474385