作者:夏风喃喃
参考:http://nvdla.org/index.html
NVIDIA深度学习加速器 (NVDLA) 是一个可配置的固定功能硬件加速器,针对深度学习应用中的推理操作。它通过暴露与每个 CNN 层相关的操作(例如,卷积、下卷、完全连接、激活、汇集、本地响应正常化等),为卷积神经网络 (CNN) 提供完整的硬件加速。维护独立和独立配置的块意味着 NVDLA 可以大小为许多较小的应用程序,其中以前由于成本、区域或电源限制而无法进行推算。此模块化架构可实现高度可配置的解决方案,可随时缩放以满足特定的推算需求。
本文件侧重于 NVIDIA 深度学习加速器的逻辑组织和控制。它为控制基本操作的块和接口提供信息。本文档中详述的块包括功能概述、配置选项和该块的注册列表。所有块的所有功能和功能可能不存在于每个 NVDLA 实现中。
NVDLA操作从管理处理器(微控制器或主CPU)发送一个硬件层的配置以及“激活”命令开始。 如果数据依赖性不排除这一点,多个硬件层可以被发送到不同的块并同时被激活(即,如果存在另一层,其输入不依赖于来自前一层的输出)。因为每个块的配置寄存器都有一个双缓冲区,所以它还可以捕获第二层的配置,以便在活动层完成后立即开始处理。一旦硬件引擎完成其活动任务,它将向管理处理器发出中断以报告完成,然后管理处理器将再次开始该过程。这个命令-执行-中断流程重复进行,直到整个网络上的推理完成。
NVDLA有两种工作模式:独立模式和融合模式。 独立操作是指每个单独的块被配置为何时执行以及执行什么,每个块都在执行其分配的任务。独立操作开始和结束于分配的块执行存储器到存储器的操作,进出主系统存储器或专用SRAM。融合操作类似于独立操作,但是,有些区块可以组装成管道;这通过绕过通过存储器的往返行程来提高性能,而是让块通过小FIFOs相互通信(即卷积核可以将数据传递给单数据点处理器,该处理器可以将数据传递给平面数据处理器,然后传递给跨通道数据处理器,而无需在其间执行存储器到存储器的操作)。
NVDLA 架构中的每个块都存在,以支持深神经网络推理中不可或缺的特定操作。推理操作分为五组:
不同的深度学习应用需要不同的推理操作。 例如,真实图像分割的工作量与人脸检测的工作量大不相同。因此,任何给定的 NVDLA 设计的性能、面积和功率要求都会有所不同。NVDLA 架构实现了一系列硬件参数,用于定义功能选择和设计大小。这些硬件参数为创建 NVDLA 硬件设计规范提供了基础。设计规范可识别 NVDLA 实现的支撑功能和性能特性。
卷积运算处理两组数据:一组离线训练的“权重”(在每次推理之间保持不变),一组输入的“特征”数据(随网络的输入而变化)。 NVDLA卷积引擎公开了支持几种不同操作模式的参数。这些模式中的每一种都包括优化,可以提高原始卷积实现的性能:
启用不同的操作模式允许以更高的效率将许多不同大小的卷积映射到硬件上。对稀疏权重压缩的支持节省了内存带宽。 内置的Winograd卷积支持提高了某些尺寸过滤器的计算效率。批处理卷积,可以通过在并行运行多个推理时重用权重来节省额外的内存带宽。为了避免重复访问系统内存,NVDLA卷积引擎有一个内部RAM,专门用于存储权重和输入特征,称为“卷积缓冲区”。与每次需要权重或特征时向系统内存控制器发送请求相比,这种设计大大提高了内存效率。
直接卷积模式是基本的运行模式。NVDLA 采用了宽乘累加 (MAC) 流水线,以支持高效的并行直接卷积操作。影响卷积功能性能的有两个关键因素:内存带宽和 MAC 效率。
NVDLA 支持两个内存带宽优化功能,这些功能可显著帮助降低 CNN 层的内存带宽要求,这些要求需要大量数据交换,例如全连接的图层。
影响卷积函数性能的第二个关键因素是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始终处于空闲状态)。
硬件参数:
图像输入模式是第一层的特殊直接卷积模式,包含来自图像表面的输入特征数据。考虑到图像表面格式与正常特征数据格式有很大不同,特征数据提取操作遵循与直接卷积操作不同的路径。通常第一层只有3个通道用于图像输入,这里增加了额外的逻辑来提高MAC的利用率。 即使第一层有3个(甚至1个)通道,通道扩展功能也能保持平均MAC利用率接近50%,即使Atomic-C设置很大(例如16个)。
硬件参数:
Winograd卷积是指用于优化直接卷积性能的可选算法。Winograd卷积减少了乘法次数,同时增加了加法器来处理额外的变换。 由于预计算和后计算的加法次数都比MAC阵列中的操作次数少得多,因此操作总数会减少。对于相同的卷积函数,避免了大量的MAC操作。例如,与Winograd的3×3滤波器大小的卷积将MAC运算次数减少了2.25倍,从而提高了性能和能效。权重转换是离线完成的,因此总权重数据大小预计会增加。Winograd特性对于数学限制的图层非常有用;3x3或更大的滤波大小的图层总是受到数学限制,因此与winograd功能非常匹配。
卷积核使用的Winograd卷积方程为:
这里的符号⊙表示元素乘法。这意味着winograd函数需要在正常直接卷积MAC阵列之前预先计算固定矩阵运算,并在正常直接卷积MAC阵列之后后计算另一个固定矩阵运算。
硬件参数:
NVDLA批处理功能支持一次处理多组输入激活(来自多个图像)。这复用了权重并节省了大量内存带宽,从而提高了性能和功耗。全连接层的内存带宽需求远大于计算资源。全连接层中的权重数据的大小非常重要,并且仅在MAC功能中使用一次(这是内存带宽瓶颈的主要原因之一)。允许多组激活共享相同的权重数据意味着它们可以同时运行(减少整体运行时间)。 单个批次的运行时间接近单层的运行时间;整体性能接近 [batching_size] × [single-layer performance].。
支持大批量意味着激活缓冲的大面积成本。最大批处理大小受到卷积缓冲区大小的限制,因此最大批处理数量是设计规范中的硬件限制。
硬件参数:
卷积缓冲器是卷积核心的一个流水线级。 它包含卷积函数的权重数据和特征数据。权重数据大小与特征数据大小的比率在不同的网络中甚至在单个网络中是不同的(不同的层在特征和权重数据之间可以有完全不同的比率)。为了适应这些差异,卷积缓冲器支持权重数据和特征数据的可配置存储策略。
卷积缓冲器需要至少4个端口用于数据访问:
卷积缓冲区的大小取决于各种因素;主要因素是CNN大小(即特征数据大小和权重数据大小)。如果一个硬件层的权重数据或特征数据的完整大小可以存储在卷积缓冲器中(不需要多次提取数据),则是优选的。卷积读取带宽决定了读取端口的宽度。为了在单个周期中馈送所需数量的Atomic-C数据,需要(data_size*Atomic-C)的数据宽度。例如,对于INT8卷积函数中16的Atomic-C,需要128位宽度(16字节)。
硬件参数:
单一数据点处理器(SDP)允许将线性和非线性函数应用到单个数据点。 这通常在CNN系统中卷积后立即使用。SDP为线性函数提供了本地支持(例如,简单的偏置和缩放),并使用查找表来实现非线性函数。这种组合支持最常见的激活函数以及其他元素操作,包括:ReLU、PReLU、精度缩放、批处理归一化、偏差加法或其他复杂的非线性函数,如sigmoid或双曲正切tanh。
硬件参数:
NVDLA支持线性函数的多个实例(大部分是缩放函数)。有几种方法可以用来设置缩放因子和偏差:1) CNN设置——缩放因子和偏差在整个CNN中是相同的,这个缩放因子来自一个寄存器配置;2)通道设置——单个平面内的比例因子和偏差相同(即通道值相同),这些比例因子来自内存接口;3)每像素设置——比例因子和偏差对于每个单独的特征是不同的,这些因子和偏差将来自内存接口。
支持深度学习算法需要几个非线性函数。 其中一些使用专用硬件逻辑来支持,而更复杂的功能包括使用专用查找表。
平面数据处理器(PDP)支持CNN应用中常见的特定空间操作。它可以在运行时进行配置,以支持不同的池化大小,并支持三种池化函数:
PDP有一个专用的存储器接口,用于从存储器获取输入数据,并直接输出到存储器。
硬件参数:
跨通道数据处理器(CDP)是一个专门用于应用局部响应归一化(LRN)函数的单元,这是一个在通道维度上运行的特殊归一化函数,与空间维度相反。
硬件参数:
桥DMA(BDMA)模块提供数据复制引擎,在系统DRAM和专用高性能存储器接口之间移动数据。提供在这两个非连接的内存系统之间移动数据的加速路径。
硬件参数:
数据整形引擎执行数据格式转换(例如,拆分或切片、合并、收缩、整形-转置)。在卷积网络上执行推理的过程中,内存中的数据经常需要重新配置或整形。例如:“切片”操作可用于分离出图像的不同特征或空间区域;“整形-转置”操作(在去卷积网络中很常见)创建的输出数据比输入数据集具有更大的维度。
Rubik函数转换数据映射格式,无需任何数据计算。它支持三种工作模式:
硬件参数:
不同的深度学习应用需要不同的推理操作。例如,真实图像分割的工作量与人脸检测的工作量有很大不同。因此,任何给定的NVDLA设计的性能、面积和功耗要求都会有所不同。NVDLA通过一组可配置的硬件参数来解决这个问题,这些参数用于创建符合应用需求的实现。
硬件参数为创建NVDLA硬件设计规范提供了基础。设计规范确定了NVDLA实施支持的特性和性能特征。有两类硬件参数:功能选择和设计规模。 给定的NVDLA实现由选定的参数和设置定义。
NVDLA可以支持特定网络的一种数据类型,也可以支持更通用的多种数据类型。考虑到面积成本和能效,NVDLA硬件架构可以在不同的数据类型之间进行适当的共享。
Winograd是卷积函数的一个优化特性。它可以通过提高MAC效率来提高性能,还可以帮助提高整体能效。
批处理是卷积的一个优化特性。它通过提高MAC效率和节省内存流量来提高性能。
稀疏压缩是卷积的优化特征。它可以减少内存流量总量,从而提高性能并节省功耗。
NVDLA总是通过其DBBIF与外部存储器有一个基本接口。除此之外,NVDLA还可以支持第二个内存总线接口SRAMIF。该接口可以连接到片内SRAM或其他高带宽低延迟总线,以提高整体性能。
平面图像数据是深度学习的重要输入资源,有大量的图像表面格式。因此,NVDLA输入支持的格式对于NVDLA的第一个硬件层非常重要。
有许多非线性曲线用作深度学习的激活函数,包括§ReLU、tanh、sigmoid等。其中一些,如ReLU,非常简单,可以通过超出阈值的缩放轻松实现;其他的需要额外的内存使用查找表来近似。
在NVDLA支持第二存储器接口的情况下,桥接DMA (BDMA)单元可以在主存储器接口和第二存储器接口之间进行数据复制。
Rubik函数转换数据映射格式,无需任何数据计算。
设计规模参数表示NVDLA硬件支持的并行度。更大的值通常意味着更高的性能,但是伴随着更高的面积和/或功率成本。
该值指示输入特征通道维度中的MAC操作。此参数影响总MAC数、卷积缓冲区读取带宽。
该值指示输出特征通道维度上的并行MAC操作。此参数影响总MAC数、累加器实例数、卷积写回带宽。由于MAC阵列有2个维度,所以总的MAC数量是(Atomic-C * Atomic-K)。
Atomic-C 和 Atomic-K 参数都是指最低精度,较高的精度可能会相应降低。例如,如果NVDLA同时支持INT8和INT16,那么Atomic-C和Atomic-K参数指的是INT8的情况,预计INT16的并行性较低。
单数据点吞吐量表示单数据点流水线的实例数。SDP流水线的数量决定了每个周期可以生成的输出特征的数量。
平面数据处理器(PDP)吞吐量表示每个周期可以生成的输出特征的数量。值为0表示将不包括PDP块,并且不支持平面数据处理器操作。
CDP吞吐量表示每个周期可以生成的输出特征的数量。值0表示不包含CDP块,并且最终实现不支持多平面操作。
该值指示卷积缓冲库的数量。存储体的数量定义了权重和激活之间CBUF存储分配的粒度。它们与存储体大小参数一起决定了整个卷积缓冲器的大小。
该值指示单个卷积缓冲库的大小。它们与存储体编号参数一起决定了整个卷积缓冲区的大小。
该值表示卷积函数可以支持的最大批处理数。通常该参数的较大值会对面积产生影响,因为累加器侧需要更多的缓冲。
NVDLA支持基于不同工作负载的多种数据类型推断。对于给定的功率和性能约束,可以使用这些参数来提高网络精度。浮点数据精度高(FP64/FP32/FP16);整数数据类型(INT16/INT8/INT4),甚至单比特二进制都可以用于精度较低的应用。
精密缩放转换器通常在一些非常关键的有限资源之前使用,例如在将数据写入内存或进入MAC阵列之前。
转换器的公式是: y = s a t u r a t i o n ( ( x − o f f s e t ) ∗ s c a l i n g > > s h i f t e r ) y=saturation((x−offset)∗scaling>>shifter) y=saturation((x−offset)∗scaling>>shifter)
移位器主要用于流水线中间的比特调整。 例如,累加器的位宽远远大于输入数据,因此在数据发送到SDP之前,我们需要通过移位器对其进行分块。
移位器是一个简化的转换器,公式如下: y = s a t u r a t e ( x < < s h i f t e r ) y=saturate(x<
LUT用于处理网络中非线性函数,例如sigmoid和tanh激活函数,或者用于局部响应归一化。
小型NVDLA实现以较小的工作负载为目标,因此,这些实现只需要非常基本的支持。因为工作量轻,64个Atomic-C=16,Atomic-K=4的INT8 MACs应该足够好了。 所有其他优化功能都可以删除,以节省面积。对于图像输入格式,支持像A8R8G8B8这样的基本格式已经足够好了。 如果需要池化和归一化功能,可以限制吞吐量。至于卷积缓冲器,可以支持4个存储体,每个存储体大小为8KB(总共32KB)。
硬件参数设置示例:
较大的NVDLA实施针对较重的工作负载。当主要强调更高的性能和多功能性时,该模型是更好的选择。将Atomic-C和Atomic-K提高到64/16可将NVDLA性能提高到每个周期最多2K次操作;启用所有其他优化进一步增加了实际操作。其他后处理吞吐量也需要增加(如PDP和CDP吞吐量改为4)。 当瞄准更大的CNN时,设置更大的卷积缓冲区(例如,32KB * 16 = 512KB)。
硬件参数设置示例:
NVDLA作为一个整体,有四个系统接口。这些是:
下面,我们介绍两个集成NVDLA的平台示例,以及它们如何将这些外部连接连接到系统的其余部分。
图6显示了一个小型系统,其NVDLA直接连接到主CPU。这个小系统没有NVDLA专用的SRAM,所有的访问都命中主系统内存。相比之下,图7显示了一个稍大的系统,其中NVDLA连接到微控制器,微控制器负责管理NVDLA编程的小细节(因此,将主CPU从服务低级NVDLA中断中解放出来)。后一个系统还集成了一个SRAM,连接到NVDLA。(系统上的其他单元也可以连接到这个SRAM,并根据自己的需要共享它;图中没有显示。)
CPU使用CSB接口来访问NVDLA寄存器。CSB接口故意极其简单,而且性能低下;因此,在CSB和平台上可能支持的任何其他系统总线之间构建适配器应该很简单。CSB总线由三个通道组成:请求通道、读取数据通道和写入响应通道。 这些通道如下所述。
CSB接口使用单个时钟域,由NVDLA和请求者共享。
请求通道遵循valid/ready协议;当且仅当valid
信号(来自主机)和ready
信号(来自NVDLA)都在同一时钟周期内被断言时,请求通道上才会发生数据事务。对CSB的每个请求都有固定请求大小32位数据,16位地址。 CSB不支持任何形式的突发请求;通过请求信道发送的每个数据包都独立于任何其他数据包。
下表描述了读取数据响应通道。NVDLA按照严格的请求顺序向主机返回读响应数据;也就是说,write
被设置为0的每个请求包(如上)将只有一个响应,并且该响应不能相对于其他读取向前或向后跳转。读取数据通道遵循valid-only的协议;因此,主机不能对该接口上的NVDLA反向施压。
NVDLA不支持来自CSB的错误报告。非法读取(例如,指向地址空洞的读取)将返回零。
下表描述了与写响应通道相关的信号。对于每个non-posted的写入,NVDLA将按照请求顺序向主机返回写入完成。
写完成通道也遵循valid-only的协议,因此,主机不能在此接口上对NVDLA反向施压。
图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
。
除了配置空间总线,NVDLA还提供了一个异步(中断驱动)返回通道,将事件通知传递给CPU。中断信号是一个电平驱动的中断,只要NVDLA内核有未决的中断,该中断就会被置为高电平。如果在GLB的INTR_STATUS
寄存器中设置了任何位,而这些位在INTR_MASK
寄存器中没有被屏蔽掉(即设置为零),则中断处于挂起状态。 NVDLA中断信号与CSB接口处于同一时钟域。
NVDLA有两个主要接口与存储系统交互,这两个接口分别称为DBBIF(在信号命名中称为core2dbb
)和SRAMIF(在信号命名中称为core2sram
)。DBBIF接口旨在连接到片上网络,该网络连接到系统存储器,而SRAMIF旨在连接到可选的片上静态随机存取存储器,该存储器具有更低的存储器延迟和潜在的更高吞吐量。DBBIF和SRAMIF接口都符合AXI4标准。本节详细描述了DBBIF接口。
NVDLA数据主干接口支持32、64、128、256或512位的可配置数据总线宽度。为了容忍内存延迟,内部缓冲区可以配置为支持最多256个可配置数量的未完成请求。
数据中枢接口遵循类似AXI的协议,但会假设简化接口协议。
NVDLA DBBIF假设同步数据主干接口具有单个时钟域和复位。因此,所有NVDLA DBBIF端口都是主NVDLA核心时钟域的一部分。与SOC数据中枢的同步需要在NVDLA内核之外完成。
下表列出了AW通道上的所有信号,隐含前缀为nvdla_core2dbb_aw_
。
下表列出了AR通道上的所有信号,隐含前缀为nvdla_core2dbb_ar_
。
下表列出了W通道上的所有信号,隐含前缀为nvdla_core2dbb_w_
。
下表列出了B通道上的所有信号,隐含前缀为nvdla_core2dbb_b_
。
下表列出了R通道上的所有信号,隐含前缀为nvdla_core2dbb_r_
。
当有片内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接收写确认。
本节描述寄存器地址空间和寄存器定义。对于每个子单元,都有状态寄存器、配置寄存器、命令寄存器和分析寄存器。
对硬件编程的一个传统过程如下:首先,中央处理器在引擎上配置寄存器,然后设置引擎的“enable”位,然后等待硬件产生“done”中断,最后用一组新的寄存器重新开始这个过程。这种编程模式会导致硬件在两个连续的硬件层之间变得空闲,从而降低系统效率。
为了隐藏CPU的重编程延迟,NVDLA引入了每硬件层寄存器乒乓寄存器编程的概念。对于大多数NVDLA子单元,有两组寄存器;当子单元使用来自第一寄存器组的配置执行时,CPU可以在后台编程第二组,完成后设置第二组的“enable”位。 当硬件处理完第一个寄存器组描述的层后,它将清除第一个寄存器组的“enable”位,如果第二个寄存器组的“enable”位已经置位,则切换到第二个寄存器组。(如果第二组的“使能”位尚未置位,则硬件变为空闲,直到编程完成。)然后,重复该过程,第二组成为活动组,第一组成为中央处理器在后台写入的“shadow”组。这种机制允许硬件在活动层之间平滑切换,不会浪费CPU配置周期。
与“shadow寄存器”编程模型不同,“乒乓”编程模型中写入非活动组的值在激活时不会被复制到主组。因此,在启用硬件层运行之前,CPU应该确保一个组中的所有寄存器都已被编程。
NVDLA内核构建为一系列流水线级;每个阶段用于处理硬件层的全部或部分。 这些管道阶段是:
前五个流水线级是卷积核心流水线的一部分;所有这些流水线级(除了CBUF和CMAC)都使用链接的乒乓缓冲器,以便一起工作来形成硬件层。
如图9所示,每个流水线级都在其寄存器文件中内置了乒乓机制。详细地说,每个寄存器文件实现有三个寄存器组;两个乒乓组(复制寄存器组0和组1)共享相同的地址,第三个寄存器组是专用的无shadow组(如上所示为“单寄存器组”)。POINTER
寄存器中的PRODUCER
寄存器字段用于选择从CSB接口访问哪个乒乓组;CONSUMER
寄存器字段指示数据路径来自哪个寄存器。默认情况下,两个指针都选择组0。 寄存器是根据它们所属的寄存器集命名的;如果一个寄存器的名称以D_
开头,则它属于复制寄存器组,否则它属于单寄存器组。
乒乓组中的寄存器是配置硬件层的参数。每个组都有一个使能寄存器字段,由软件设置,由硬件清零。CPU在使能位之前配置了组中的所有其他字段;当使能位置1时,硬件层准备执行。此时,对设置了使能位的寄存器组的任何写入都将被静默丢弃,直到硬件层完成执行;然后,硬件将使能位清零。
单寄存器组中的大多数寄存器都是只读状态寄存器。如上所述,CONSUMER
和PRODUCER
指针位于单组中;CONSUMER
指针是一个只读寄存器字段,CPU可以通过检查来确定数据路径选择了哪个乒乓组,而PRODUCER
指针完全由CPU控制,在对硬件层进行编程之前,应该将其设置为正确的组。
以下是如何编程NVDLA子单元的示例序列。每个NVDLA子单元都有相同的乒乓寄存器设计;在这个序列中,我们选择CDMA子模块作为我们将要编程的示例单元。
CDMA_POINTER
寄存器,并将PRODUCER
设置为CONSUMER
的值。(复位后,CONSUMER
预期为0。)D_OP_ENABLE
寄存器中的使能位。S_STATUS
寄存器,确保寄存器组1空闲。PRODUCER
设置为1,并开始将第二硬件层的参数编程到组1中。这些寄存器被编程后,它设置组1的D_OP_ENABLE
中使能位。S_STATUS
检查寄存器组0的状态;如果它仍在执行,则CPU等待中断。S_STATUS
寄存器中先前活动组的状态设置为空闲,并清除D_OP_ENABLE
寄存器的enable
位。CONSUMER
字段推进到下一个寄存器组(在本例中为组1)。在推进CONSUMER
字段后,它确定是否在新组上设置了enable
位。如果是,它立即开始处理下一个硬件层;如果没有,硬件等待,直到enable
位被置位。NVDLA硬件不具备固有的依赖性跟踪支持;也就是说,如果一个硬件层依赖于另一个硬件层的输出,则正在运行或挂起的硬件层没有任何相互阻塞的机制。因此,CPU负责确保,如果一个层依赖于前一层的输出,消费层不会被调度,直到生产层已经完成执行。
NVDLA的寄存器需要256 KiB的MMIO(memory mapping I/O)地址空间。虽然基址因系统而异,但CSB接口上的所有寄存器都从基址0x0000_0000开始。NVDLA内部的每个子单元被分配4 KiB的地址空间。 (CBUF子单元没有任何寄存器。)NVDLA地址空间内部的地址映射如表表10所示。
某些硬件配置可能没有启用某些子单元;例如,NVDLA的较小实现可能会禁用SDP、PDP或CDP。在这种情况下,这些子单元的地址空间被保留,并且它们的寄存器不可访问。
注意,CDMA单元中的一些寄存器仅在某些模式下使用;如果这些模式在硬件功能寄存器中未显示为可用,则它们的寄存器也不可用。这些寄存器如下所示:
请注意,CSC单元中的一些寄存器仅在某些模式下使用;如果这些模式在硬件功能寄存器中未显示为可用,则它们的寄存器也不可用。这些寄存器如下所示: