NVDLA概述
深度学习的计算部分主要可以分为4部分:卷积、激活单元(神经元)、池化和归一化。由于每个运算模块都有比较独特的共享特征,因此非常适合给每个模块设计一个对应的特殊硬件实现:内存访问模式容易预测并且很容易并行化。基于此,NVDLA提供了一个标准的、开源的结构来解决神经网络推理中的计算需求。NVLDA具有可扩展性强和高度可配置的特点,模块化设计保持了灵活性,简化了集成的复杂度。
NVDLA硬件提供了一个简单、灵活且稳健的推理加速解决方案,支持各种广泛的解决方案,从较小的物联网(IoT)到更大的性能要求较高的物联网设备。NVDLA提供了基于开源标准的IP集合(Verilog模型以可综合且可仿真的RTL形式给出),而TLM(Transaction Level Model, 事务级建模)SystemC仿真可以被用来软件开发、系统集成和测试。NVDLA 软件生态系统包括设备软件堆栈(开源版本的一部分)、用于构建包含深度学习新模型的完整训练基础设施,以及将现有模型转换为设备上软件可用形式的解析器(parser)。
NVDLA架构简述
VDLA 引入了模块化架构,旨在简化配置、集成和可移植性;它公开了用于加速核心深度学习推理操作的构建块。NVDLA 硬件由以下组件组成:
-
卷积核心:优化的高性能卷积引擎。
-
单数据处理器:激活函数的单点查找引擎。
-
平面数据处理器:用于池化的平面平均引擎。
-
通道数据处理器:用于高级标准化函数的多通道平均引擎。
-
专用内存和数据重组(reshape)引擎:用于张量重组和复制操作的内存到内存转换加速。
每个模块都是独立的,可以独立配置,不需要的模块可以彻底删除,某个模块如果需要更多处理单元,可以进行扩充,这种操作各个模块之间互不影响。每个单元的调度操作都委托给协处理器或 CPU,在极细粒度的调度边界上运行,每个单元都独立运行。这种紧密的管理调度算法可以通过添加专用的协处理器(“headed”实现)成为 NVDLA 子系统的一部分,或者可以将此功能与主系统处理器上更高级别的驱动程序实现(“headless”实现)融合。这使得相同的 NVDLA 硬件架构能够服务于各种实现规模。
NVDLA 硬件采用标准做法与系统的其余部分通过接口通信:控制通道实现寄存器文件(register file)和中断接口,一对标准 AXI 总线接口用于与内存通信的接口。主内存接口旨在连接到系统的更宽内存系统,包括系统 DRAM,此内存接口应与系统的 CPU 和 I/O 外设共享。第二个内存接口是可选的,允许连接到可能专用于 NVDLA 或某个计算机视觉子系统的更高带宽内存。这种异构内存接口选项为在不同类型的主机系统之间进行扩展提供了额外的灵活性。
推理的典型流程始于 NVDLA 管理处理器(“headed”实现中的协处理器或“headless”实现中的主 CPU)下发一个硬件层的配置以及“激活”命令。如果数据依赖性不妨碍这一点,则可以将多个硬件层发送到不同的引擎并同时激活(即,如果存在另一个层的输入不依赖于前一层的输出)。由于每个引擎都有一个用于配置寄存器的双缓冲区,因此它还可以捕获第二层的配置,以便在活动层完成后立即开始处理。一旦硬件引擎完成其活动任务,它将向管理处理器发出中断以报告完成情况,然后管理处理器将重新开始该过程。这种命令-执行-中断的流程重复进行,直到整个网络的推理完成。
NVDLA 实现通常分为两类:
-
无头(headless) : NVDLA 硬件的逐个单元在主系统处理器上进行管理和配置。
-
有头(headed):将高中断频率任务委托给与 NVDLA 子系统紧密耦合的配套微控制器。
如下图,左侧的小型系统模型显示了无头 NVDLA 实现的示例,而右侧的大型系统模型则显示了有头实现的示例。小型模型代表针对更具成本敏感性的专用设备的 NVDLA 实现,大型系统模型的特点是增加了专用控制协处理器和高带宽 SRAM 来支持 NVDLA 子系统,大型系统模型更适合可以同时运行多项任务的高性能 IoT 设备。
小型 NVDLA 模型
小型 NVDLA 模型在以前无法实现的领域开辟了深度学习技术。该模型非常适合成本敏感的联网物联网 (IoT) 类设备、AI 和自动化导向系统,这些系统具有明确定义的任务,成本、面积和功耗是主要驱动因素。通过 NVDLA 可配置资源可以实现在成本、面积和功耗方面的优化。神经网络模型可以做预编译和性能优化,从而允许对较大的模型裁剪和压缩并降低负载复杂性,这反过来又可以使得NVDLA实现规模更小,其中模型消耗更少的存储空间,系统软件加载和处理所需的时间也更少。
这些专用系统通常一次只执行一项任务,因此,在 NVDLA 运行时牺牲系统性能通常不是一个大问题。与这些系统相关的相对便宜的上下文切换(有时是由于处理器架构选择,有时是由于使用 FreeRTOS 等系统进行任务管理)使得主处理器不会因处理大量 NVDLA 中断而负担过重。这样就无需额外的微控制器,主处理器既可以执行粗粒度调度和内存分配,也可以执行细粒度 NVDLA 管理。
通常,遵循小型 NVDLA 模型的系统不会包含可选的第二个内存接口。当整体系统性能不是那么重要时,没有高速内存路径的影响不是非常关键。在这样的系统中,系统内存(通常是 DRAM)可能比 SRAM 消耗更少的功率,因此使用系统内存作为计算缓存更节能。
大型 NVDLA 模型
当主要强调高性能和多功能性时,大型 NVDLA 模型是更好的选择。以性能为导向的 IoT 系统可以在许多不同的网络拓扑上执行推理;因此,这些系统保持高度灵活性非常重要。此外,这些系统可能同时执行多项任务,而不是序列化推理操作,因此推理操作不能消耗主机上的太多处理能力。为了满足这些需求,NVDLA 硬会包含括第二个(可选)内存接口,用于专用的高带宽 SRAM,并能够与专用控制协处理器(微控制器)通过接口通信,以限制主处理器上的中断负载。
高带宽 SRAM 会连接到 NVDLA 上的快速内存总线接口端口,此 SRAM 被 NVDLA 用作缓存。可选是它可以由系统上的其他高性能计算机视觉相关组件共享,以进一步减少主系统内存 (Sys DRAM) 的流量。
NVDLA 协处理器的需求相当典型,因此,有许多通用处理器都适用(例如,基于 RISC-V 的 PicoRV32 处理器、ARM Cortex-M 或 Cortex-R 处理器,甚至内部微控制器设计)。使用专用协处理器时,主机处理器仍会处理与管理 NVDLA 相关的一些任务。例如,尽管协处理器负责 NVDLA 硬件的调度和细粒度编程,但主机仍将负责 NVDLA 硬件上的粗粒度调度、NVDLA 内存访问的 IOMMU 映射(必要时)、NVDLA 上输入数据和固定权重数组的内存分配,以及在 NVDLA 上运行的其他系统组件和任务之间的同步。
硬件架构
NVDLA 架构可以在两种操作模式下进行编程:独立模式和融合模式。
-
独立:独立运行时,每个功能块都配置了执行时间和内容,每个块都执行其分配的任务(类似于深度学习框架中的独立层)。在主系统内存或专用 SRAM 内存内或外,每个块通过读写对应的内存独立完成分配的任务。
-
融合:融合运行类似于独立运行,但是,一些块可以组装为管道。这样可以绕过内存的反复读写,让块通过小型 FIFO 相互通信(即,卷积核心可以将数据传递给单数据点处理器,单数据点处理器可以将数据传递给平面数据处理器,进而传递给跨通道数据处理器),进而实现性能提升的效果。
连接
NVDLA 与系统其他部分实现了三种主要连接:
-
Configuration Space Bus (CSB) interface: 此接口是一种同步、低带宽、低功耗、32 位控制总线,设计用于由 CPU 访问 NVDLA 配置寄存器。NVDLA 在 CSB 接口上充当从属设备。CSB 实现了一个非常简单的接口协议,因此可以通过简单的转换层轻松转换为 AMBA、OCP 或任何其他系统总线。
-
Interrupt interface:NVDLA 硬件包含 1 位电平驱动中断,当任务完成或发生错误时,中断线将被置位。
-
Data Backbone (DBB) interface:DBB 接口连接 NVDLA 和主系统内存子系统。它是一种同步、高速且高度可配置的数据总线,可以根据系统要求指定它具有不同的地址大小、不同的数据大小并发出不同大小的请求。数据主接口是一种类似于 AXI 的简单接口协议(可轻松用于符合 AXI 标准的系统)。
DBB 接口具有可选的第二个连接,当有第二个内存路径可用时可以使用。此连接的设计与主 DBB 接口相同,旨在与可提供更高吞吐量和更低访问延迟的片上 SRAM 一起使用。第二个 DBB 接口对于 NVDLA 的运行不是必需的,不需要此内存接口的系统可以移除它来节省空间。
组件
NVDLA 架构中的每个组件都支持了深度神经网络推理中的某个特定操作。以下描述提供了每个块的简要功能概述,包括他们映射的 TensorFlow 操作。TensorFlow 操作是作为示例提供的, NVDLA 硬件同样支持其他深度学习框架。
卷积(Convolution)
卷积运算作用于两组数据:一组是离线训练的“权重”(在每次推理运算中保持不变),一组是输入的“特征”数据(随网络输入而变化),卷积引擎公开参数从而高效地将许多不同大小的卷积映射到硬件上。NVDLA 卷积引擎包含一些优化来提高与简单卷积相比更好的性能,对稀疏权重压缩的支持可节省内存带宽,内置的 Winograd 卷积支持可提高某些大小滤波模块的计算效率。批量卷积可以在并行运行多个推理时通过复用权重来节省额外的内存带宽。
为了避免重复访问系统内存,NVDLA 卷积引擎保留了一个用于存储权重和输入特征的内部 RAM,称为“卷积缓冲区”。与每次需要权重或特征时都向系统内存控制器发送请求相比,这种设计大大提高了内存访问效率。
卷积单元映射到了具体的TensorFlow 操作,例如 tf.nn.conv2d
。
单数据点处理器(Single Data Point Processor)
单数据点处理器 (SDP) 允许将线性和非线性函数应用于单个数据点。这通常在 CNN 系统中卷积之后立即使用,SDP 有一个查找表来实现非线性函数,或者对于线性函数,它支持简单的偏移和缩放。这种组合可以支持最常见的激活函数,以及其他元素级操作,包括 ReLU、PReLU、精度缩放、批量归一化、偏移添加或其他复杂的非线性函数,例如sigmoid函数或双曲正切函数。SDP 映射到TensorFlow的操作包括
tf.nn.batch_normalization
, tf.nn.bias_add
, tf.nn.elu
, tf.nn.relu
, tf.sigmoid
, tf.tanh等。
平面数据处理器(Planar Data Processor)
平面数据处理器 (PDP) 支持 CNN 应用中常见的特定空间操作。它可在运行时配置以支持不同的池化组大小,并支持三种池化函数:最大池化、最小池化和平均池化。
PDP 映射到tf.nn.avg_pool
、tf.nn.max_pool
和 tf.nn.pool
操作。
跨通道数据处理器(Cross-channel Data Processor)
跨通道数据处理器 (CDP) 是一个专门为本地响应规范化 (LRN) 函数构建的单元 ,这是一种在通道维度而不是空间维度上运行的特殊规范化函数。
CDP 映射到tf.nn.local_response_normalization
函数上。
数据重组引擎(Data Reshape Engine)
数据重组引擎执行数据格式转换(例如,拆分或切片、合并、收缩、重组-转置)。在卷积网络上执行推理的过程中,内存中的数据通常需要重新配置或重组。例如,“切片”操作可用于分离图像的不同特征或空间区域,而“重置-转置”操作(在反卷积网络中很常见)会创建比输入数据集尺寸更大的输出数据。
数据重置引擎映射到 TensorFlow 操作, 例如tf.nn.conv2d_transpose
, tf.concat
, tf.slice和
and tf.transpose。
桥接 DMA(Bridge DMA)
桥接 DMA(BDMA)模块提供数据复制引擎,用于在系统 DRAM 和专用高性能内存接口(如果存在)之间传输数据,这是在这两个原本不连接的内存系统之间传输数据的加速路径。
可配置性
NVDLA 具有多种硬件参数,可以配置以平衡面积、功耗和性能,以下是这些选项的简短列表。
-
数据类型(Data types):NVDLA 本身支持其各个功能单元中的各种数据类型,可以选择其中的一个子集以节省空间,可以选择的数据类型包括二进制、int4、int8、int16、int32、fp16、fp32 和 fp64。
-
输入图像内存格式(Input image memory formats):NVDLA 可以支持平面图像、半平面图像或其他打包内存格式,可以启用或禁用这些不同的模式以节省空间。
-
权重压缩(Weight compression):NVDLA 有一种通过稀疏存储卷积权重来减少内存带宽的机制,可以禁用此功能以节省空间。
-
Winograd 卷积(Winograd convolution):Winograd 算法是对卷积某些维度的优化,NVDLA 可以在有或没有支持的情况下构建。
-
批量卷积(Batched convolution): 批量处理是一种节省内存带宽的功能,NVDLA 可以在支持或不支持批量处理的情况下构建。
-
卷积缓冲区大小(Convolution Buffer Size): 卷积缓冲区由多个库组成,可以调整库(Bank)的数量(从 2 到 32)和每个库的大小(从 4 KB 到 8 KB)。(通过将它们相乘,可以确定实例化卷积缓冲区内存总量。)
-
MAC 阵列大小(MAC array size): 乘法累加引擎由两个维度组成,宽度(“C”维度)可以从 8 调整到 64,深度(“K”维度)可以从 4 调整到 64。(创建的乘法累加器总数可以通过将这两个维度相乘来确定。)
-
第二个内存接口(Second memory interface):NVDLA 可以支持第二个内存接口以实现高速访问,也可以只构建一个内存接口。
-
非线性激活函数(Non-linear activation functions): 为了节省面积,可以删除支持非线性激活函数(如 sigmoid 或 tanh)的查找表。
-
激活引擎大小(Activation engine size): 每个周期产生的激活输出数量可在 1 至 16 之间调整。
-
桥接 DMA 引擎(Bridge DMA engine): 可以移除桥接 DMA 引擎以节省空间。
-
数据重构引擎(Data reshape engine): 可以移除数据重塑引擎以节省空间。
-
池化引擎存在(Pooling engine presence): 可以移除池化引擎以节省空间。
-
池化引擎大小(Pooling engine size): 池化引擎可以调整为每周期产生 1 到 4 个输出。
-
本地响应规范化引擎存在(Local response normalization engine presence): 可以移除本地响应规范化引擎以节省空间。
-
本地响应规范化引擎大小(Local response normalization engine size): 本地响应规范化引擎可以调整为每周期产生 1 到 4 个输出。
-
内存接口位宽(Memory interface bit width): 内存接口位宽可根据外部内存接口的宽度进行调整,以适当调整内部缓冲区的大小。
-
内存读取延迟容差(Memory read latency tolerance) :内存延迟时间定义为从读取请求到读取数据返回的周期数。此容差可以调整,这会影响每个读取 DMA 引擎的内部延迟缓冲区大小。
软件设计
NVDLA拥有完整的软件生态系统支持,这个生态系统中一部分包括设备上的软件堆栈,这是 NVDLA 开源的一部分。此外,NVDLA提供了完整的训练基础设施,以构建包含深度学习的新模型,并转换现有模型,将模型转换为NVDLA软件可以使用的形式。一般来说,软件与NVDLA 关联分为两组:编译工具(模型转换)和运行环境(要加载和执行NVDLA上神经网络的运行软件)。其大致流程如下图所示,下面将逐一介绍这些内容。
编译工具:模型创建和编译
编译工具包括编译器(compiler)和解析器(parser)。编译器负责创建一个硬件层序列,基于给定的NVDLA配置对序列进行优化,序列有一个优化的硬件层神经网络,通过减小模型尺寸、加载和运行时间来进行优化。编译是一个分段的多步骤的过程,主要可以分解为两个基本组件:解析(parsing)和编译(compiling)。解析器相对简单,它可以读取预训练的Caffe 模型并创建一个要传递到下一步编译流程的神经网络“中间表示(intermediate representation, IR)” 。编译器拿到解析器的中间表示作为其输入进而实现NVDLA 的硬件配置并生成硬件层的神经网络。这些步骤是脱机执行的,并且可能会在包含NVDLA 的设备上执行实现。
了解 NVDLA 执行的特定硬件配置很重要,它使编译器能够根据可用的特征来生成合理的层。例如,这可能包括选择 不同卷积运算模式(如Winograd卷积、 或基本卷积),或将卷积运算拆分为多个较小的小型操作,具体取决于可用的卷积缓冲区大小。 此阶段还负责将模型量化为较低的精度, 例如8 位或16位整数,或16 位浮点,以及为权重分配内存区域。可以使用相同的编译器工具 为多个不同的 NVDLA配置生成操作列表。
运行时环境:在设备上进行模型推理
运行时环境涉及在兼容的 NVDLA 硬件上运行模型。它 实际上分为两层:
-
用户模式驱动(UMD):用户模式程序的主接口,解析完神经网络后, 编译器逐层编译神经网络并转换位NVDLA Loadable文件格式。用户模式运行时,驱动程序加载此Loadable文件并将推理作业提交到内核模式驱动。
-
内核模式驱动(KMD):由执行各层规划运行工作的驱动程序和固件组成,并对 NVDLA 寄存器进行编程配置每个功能块。
运行时的应用从存储的网络表示开始,存储的格式称为“NVDLA Loadable”镜像。从Loadable的角度看,NVDLA 实现中的每个功能块通过软件中的“层”来表示,每一层都包含了该功能模块有关的信息,包括:依赖性,它在内存中用作输入和输出的张量, 以及操作的每个块的特定配置。各个层通过依赖关系图链接在一起,KMD 使用该图来规划每一步操作。NVDLA Loadable的格式通过跨编译器实现和UMD实现进行标准化。所有符合 NVDLA 标准的实现都应该能够理解任何 NVDLA loadable镜像。
对于处理Loadable镜像,UMD 具有标准应用程序编程接口 (API) ,将输入和输出张量绑定到内存位置并运行推理。该层将网络加载到定义好的内存中的一组数据结构,并将其以实现定义的格式传递给 KMD 。例如,在 Linux 上,这可能是ioctl()函数 ,传递数据从用户模式驱动程序到内核模式驱动程序,在单进程系统上,KMD 与 UMD 在相同的环境中运行,这可能是一个简单的函数调用。
KMD 的主入口点在内存中接收一个推理作业,在多个可执行作业中进行选择(如果是在多进程系统的话),并将其提交给核心引擎调度器。这个核心引擎调度器负责处理来自 NVDLA 的中断, 在每个特定功能块上调度层,并基于该层对前面层依赖的任务的完成情况更新任何该层的依赖关系。调度程序使用依赖项关系图中的信息来确定后续图层何时准备好进行调度,这使得编译器以优化的方式决定层的调度,并避免KMD的不同实现的性能差异。
UMD堆栈和KMD堆栈都被定义为API的形式,并期望通过一个系统可移植性层(system portability layer)进行包装。在可移植性层中维护核心的实现是期望有相对较少的变化以及方便在多个平台上运行NVDLA软件栈,如果适当的可移植性层就位,相同的核心实现应该在 Linux 和 FreeRTOS上都可以轻松编译。类似的,在“headed”实现上有与 NVDLA 紧密耦合的微控制器,可移植性层的存在使得在微控制器上运行相同底层软件成为可能,就像"headless"执行模式下在主CPU上运行一样。
NVDLA系统集成
NVDLA可以针对各种性能需求级别进行配置,选择这些参数取决于要被执行的卷积神经网络的要求。本节介绍其中的一些会影响这些参数选择的因素,以及一些对系统区域和性能有影响的参数。运行每一层所需的时间是数据输入、输出所需时间和执行乘法累加(multiply-accumulate, MAC)所需时间的最大值。运行整个网络所需的时间等于所有层的时间之和。基于要求的性能,选择正确的MAC数量、卷积缓冲区大小和片上 SRAM大小是确定尺寸的最关键步骤。NVDLA有更多的配置参数,用于需要的额外性能调优,这部分需要认真思考,但这些对总面积的影响较小,这些应该适当地配置,不要成为影响性能的瓶颈。
调优问题
对于任何给定实例化的预期工作负载,需要多少数学精度?
在较大配置中,大部分NVDLA区域由卷积使用缓冲区和 MAC 单位,因此这些参数理所当然 在初始性能/区域权衡分析中是最重要的。 深度学习训练通常以 32 位浮点精度完成, 但是生成的网络通常可以简化为 8 位整数,并且推理质量不会有重大损失;但在某些情况下,它可能仍会希望使用 16 位整数或浮点数。
MAC单元的数量是多少,所需的内存带宽是多少?
在精度之后,接下来性能和面积相关的两个关键参数是 MAC 单元的数量和所需的内存带宽。什么时候配置 NVDLA,应仔细考虑这些因素。处理是逐层进行的,因此性能评估最好也是逐层进行的。对于任何给定的层,通常情况下,MAC 吞吐量或内存带宽将是瓶颈。
所需的 MAC 单元数量相对容易确定。例如,卷积层具有已知的输入和输出分辨率,以及已知数量的输入和输出特征,卷积核大小也是已知的。将它们相乘得出处理层操作的MAC总数。硬件可以定义为具有一定数量的MAC单元,所需操作数除以MAC单元数量就得到了这一层完成处理的时钟周期数的下限。
计算所需的内存带宽就不那么简单了。在理想情况下, 应该只需要读取一次输入图像、一次输出图像和一次权重,最小循周期数是这些操作次数加到一起除以一个clock最多执行操作次数。但是,如果卷积缓冲区太小而无法容纳输入和权重数据集合,那么就必须进行多次传递。例如,如果卷积缓冲区只能容纳1/4的权重数据,那么计算必须分为四个步骤, 乘以输入带宽(即,10MB 的输入内存流量将乘以4得到40MB)。同样,如果缓冲区无法容纳足够的行来提供卷积的支持区域,卷积也必须被分解成水平条状。在选择时,考虑这种影响很重要,卷积缓冲区大小,以及何时调整内存接口的大小。
是否需要片上SRAM?
如果外部内存带宽因为功耗或性能方面原因无法满足要求,添加片上SRAM会有所帮助。这种SRAM可以被认为是二级缓存,它可以具有比主内存更高的带宽,并且该带宽是主内存带宽的累加。片上SRAM与更大的卷积缓冲区相比,实现成本更低,后者需要宽端口并具有非常严格的时序要求,但在卷积缓冲区有限的应用程序中没有那么大的乘法因子。(例如,如果一个层是带宽 limited,添加一个足以容纳整个输入图像的SRAM 以系统DRAM的两倍速度运行可以使性能翻倍。但是,如果该层也受到卷积缓冲区的大小限制,相同数量的内存可以给系统吞吐量产生更大的乘数。考虑这种权衡的最简单方法是,添加卷积缓冲区大小将有助于减少带宽的需求,而添加片上 SRAM可以提高总可用带宽。
NVDLA 的示例区域和性能
下表提供了基于ResNet-50神经网络优化的 NVDLA 配置的估计值 。给出的面积数字是估计的合成面积,并包括所需的所有内存;真实面积结果会因铸造厂和库的不同而有所不同。在此示例中, 没有使用片上SRAM。如果可用SDRAM是低带宽的,对片上SRAM是有益的。NVDLA 的开源版本具有一个性能估计器工具,可以用来探索NVDLA设计的空间和影响性能的因素。
下表中显示了 1GHz 频率的功率和性能。 但是,由于电压和频率的调整给定配置的功率和性能可能会有所不同。
示例平台
官方提供了示例平台,允许用户在最小SoC环境中观察、评估和测试NVDLA。最小SoC系统配置由CPU、NVDLA实例、互连和内存组成。这些平台可用于软件开发,或作为将NVDLA集成到工业级SoC的起点。
仿真
NVDLA开源版本包括一个基于GreenSocs QBox的仿真平台。在该平台中,QEMU CPU模型(x86或ARMv8)与NVDLA SystemC模型相结合,提供了一个寄存器精确的系统,可以在该系统上快速开发和调试软件。提供了Linux内核模式驱动程序和用户模式测试实用程序,以便在该仿真平台上运行。
FPGA
该示例平台将NVDLA Verilog模型映射到FPGA上,它提供了一个在实际设计中实例化NVDLA的综合示例。在该平台中,不使用NVDLA SystemC模型,软件寄存器读取和写入直接在真实的RTL环境中执行。这允许进行有限的周期计数性能评估,也允许针对更大、更复杂的网络进行更快的软件测试。FPGA模型仅用于验证,没有为FPGA平台优化周期时间、设计尺寸或功率,FPGA模型的性能无法与其他基于FPGA的深度学习加速器直接相比。
FPGA系统模型使用Amazon EC2“F1”环境,这是一个公开的标准化FPGA系统,可以按小时租赁。使用这种模式不需要预先购买专门的硬件或软件;在Amazon EC2环境中,综合软件只需支付计算时间的费用,并且不需要承诺就可以访问硬件。因为FPGA平台是基于Xilinx的,所以移植到其他Virtex系列器件应该相对简单。
模型
NVDLA IP-core型号基于开放的行业标准。简单的设计和基本结构的使用有望轻松集成到典型的SoC设计流程中。
Verilog模型
Verilog模型提供了RTL形式的综合和仿真模型。它有四个功能接口:一个从主机接口、一个中断线路和两个用于内部和外部存储器访问的主机接口。主机和存储器接口非常简单,但是需要外部总线适配器来连接到现有的SoC设计;为方便起见,AXI4和TileLink的示例适配器包含在NVDLA开源版本中。NVDLA开源版本包含示例合成脚本,为了便于在更复杂的系统或更大的NVDLA实例上进行物理设计,设计被分成多个分区,每个分区可以在SoC后端流程中独立处理。分区之间的接口可以根据需要重新定时,以满足后端设计流的要求。
NVDLA内核在单一时钟域中运行,总线适配器允许从内部NVDLA时钟到总线时钟的时钟域交叉。类似地,NVDLA也在单电源域中运行,该设计应用了细粒度和粗粒度功率门控。如果添加到实现中,SRAMs由行为模型建模,并且在完整的SoC设计中必须由编译的ram代替。NVDLA设计要求实施单端口和双端口(一个读端口加一个写端口)SRAMs。
模拟模型和验证套件
NVDLA包括一个用于软件开发、系统集成和测试的TLM2 SystemC仿真模型。这种模型能够实现比通过结合信号激励模型运行RTL更快的模拟。该SystemC模型旨在用于全SoC仿真环境,如Synopsys VDK或所提供的GreenSocs QBox平台。所包括的模型可在与RTL模型相同的轴上参数化,用于直接比较和仿真。
仿真模型也可以与NVDLA测试平台和验证套件一起使用。基于trace player的轻量级测试平台适用于简单的综合和构建健康验证(这将在最初的NVDLA版本中提供)。在随后的版本中,将提供一个完整的验证环境,并进行大量的逐单元测试。验证套件可用于在流片前提供设计保证,包括验证编译ram、时钟门控和扫描链插入的变化。这种环境适合进行更多实质性的更改(例如,验证新的NVDLA配置或对现有NVDLA设计进行修改)。
软件
最初的NVDLA开源版本包括用于“headed”实现的软件,与Linux兼容。内核模式驱动程序和用户模式测试实用程序都以源代码的形式提供,可以在未经修改的Linux系统上运行。