NVDLA学习笔记(2)
NVDLA学习笔记(2)
作者:夏风喃喃
参考:http://nvdla.org/index.html
文章目录
- NVDLA学习笔记(2)
- 硬件手册:硬件架构规范
- 一. 绪论
- 二. 功能描述
- 2.1 卷积操作
- 2.1.1 直接卷积模式(Direct Convolution Mode)
- 2.1.2 图像输入卷积模式(Image-Input Convolution Mode)
- 2.1.3 Winograd 卷积模式(Winograd Convolution Mode)
- 2.1.4 批卷积模式(Batching Convolution Mode)
- 2.1.5 卷积缓冲器(Convolution Buffer)
- 2.2 单数据点操作(Single Data Point Operations)
- 2.2.1 线性函数(Linear Functions)
- 2.2.2 非线性函数(Non-Linear Functions)
- 2.3 平面数据操作(Planar Data Operations)
- 2.4 多平面操作(Multi-Plane Operations)
- 2.5 数据存储和整形操作(Data Memory and Reshape Operations)
- 2.5.1 桥 DMA (Bridge DMA)
- 2.5.2 数据整形引擎(Data Reshape Engine)
- 三. 硬件参数
- 3.1 功能选择
- 3.1.1 数据类型(Data Type)
- 3.1.2 Winograd
- 3.1.3 批量(Batching)
- 3.1.4 稀疏压缩(Sparse Compression)
- 3.1.5 第二内存总线(Second Memory Bus)
- 3.1.6 图像输入(Image Input)
- 3.1.7 单数据点支持(Single Data Point Support)
- 3.1.8 桥 DMA 支持(Bridge DMA Support)
- 3.1.9 数据整形引擎支持(Data Reshape Engine Support)
- 3.2 设计规模
- 3.2.1 原子-C(Atomic–C)
- 3.2.2 原子-K(Atomic–K)
- 3.2.3 单数据点吞吐量(Single Data Point Throughput)
- 3.2.4 平面数据处理器吞吐量(Planar Data Processor Throughput)
- 3.2.5 跨通道数据处理器吞吐量(Cross-Channel Data Processor Throughput)
- 3.2.6 卷积缓冲器块(Convolution Buffer Banks)
- 3.2.7 卷积缓冲器块尺寸(Convolution Buffer Bank Size)
- 3.2.8 卷积分批(Convolution Batching)
- 3.3 数据类型和精度(Data Types and Precision)
- 3.3.1 精密缩放转换器(Precision Scaling Convertor)
- 3.3.2 精密移位器(Precision Shifter)
- 3.3.3 查找表(Look Up Table)\
- 3.4 小 NVDLA 实现示例(Small NVDLA Implementation Example)
- 3.5 大 NVDLA 实现示例(Large NVDLA Implementation Example)
- 四. 外部接口、
- 4.1 配置空间总线(Configuration space bus)
- 4.1.1 时钟和复位(Clock and reset)
- 4.1.2 请求通道(Request channel)
- 4.1.3 读数据通道(Read data channel)
- 4.1.4 写响应通道(Write response channel)
- 4.1.5 接口时序(Interface timing)
- 4.2 主机中断(Host interrupt)
- 4.3 系统互联:DBBIF(System interconnect: DBBIF)
- 4.3.1 时钟和复位(Clock and reset)
- 4.3.2 AW(写请求)通道
- 4.3.3 AR(读请求)通道
- 4.3.4 W(写数据)通道
- 4.3.5 B(写响应)通道
- 4.3.6 R(读数据)通道
- 4.4 片上 SRAM 接口——SEAMIF(On-Chip SRAM Interface - SRAMIF)
- 五. 寄存器接口(Register Interface)
- 5.1 乒乓同步机制(Ping-pong Synchronization Mechanism)
- 5.1.1 实现(Implementation)
- 5.1.2 编程序列(Programming sequence)
- 5.2 地址空间布局(Address space layout)
- 5.2.1 GLB
- 5.2.2 MCIF
- 5.2.3 SRAMIF
- 5.2.4 BDMA
- 5.2.5 CDMA
- 5.2.6 CSC
- 5.2.7 CMAC_A
- 5.2.8 CMAC_B
- 5.2.9 CACC
- 5.2.10 SDP_RDMA
- 5.2.11 SDP
- 5.2.12 PDP_RDMA
- 5.2.13 PDP
- 5.2.14 CDP_RDMA
- 5.2.15 CDP
- 5.2.16 RUBIK
硬件手册:硬件架构规范
一. 绪论
NVIDIA深度学习加速器 (NVDLA) 是一个可配置的固定功能硬件加速器,针对深度学习应用中的推理操作。它通过暴露与每个 CNN 层相关的操作(例如,卷积、下卷、完全连接、激活、汇集、本地响应正常化等),为卷积神经网络 (CNN) 提供完整的硬件加速。维护独立和独立配置的块意味着 NVDLA 可以大小为许多较小的应用程序,其中以前由于成本、区域或电源限制而无法进行推算。此模块化架构可实现高度可配置的解决方案,可随时缩放以满足特定的推算需求。
本文件侧重于 NVIDIA 深度学习加速器的逻辑组织和控制。它为控制基本操作的块和接口提供信息。本文档中详述的块包括功能概述、配置选项和该块的注册列表。所有块的所有功能和功能可能不存在于每个 NVDLA 实现中。
二. 功能描述
NVDLA操作从管理处理器(微控制器或主CPU)发送一个硬件层的配置以及“激活”命令开始。 如果数据依赖性不排除这一点,多个硬件层可以被发送到不同的块并同时被激活(即,如果存在另一层,其输入不依赖于来自前一层的输出)。因为每个块的配置寄存器都有一个双缓冲区,所以它还可以捕获第二层的配置,以便在活动层完成后立即开始处理。一旦硬件引擎完成其活动任务,它将向管理处理器发出中断以报告完成,然后管理处理器将再次开始该过程。这个命令-执行-中断流程重复进行,直到整个网络上的推理完成。
NVDLA有两种工作模式:独立模式和融合模式。 独立操作是指每个单独的块被配置为何时执行以及执行什么,每个块都在执行其分配的任务。独立操作开始和结束于分配的块执行存储器到存储器的操作,进出主系统存储器或专用SRAM。融合操作类似于独立操作,但是,有些区块可以组装成管道;这通过绕过通过存储器的往返行程来提高性能,而是让块通过小FIFOs相互通信(即卷积核可以将数据传递给单数据点处理器,该处理器可以将数据传递给平面数据处理器,然后传递给跨通道数据处理器,而无需在其间执行存储器到存储器的操作)。
NVDLA 架构中的每个块都存在,以支持深神经网络推理中不可或缺的特定操作。推理操作分为五组:
- 卷积操作(卷积核心和缓冲区块)
- 单数据点操作(激活引擎块)
- 平面数据操作(池化引擎块)
- 多平面操作(局部响应归一化块)
- 数据存储和形变操作(形变和桥 DMA 块)
不同的深度学习应用需要不同的推理操作。 例如,真实图像分割的工作量与人脸检测的工作量大不相同。因此,任何给定的 NVDLA 设计的性能、面积和功率要求都会有所不同。NVDLA 架构实现了一系列硬件参数,用于定义功能选择和设计大小。这些硬件参数为创建 NVDLA 硬件设计规范提供了基础。设计规范可识别 NVDLA 实现的支撑功能和性能特性。
2.1 卷积操作
卷积运算处理两组数据:一组离线训练的“权重”(在每次推理之间保持不变),一组输入的“特征”数据(随网络的输入而变化)。 NVDLA卷积引擎公开了支持几种不同操作模式的参数。这些模式中的每一种都包括优化,可以提高原始卷积实现的性能:
- 直接
- 图像输入
- Winograd
- 批量
启用不同的操作模式允许以更高的效率将许多不同大小的卷积映射到硬件上。对稀疏权重压缩的支持节省了内存带宽。 内置的Winograd卷积支持提高了某些尺寸过滤器的计算效率。批处理卷积,可以通过在并行运行多个推理时重用权重来节省额外的内存带宽。为了避免重复访问系统内存,NVDLA卷积引擎有一个内部RAM,专门用于存储权重和输入特征,称为“卷积缓冲区”。与每次需要权重或特征时向系统内存控制器发送请求相比,这种设计大大提高了内存效率。
2.1.1 直接卷积模式(Direct Convolution Mode)
直接卷积模式是基本的运行模式。NVDLA 采用了宽乘累加 (MAC) 流水线,以支持高效的并行直接卷积操作。影响卷积功能性能的有两个关键因素:内存带宽和 MAC 效率。
NVDLA 支持两个内存带宽优化功能,这些功能可显著帮助降低 CNN 层的内存带宽要求,这些要求需要大量数据交换,例如全连接的图层。
- 稀疏压缩。 减少数据特征和/或权重数据,内存总线上的流量越少。60% 的稀疏网络(60% 的数据为零)几乎可以将内存带宽要求降低到一半。
- 第二个内存接口。 提供高效的片上缓冲,可增加内存流量带宽,并降低内存流量延迟。通常,片上 SRAM 可提供 2 倍~4 倍的 DRAM 带宽,延迟为 1/10 ~ 1/4。
影响卷积函数性能的第二个关键因素是MAC效率。MAC实例的数量由(Atomic-C *Atomic-K)决定。但是,如果图层的输入特征数据通道数与Atomic-C设置不一致,或者输出特征数据kernel数与Atomic-K设置不一致,则有时并非所有MAC都有效,这将导致MAC利用率下降。例如,如果NVDLA设计规范具有Atomic-C = 16和Atomic-K = 64(这将导致1024个MAC实例),并且网络的一层具有输入特征数据通道号= 8和输出特征数据内核号= 16,则MAC利用率将仅为1/8(即,将仅利用128个MAC,而其他MAC始终处于空闲状态)。
硬件参数:
- Atomic – C尺寸
- Atomic – K尺寸
- 数据类型支持
- 功能支持——压缩
- 功能支持——第二存储总线
2.1.2 图像输入卷积模式(Image-Input Convolution Mode)
图像输入模式是第一层的特殊直接卷积模式,包含来自图像表面的输入特征数据。考虑到图像表面格式与正常特征数据格式有很大不同,特征数据提取操作遵循与直接卷积操作不同的路径。通常第一层只有3个通道用于图像输入,这里增加了额外的逻辑来提高MAC的利用率。 即使第一层有3个(甚至1个)通道,通道扩展功能也能保持平均MAC利用率接近50%,即使Atomic-C设置很大(例如16个)。
硬件参数:
- 全部来自直接卷积模式+
- 图像输入支持
2.1.3 Winograd 卷积模式(Winograd Convolution Mode)
Winograd卷积是指用于优化直接卷积性能的可选算法。Winograd卷积减少了乘法次数,同时增加了加法器来处理额外的变换。 由于预计算和后计算的加法次数都比MAC阵列中的操作次数少得多,因此操作总数会减少。对于相同的卷积函数,避免了大量的MAC操作。例如,与Winograd的3×3滤波器大小的卷积将MAC运算次数减少了2.25倍,从而提高了性能和能效。权重转换是离线完成的,因此总权重数据大小预计会增加。Winograd特性对于数学限制的图层非常有用;3x3或更大的滤波大小的图层总是受到数学限制,因此与winograd功能非常匹配。
卷积核使用的Winograd卷积方程为:
这里的符号⊙表示元素乘法。这意味着winograd函数需要在正常直接卷积MAC阵列之前预先计算固定矩阵运算,并在正常直接卷积MAC阵列之后后计算另一个固定矩阵运算。
硬件参数:
- 功能支持——Winograd
2.1.4 批卷积模式(Batching Convolution Mode)
NVDLA批处理功能支持一次处理多组输入激活(来自多个图像)。这复用了权重并节省了大量内存带宽,从而提高了性能和功耗。全连接层的内存带宽需求远大于计算资源。全连接层中的权重数据的大小非常重要,并且仅在MAC功能中使用一次(这是内存带宽瓶颈的主要原因之一)。允许多组激活共享相同的权重数据意味着它们可以同时运行(减少整体运行时间)。 单个批次的运行时间接近单层的运行时间;整体性能接近 [batching_size] × [single-layer performance].。
支持大批量意味着激活缓冲的大面积成本。最大批处理大小受到卷积缓冲区大小的限制,因此最大批处理数量是设计规范中的硬件限制。
硬件参数:
- 批量功能支持
- 最大批数量
2.1.5 卷积缓冲器(Convolution Buffer)
卷积缓冲器是卷积核心的一个流水线级。 它包含卷积函数的权重数据和特征数据。权重数据大小与特征数据大小的比率在不同的网络中甚至在单个网络中是不同的(不同的层在特征和权重数据之间可以有完全不同的比率)。为了适应这些差异,卷积缓冲器支持权重数据和特征数据的可配置存储策略。
卷积缓冲器需要至少4个端口用于数据访问:
- 特征数据读取端口
- 权重数据读取端口
- 特征数据写入端口
- 权重数据写入端口
卷积缓冲区的大小取决于各种因素;主要因素是CNN大小(即特征数据大小和权重数据大小)。如果一个硬件层的权重数据或特征数据的完整大小可以存储在卷积缓冲器中(不需要多次提取数据),则是优选的。卷积读取带宽决定了读取端口的宽度。为了在单个周期中馈送所需数量的Atomic-C数据,需要(data_size*Atomic-C)的数据宽度。例如,对于INT8卷积函数中16的Atomic-C,需要128位宽度(16字节)。
硬件参数:
- BUFF bank #
- BUFF bank 尺寸
2.2 单数据点操作(Single Data Point Operations)
单一数据点处理器(SDP)允许将线性和非线性函数应用到单个数据点。 这通常在CNN系统中卷积后立即使用。SDP为线性函数提供了本地支持(例如,简单的偏置和缩放),并使用查找表来实现非线性函数。这种组合支持最常见的激活函数以及其他元素操作,包括:ReLU、PReLU、精度缩放、批处理归一化、偏差加法或其他复杂的非线性函数,如sigmoid或双曲正切tanh。
硬件参数:
- SDP 函数支持
- SDP 吞吐量
2.2.1 线性函数(Linear Functions)
NVDLA支持线性函数的多个实例(大部分是缩放函数)。有几种方法可以用来设置缩放因子和偏差:1) CNN设置——缩放因子和偏差在整个CNN中是相同的,这个缩放因子来自一个寄存器配置;2)通道设置——单个平面内的比例因子和偏差相同(即通道值相同),这些比例因子来自内存接口;3)每像素设置——比例因子和偏差对于每个单独的特征是不同的,这些因子和偏差将来自内存接口。
- 精度缩放。 在整个推理过程中控制内存带宽;在切块到较低精度并写入内存之前,可以将特征数据缩放到其全部范围。缩放关键资源(例如,MAC阵列)以支持最佳推理结果的全范围(可以应用其他线性函数)。在任何非线性函数之前恢复输入数据(即,将非线性函数的输入数据保留为原始数据)。
- 批量标准化。 在推理函数中,批量标准化需要一个带有训练比例因子的线性函数。SDP可以支持每层参数或每通道参数来执行批处理规范化操作。
- 偏差加法。 有些层在输出端需要偏置功能,这意味着它们需要为最终结果提供一个偏移量(从每层设置或每通道存储表面或每特征存储表面)。
- 元素操作。 元素层(在某些CNN中使用)是指两个具有相同大小的特征数据立方体之间的一种操作。这两个W×H×C特征数据立方体进行逐元素的加法、乘法或最大/最小比较运算,输出一个W×H×C特征数据立方体。NVDLA支持元素操作中的常见操作(例如,加、减、乘、最大)。
2.2.2 非线性函数(Non-Linear Functions)
支持深度学习算法需要几个非线性函数。 其中一些使用专用硬件逻辑来支持,而更复杂的功能包括使用专用查找表。
- ReLU,对于输入,输出是max(x,0)max(x,0)max(x,0)
- PReLU,与ReLU不同,PReLU仍然保持一个值小的线性因子,而不是切为零:
- Sigmoid,对于输入xxx,输出为11+e−x\frac{1}{1+e^{-x}}1+e−x1
- tanh,对于输入xxx,输出为1−e−2x1+e−2x\frac{1-e^{-2x}}{1+e^{-2x}}1+e−2x1−e−2x
- 更多……
2.3 平面数据操作(Planar Data Operations)
平面数据处理器(PDP)支持CNN应用中常见的特定空间操作。它可以在运行时进行配置,以支持不同的池化大小,并支持三种池化函数:
- 最大池化——得到池化窗口的最大值
- 最小池化——得到池化窗口的最小值
- 平均池化——平均池化窗口中的特征值
PDP有一个专用的存储器接口,用于从存储器获取输入数据,并直接输出到存储器。
硬件参数:
- PDP 吞吐量
2.4 多平面操作(Multi-Plane Operations)
跨通道数据处理器(CDP)是一个专门用于应用局部响应归一化(LRN)函数的单元,这是一个在通道维度上运行的特殊归一化函数,与空间维度相反。
硬件参数:
- CDP 吞吐量
2.5 数据存储和整形操作(Data Memory and Reshape Operations)
2.5.1 桥 DMA (Bridge DMA)
桥DMA(BDMA)模块提供数据复制引擎,在系统DRAM和专用高性能存储器接口之间移动数据。提供在这两个非连接的内存系统之间移动数据的加速路径。
硬件参数:
- BDMA 函数支持
2.5.2 数据整形引擎(Data Reshape Engine)
数据整形引擎执行数据格式转换(例如,拆分或切片、合并、收缩、整形-转置)。在卷积网络上执行推理的过程中,内存中的数据经常需要重新配置或整形。例如:“切片”操作可用于分离出图像的不同特征或空间区域;“整形-转置”操作(在去卷积网络中很常见)创建的输出数据比输入数据集具有更大的维度。
Rubik函数转换数据映射格式,无需任何数据计算。它支持三种工作模式:
- 契约模式。 Rubik转换映射格式中的契约模式用于去扩展立方体。这是支持反卷积的第二个硬件层。通常,软件反卷积层的反卷积x步距和y步距大于1;随着这些步伐,第一阶段硬件层的输出是一个通道扩展的数据立方体。
- 拆分模式和合并模式。 拆分和合并是Rubik中两种相反的操作模式。拆分将数据立方体转换为M平面格式。平面的数量等于通道的大小。合并将一系列平面转换为特征数据立方体。
硬件参数:
- Rubik 函数支持
三. 硬件参数
不同的深度学习应用需要不同的推理操作。例如,真实图像分割的工作量与人脸检测的工作量有很大不同。因此,任何给定的NVDLA设计的性能、面积和功耗要求都会有所不同。NVDLA通过一组可配置的硬件参数来解决这个问题,这些参数用于创建符合应用需求的实现。
硬件参数为创建NVDLA硬件设计规范提供了基础。设计规范确定了NVDLA实施支持的特性和性能特征。有两类硬件参数:功能选择和设计规模。 给定的NVDLA实现由选定的参数和设置定义。
3.1 功能选择
3.1.1 数据类型(Data Type)
NVDLA可以支持特定网络的一种数据类型,也可以支持更通用的多种数据类型。考虑到面积成本和能效,NVDLA硬件架构可以在不同的数据类型之间进行适当的共享。
- 参数:数据类型支持
- 值:Binary/INT4/INT8/INT16/INT32/FP16/FP32/FP64
- 受影响的操作:All
3.1.2 Winograd
Winograd是卷积函数的一个优化特性。它可以通过提高MAC效率来提高性能,还可以帮助提高整体能效。
- 参数:功能支持–Winograd
- 可能值:Yes/No
- 受影响的操作:Convolution
3.1.3 批量(Batching)
批处理是卷积的一个优化特性。它通过提高MAC效率和节省内存流量来提高性能。
- 参数:功能支持–batch
- 可能值:Yes/No
- 受影响的操作:Convolution
3.1.4 稀疏压缩(Sparse Compression)
稀疏压缩是卷积的优化特征。它可以减少内存流量总量,从而提高性能并节省功耗。
- 参数:功能支持–Sparse Compression
- 可能值:Weight/Feature/Neither/Both
- 受影响的操作:Convolution
3.1.5 第二内存总线(Second Memory Bus)
NVDLA总是通过其DBBIF与外部存储器有一个基本接口。除此之外,NVDLA还可以支持第二个内存总线接口SRAMIF。该接口可以连接到片内SRAM或其他高带宽低延迟总线,以提高整体性能。
- 参数:功能支持–Second Memory Bus
- 可能值:Yes/No
- 受影响的操作:All
3.1.6 图像输入(Image Input)
平面图像数据是深度学习的重要输入资源,有大量的图像表面格式。因此,NVDLA输入支持的格式对于NVDLA的第一个硬件层非常重要。
- 参数:Image input support
- 可能值:组合8-bit/16-bit/both; RGB/YUV/both; non-planar/semi-planar/full-planar
- 受影响的操作:Convolution
3.1.7 单数据点支持(Single Data Point Support)
有许多非线性曲线用作深度学习的激活函数,包括§ReLU、tanh、sigmoid等。其中一些,如ReLU,非常简单,可以通过超出阈值的缩放轻松实现;其他的需要额外的内存使用查找表来近似。
- 参数:SDP function support
- 可能值:Scaling/LUT
- 受影响的操作:Single Data Point
3.1.8 桥 DMA 支持(Bridge DMA Support)
在NVDLA支持第二存储器接口的情况下,桥接DMA (BDMA)单元可以在主存储器接口和第二存储器接口之间进行数据复制。
- 参数:BDMA function support
- 可能值: Yes/No
- 受影响的操作:MISC
3.1.9 数据整形引擎支持(Data Reshape Engine Support)
Rubik函数转换数据映射格式,无需任何数据计算。
- 参数:Rubik function support
- 可能值: Yes/No
- 受影响的操作:MISC
3.2 设计规模
设计规模参数表示NVDLA硬件支持的并行度。更大的值通常意味着更高的性能,但是伴随着更高的面积和/或功率成本。
3.2.1 原子-C(Atomic–C)
该值指示输入特征通道维度中的MAC操作。此参数影响总MAC数、卷积缓冲区读取带宽。
- 参数:Atomic – C sizing
- 可能值: 16~128
- 受影响的操作:Convolution
3.2.2 原子-K(Atomic–K)
该值指示输出特征通道维度上的并行MAC操作。此参数影响总MAC数、累加器实例数、卷积写回带宽。由于MAC阵列有2个维度,所以总的MAC数量是(Atomic-C * Atomic-K)。
- 参数:Atomic – K sizing
- 可能值: 4~16
- 受影响的范围:Convolutional function
Atomic-C 和 Atomic-K 参数都是指最低精度,较高的精度可能会相应降低。例如,如果NVDLA同时支持INT8和INT16,那么Atomic-C和Atomic-K参数指的是INT8的情况,预计INT16的并行性较低。
3.2.3 单数据点吞吐量(Single Data Point Throughput)
单数据点吞吐量表示单数据点流水线的实例数。SDP流水线的数量决定了每个周期可以生成的输出特征的数量。
- 参数:SDP throughput
- 可能值: 1~16
- 受影响的操作:SDP
3.2.4 平面数据处理器吞吐量(Planar Data Processor Throughput)
平面数据处理器(PDP)吞吐量表示每个周期可以生成的输出特征的数量。值为0表示将不包括PDP块,并且不支持平面数据处理器操作。
- 参数:PDP throughput
- 可能值: 0~4
- 受影响的操作:PDP
3.2.5 跨通道数据处理器吞吐量(Cross-Channel Data Processor Throughput)
CDP吞吐量表示每个周期可以生成的输出特征的数量。值0表示不包含CDP块,并且最终实现不支持多平面操作。
- 参数:CDP throughput
- 可能值: 0~4
- 受影响的操作:CDP
3.2.6 卷积缓冲器块(Convolution Buffer Banks)
该值指示卷积缓冲库的数量。存储体的数量定义了权重和激活之间CBUF存储分配的粒度。它们与存储体大小参数一起决定了整个卷积缓冲器的大小。
- 参数:BUFF bank #
- 可能值: 2~32
- 受影响的操作:Convolution
3.2.7 卷积缓冲器块尺寸(Convolution Buffer Bank Size)
该值指示单个卷积缓冲库的大小。它们与存储体编号参数一起决定了整个卷积缓冲区的大小。
- 参数:BUFF bank size
- 可能值: 4KB~32KB
- 受影响的操作:Convolution
3.2.8 卷积分批(Convolution Batching)
该值表示卷积函数可以支持的最大批处理数。通常该参数的较大值会对面积产生影响,因为累加器侧需要更多的缓冲。
- 参数:MAX Batch number
- 可能值: 1~32
- 受影响的操作:Convolution
3.3 数据类型和精度(Data Types and Precision)
NVDLA支持基于不同工作负载的多种数据类型推断。对于给定的功率和性能约束,可以使用这些参数来提高网络精度。浮点数据精度高(FP64/FP32/FP16);整数数据类型(INT16/INT8/INT4),甚至单比特二进制都可以用于精度较低的应用。
3.3.1 精密缩放转换器(Precision Scaling Convertor)
精密缩放转换器通常在一些非常关键的有限资源之前使用,例如在将数据写入内存或进入MAC阵列之前。
转换器的公式是:y=saturation((x−offset)∗scaling>>shifter)y=saturation((x−offset)∗scaling>>shifter)y=saturation((x−offset)∗scaling>>shifter)
3.3.2 精密移位器(Precision Shifter)
移位器主要用于流水线中间的比特调整。 例如,累加器的位宽远远大于输入数据,因此在数据发送到SDP之前,我们需要通过移位器对其进行分块。
移位器是一个简化的转换器,公式如下:y=saturate(x<<shifter)y=saturate(x<<shifter)y=saturate(x<<shifter)
3.3.3 查找表(Look Up Table)\
LUT用于处理网络中非线性函数,例如sigmoid和tanh激活函数,或者用于局部响应归一化。
3.4 小 NVDLA 实现示例(Small NVDLA Implementation Example)
小型NVDLA实现以较小的工作负载为目标,因此,这些实现只需要非常基本的支持。因为工作量轻,64个Atomic-C=16,Atomic-K=4的INT8 MACs应该足够好了。 所有其他优化功能都可以删除,以节省面积。对于图像输入格式,支持像A8R8G8B8这样的基本格式已经足够好了。 如果需要池化和归一化功能,可以限制吞吐量。至于卷积缓冲器,可以支持4个存储体,每个存储体大小为8KB(总共32KB)。
硬件参数设置示例:
- Data type supporting = INT8
- Feature supporting - Winograd = No
- Feature supporting - Second Memory Bus = No
- Feature supporting - Compression = No
- Image input support = R8, A8B8G8R8, A8R8G8B8, B8G8R8A8, R8G8B8A8, X8B8G8R8, X8R8G8B8, B8G8R8X8, R8G8B8X8, Y8___U8V8, Y8___V8U8
- SDP function support = Single Scaling
- BDMA function support = No
- Rubik function support = No
- Atomic - C sizing = 8
- Atomic - K sizing = 8
- SDP throughput = 1
- PDP throughput = 1
- CDP throughput = 1
- BUFF bank # = 32
- BUFF bank size = 4KB
3.5 大 NVDLA 实现示例(Large NVDLA Implementation Example)
较大的NVDLA实施针对较重的工作负载。当主要强调更高的性能和多功能性时,该模型是更好的选择。将Atomic-C和Atomic-K提高到64/16可将NVDLA性能提高到每个周期最多2K次操作;启用所有其他优化进一步增加了实际操作。其他后处理吞吐量也需要增加(如PDP和CDP吞吐量改为4)。 当瞄准更大的CNN时,设置更大的卷积缓冲区(例如,32KB * 16 = 512KB)。
硬件参数设置示例:
- Data type supporting = FP16/INT16
- Feature supporting - Winograd = Yes
- Feature supporting - Second Memory Bus = Yes
- Feature supporting - Compression = Yes
- Image input support = A8R8G8B8/YUV16 Semi-planar
- SDP function support = Scaling/LUT
- BDMA function support = Yes
- Rubik function support = No
- Atomic - C sizing = 64
- Atomic - K sizing = 16
- SDP throughput = 16
- PDP throughput = 4
- CDP throughput = 4
- BUFF bank # = 16
- BUFF bank size = 32KB
四. 外部接口、
NVDLA作为一个整体,有四个系统接口。这些是:
- 配置空间总线(“CSB”): 主机系统通过一个非常简单的地址/数据接口访问和配置NVDLA寄存器组。 有些系统可以用合适的总线桥将主机中央处理器直接连接到CSB接口;其他可能更大的系统将改为将一个小型微控制器连接到CSB接口,将管理NVDLA的一些工作卸载到外部内核。
- 外部中断(“IRQ”): NVDLA中的某些状态要求向命令NVDLA的处理器以异步进行报告,这些状态包括操作完成和错误情况。 外部中断接口提供单个输出引脚,作为CSB接口的补充。
- 数据中枢(“DBBIF”): NVDLA包含自己的DMA引擎,用于从系统的其余部分加载和存储值(包括参数和数据集)。 数据中枢是一个兼容AMBA AXI4标准的接口,用于访问大量相对高延迟的内存(如系统DRAM)。
- 静态随机存取存储器连接(“SRAMIF”): 一些系统可能需要比系统DRAM更高的吞吐量和更低的延迟,并且可能希望使用小型SRAM作为高速缓存来提高NVDLA的性能。为可选的SRAM提供了一个兼容AXI4标准的第二接口,以连接到NVDLA。
下面,我们介绍两个集成NVDLA的平台示例,以及它们如何将这些外部连接连接到系统的其余部分。
图6显示了一个小型系统,其NVDLA直接连接到主CPU。这个小系统没有NVDLA专用的SRAM,所有的访问都命中主系统内存。相比之下,图7显示了一个稍大的系统,其中NVDLA连接到微控制器,微控制器负责管理NVDLA编程的小细节(因此,将主CPU从服务低级NVDLA中断中解放出来)。后一个系统还集成了一个SRAM,连接到NVDLA。(系统上的其他单元也可以连接到这个SRAM,并根据自己的需要共享它;图中没有显示。)
4.1 配置空间总线(Configuration space bus)
CPU使用CSB接口来访问NVDLA寄存器。CSB接口故意极其简单,而且性能低下;因此,在CSB和平台上可能支持的任何其他系统总线之间构建适配器应该很简单。CSB总线由三个通道组成:请求通道、读取数据通道和写入响应通道。 这些通道如下所述。
4.1.1 时钟和复位(Clock and reset)
CSB接口使用单个时钟域,由NVDLA和请求者共享。
4.1.2 请求通道(Request channel)
请求通道遵循valid/ready协议;当且仅当valid
信号(来自主机)和ready
信号(来自NVDLA)都在同一时钟周期内被断言时,请求通道上才会发生数据事务。对CSB的每个请求都有固定请求大小32位数据,16位地址。 CSB不支持任何形式的突发请求;通过请求信道发送的每个数据包都独立于任何其他数据包。
4.1.3 读数据通道(Read data channel)
下表描述了读取数据响应通道。NVDLA按照严格的请求顺序向主机返回读响应数据;也就是说,write
被设置为0的每个请求包(如上)将只有一个响应,并且该响应不能相对于其他读取向前或向后跳转。读取数据通道遵循valid-only的协议;因此,主机不能对该接口上的NVDLA反向施压。
NVDLA不支持来自CSB的错误报告。非法读取(例如,指向地址空洞的读取)将返回零。
4.1.4 写响应通道(Write response channel)
下表描述了与写响应通道相关的信号。对于每个non-posted的写入,NVDLA将按照请求顺序向主机返回写入完成。
写完成通道也遵循valid-only的协议,因此,主机不能在此接口上对NVDLA反向施压。
4.1.5 接口时序(Interface timing)
图8中的时序图说明了请求者和NVDLA之间的CSB总线上的4个事务(2个写,2个读)。
csb2nvdla_valid
高电平时,如果csb2nvdla_write
为高电平则写数据,csb2nvdla_wdat
和csb2nvdla_addr
同时给出写的数据和地址;如果csb2nvdla_write
为低电平则读数据,csb2nvdla_addr
给出要读的数据的地址。csb2nvdla_ready
则在高电平时,表示nvdla对读或写数据的就绪。这时,可以根据csb2nvdla_nposted
的情况,决定是否返回nvdla2csb_wr_complete
写完成的响应。根据nvdla2csb_valid
,决定何时开始发送CSB读的数据nvdla2csb_data
。
4.2 主机中断(Host interrupt)
除了配置空间总线,NVDLA还提供了一个异步(中断驱动)返回通道,将事件通知传递给CPU。中断信号是一个电平驱动的中断,只要NVDLA内核有未决的中断,该中断就会被置为高电平。如果在GLB的INTR_STATUS
寄存器中设置了任何位,而这些位在INTR_MASK
寄存器中没有被屏蔽掉(即设置为零),则中断处于挂起状态。 NVDLA中断信号与CSB接口处于同一时钟域。
4.3 系统互联:DBBIF(System interconnect: DBBIF)
NVDLA有两个主要接口与存储系统交互,这两个接口分别称为DBBIF(在信号命名中称为core2dbb
)和SRAMIF(在信号命名中称为core2sram
)。DBBIF接口旨在连接到片上网络,该网络连接到系统存储器,而SRAMIF旨在连接到可选的片上静态随机存取存储器,该存储器具有更低的存储器延迟和潜在的更高吞吐量。DBBIF和SRAMIF接口都符合AXI4标准。本节详细描述了DBBIF接口。
NVDLA数据主干接口支持32、64、128、256或512位的可配置数据总线宽度。为了容忍内存延迟,内部缓冲区可以配置为支持最多256个可配置数量的未完成请求。
数据中枢接口遵循类似AXI的协议,但会假设简化接口协议。
- 始终发出增量突发请求
- 突发大小始终与数据宽度对齐
- 请求地址始终与数据宽度对齐
- 写入必须始终得到确认,读取必须始终获得返回数据
- 写入必须在NVDLA获得写入确认时提交到内存
- 读取必须始终从内存中获得实际值
- 写入确认必须以写入请求顺序返回
- 读取数据必须以读取请求顺序返回
4.3.1 时钟和复位(Clock and reset)
NVDLA DBBIF假设同步数据主干接口具有单个时钟域和复位。因此,所有NVDLA DBBIF端口都是主NVDLA核心时钟域的一部分。与SOC数据中枢的同步需要在NVDLA内核之外完成。
4.3.2 AW(写请求)通道
下表列出了AW通道上的所有信号,隐含前缀为nvdla_core2dbb_aw_
。
4.3.3 AR(读请求)通道
下表列出了AR通道上的所有信号,隐含前缀为nvdla_core2dbb_ar_
。
4.3.4 W(写数据)通道
下表列出了W通道上的所有信号,隐含前缀为nvdla_core2dbb_w_
。
4.3.5 B(写响应)通道
下表列出了B通道上的所有信号,隐含前缀为nvdla_core2dbb_b_
。
4.3.6 R(读数据)通道
下表列出了R通道上的所有信号,隐含前缀为nvdla_core2dbb_r_
。
4.4 片上 SRAM 接口——SEAMIF(On-Chip SRAM Interface - SRAMIF)
当有片内SRAM时,可选的NVDLA SRAM接口用于降低延迟和提高吞吐量。SRAM接口协议与DBBIF接口完全相同,但信号已被重命名为前缀nvdla _ core2sram _ { aw,ar,w,b,r}_
,分别用于aw,ar,w,b和r通道。来自SRAMIF和DBBIF的写确认之间的返回顺序不受限制。 例如,有两个BDMA层,第0层和第1层。第0层写入DBBIF,第1层写入SRAMIF。第1层可以在第0层之前从SRAMIF接收写确认,第0层从DBBIF接收写确认。
五. 寄存器接口(Register Interface)
本节描述寄存器地址空间和寄存器定义。对于每个子单元,都有状态寄存器、配置寄存器、命令寄存器和分析寄存器。
5.1 乒乓同步机制(Ping-pong Synchronization Mechanism)
对硬件编程的一个传统过程如下:首先,中央处理器在引擎上配置寄存器,然后设置引擎的“enable”位,然后等待硬件产生“done”中断,最后用一组新的寄存器重新开始这个过程。这种编程模式会导致硬件在两个连续的硬件层之间变得空闲,从而降低系统效率。
为了隐藏CPU的重编程延迟,NVDLA引入了每硬件层寄存器乒乓寄存器编程的概念。对于大多数NVDLA子单元,有两组寄存器;当子单元使用来自第一寄存器组的配置执行时,CPU可以在后台编程第二组,完成后设置第二组的“enable”位。 当硬件处理完第一个寄存器组描述的层后,它将清除第一个寄存器组的“enable”位,如果第二个寄存器组的“enable”位已经置位,则切换到第二个寄存器组。(如果第二组的“使能”位尚未置位,则硬件变为空闲,直到编程完成。)然后,重复该过程,第二组成为活动组,第一组成为中央处理器在后台写入的“shadow”组。这种机制允许硬件在活动层之间平滑切换,不会浪费CPU配置周期。
与“shadow寄存器”编程模型不同,“乒乓”编程模型中写入非活动组的值在激活时不会被复制到主组。因此,在启用硬件层运行之前,CPU应该确保一个组中的所有寄存器都已被编程。
NVDLA内核构建为一系列流水线级;每个阶段用于处理硬件层的全部或部分。 这些管道阶段是:
- CDMA (convolution DMA)
- CBUF (convolution buffer)
- CSC (convolution sequence controller)
- CMAC (convolution MAC array)
- CACC (convolution accumulator)
- SDP (single data processor)
- SDP_RDMA (single data processor, read DMA)
- PDP (planar data processor)
- PDP_RDMA (planar data processor, read DMA)
- CDP (channel data processor)
- CDP_RDMA (channel data processor, read DMA)
- BDMA (bridge DMA)
- RUBIK (reshape engine)
前五个流水线级是卷积核心流水线的一部分;所有这些流水线级(除了CBUF和CMAC)都使用链接的乒乓缓冲器,以便一起工作来形成硬件层。
5.1.1 实现(Implementation)
如图9所示,每个流水线级都在其寄存器文件中内置了乒乓机制。详细地说,每个寄存器文件实现有三个寄存器组;两个乒乓组(复制寄存器组0和组1)共享相同的地址,第三个寄存器组是专用的无shadow组(如上所示为“单寄存器组”)。POINTER
寄存器中的PRODUCER
寄存器字段用于选择从CSB接口访问哪个乒乓组;CONSUMER
寄存器字段指示数据路径来自哪个寄存器。默认情况下,两个指针都选择组0。 寄存器是根据它们所属的寄存器集命名的;如果一个寄存器的名称以D_
开头,则它属于复制寄存器组,否则它属于单寄存器组。
乒乓组中的寄存器是配置硬件层的参数。每个组都有一个使能寄存器字段,由软件设置,由硬件清零。CPU在使能位之前配置了组中的所有其他字段;当使能位置1时,硬件层准备执行。此时,对设置了使能位的寄存器组的任何写入都将被静默丢弃,直到硬件层完成执行;然后,硬件将使能位清零。
单寄存器组中的大多数寄存器都是只读状态寄存器。如上所述,CONSUMER
和PRODUCER
指针位于单组中;CONSUMER
指针是一个只读寄存器字段,CPU可以通过检查来确定数据路径选择了哪个乒乓组,而PRODUCER
指针完全由CPU控制,在对硬件层进行编程之前,应该将其设置为正确的组。
5.1.2 编程序列(Programming sequence)
以下是如何编程NVDLA子单元的示例序列。每个NVDLA子单元都有相同的乒乓寄存器设计;在这个序列中,我们选择CDMA子模块作为我们将要编程的示例单元。
- 复位后,组0和组1都处于空闲状态。CPU应该读取
CDMA_POINTER
寄存器,并将PRODUCER
设置为CONSUMER
的值。(复位后,CONSUMER
预期为0。) - CPU将第一硬件层的参数编程到寄存器组0中。配置完成后,CPU设置
D_OP_ENABLE
寄存器中的使能位。 - 硬件开始处理第一个硬件层。
- CPU读取
S_STATUS
寄存器,确保寄存器组1空闲。 - CPU将
PRODUCER
设置为1,并开始将第二硬件层的参数编程到组1中。这些寄存器被编程后,它设置组1的D_OP_ENABLE
中使能位。 - CPU通过读取
S_STATUS
检查寄存器组0的状态;如果它仍在执行,则CPU等待中断。 - 硬件完成当前硬件层的处理。这样做时,它会将
S_STATUS
寄存器中先前活动组的状态设置为空闲,并清除D_OP_ENABLE
寄存器的enable
位。 - 硬件将
CONSUMER
字段推进到下一个寄存器组(在本例中为组1)。在推进CONSUMER
字段后,它确定是否在新组上设置了enable
位。如果是,它立即开始处理下一个硬件层;如果没有,硬件等待,直到enable
位被置位。 - 硬件断言前一硬件层的“done”中断。如果CPU在等待“done”中断时被阻塞,它现在继续编程,如上所述。
- 根据需要重复。
NVDLA硬件不具备固有的依赖性跟踪支持;也就是说,如果一个硬件层依赖于另一个硬件层的输出,则正在运行或挂起的硬件层没有任何相互阻塞的机制。因此,CPU负责确保,如果一个层依赖于前一层的输出,消费层不会被调度,直到生产层已经完成执行。
5.2 地址空间布局(Address space layout)
NVDLA的寄存器需要256 KiB的MMIO(memory mapping I/O)地址空间。虽然基址因系统而异,但CSB接口上的所有寄存器都从基址0x0000_0000开始。NVDLA内部的每个子单元被分配4 KiB的地址空间。 (CBUF子单元没有任何寄存器。)NVDLA地址空间内部的地址映射如表表10所示。
某些硬件配置可能没有启用某些子单元;例如,NVDLA的较小实现可能会禁用SDP、PDP或CDP。在这种情况下,这些子单元的地址空间被保留,并且它们的寄存器不可访问。
5.2.1 GLB
5.2.2 MCIF
5.2.3 SRAMIF
5.2.4 BDMA
5.2.5 CDMA
注意,CDMA单元中的一些寄存器仅在某些模式下使用;如果这些模式在硬件功能寄存器中未显示为可用,则它们的寄存器也不可用。这些寄存器如下所示:
5.2.6 CSC
请注意,CSC单元中的一些寄存器仅在某些模式下使用;如果这些模式在硬件功能寄存器中未显示为可用,则它们的寄存器也不可用。这些寄存器如下所示:
5.2.7 CMAC_A
5.2.8 CMAC_B
5.2.9 CACC
5.2.10 SDP_RDMA
5.2.11 SDP
5.2.12 PDP_RDMA
5.2.13 PDP
5.2.14 CDP_RDMA
5.2.15 CDP
5.2.16 RUBIK
NVDLA学习笔记(2)相关推荐
- NVDLA学习笔记(1)
NVDLA学习笔记(1) 作者:夏风喃喃 参考:http://nvdla.org/index.html NVIDIA 深度学习加速器 (NVDLA) 是一个免费和开放的架构,促进设计深度学习推理加速器 ...
- nvdla学习笔记_神经网络加速器NVDLA顶层接口与工作流程
Nvidia的开源神经网络加速器NVDLA已经在GitHub上面存在两个多月的时间了,而距离软件Software Stack的开源也差不多提上了日程.近期,NVDLA的代码库中已经更新了System ...
- 世界上最强大的SoC——NVIDIA Xavier学习笔记
界上最强大的SoC--NVIDIA Xavier学习笔记 NVIDIA在2018年CES上推出了Xavier平台,作为Driver PX2 的进化版本.NVIDIA称Xavier 是"世界上 ...
- PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call
您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...
- 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程
暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...
- 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移
暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...
- 2020年Yann Lecun深度学习笔记(下)
2020年Yann Lecun深度学习笔记(下)
- 2020年Yann Lecun深度学习笔记(上)
2020年Yann Lecun深度学习笔记(上)
- 知识图谱学习笔记(1)
知识图谱学习笔记第一部分,包含RDF介绍,以及Jena RDF API使用 知识图谱的基石:RDF RDF(Resource Description Framework),即资源描述框架,其本质是一个 ...
最新文章
- python操作RabbitMQ
- 求二进制数中1的个数
- 使用vlc播放器做rtsp流媒体服务器
- VS2008 安装部署工程的小问题
- MongoDB数据库和集合的基本操作
- LwIP协议栈源码说明
- 如何规范化数据库模型设计
- Cortex-M3 (NXP LPC1788)之启动代码分析
- android wifi热点 信道,wifi 热点配置最优信道(示例代码)
- 2021年中国银行业金融机构普惠型小微企业贷款情况分析:贷款余额不断增加,增速也不断下降[图]
- 基于SLAM的机器人的自主定位导航
- springboot项目启动报Ambiguous mapping. Cannot map ‘xxxController‘ method
- 重温《遥远的救世主》
- 每周学一点Egret(17)default.thm.json 文件编译小坑
- Maven项目引入JS,css等文件的问题
- dds导入Unreal 4
- html调用摄像头直播,html5调用摄像头功能的实现代码
- 有五万块钱,在农村养牛怎么样?能养多少头牛?
- [web攻防] weblogic 漏洞复现 CVE-2017-10271CVE-2018-2628CVE-2018-2894
- 计算机网络基础知识点快速复习手册
热门文章
- HTML制作圣诞树,小白都会使用的教程。
- UE网络-官方联网和多人游戏
- 手机号加密成7位“随机字符串”
- 一加手机怎么root权限_一加 A3010手机怎样Root,如何获取Root权限?
- 普中单片机--串口通信(2)---通过串口助手发送数据点LED
- 2021年,如何安装ggplot2?
- 轨迹误差评估指标[APE/RPE]和EVO[TUM/KITTI]
- 什么是三相交流电源对称?对称三相交流电源特征
- linux系统常用命令
- Others9_无线路由器说说2.4G和5G Wi-Fi的区别