NVDLA专题1:NVDLA框架介绍

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_addtf.nn.elutf.nn.relutf.sigmoidtf.tanh等。

平面数据处理器(Planar Data Processor)

平面数据处理器 (PDP) 支持 CNN 应用中常见的特定空间操作。它可在运行时配置以支持不同的池化组大小,并支持三种池化函数:最大池化、最小池化和平均池化。

PDP 映射到tf.nn.avg_pooltf.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_transposetf.concattf.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系统上运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/401512.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

边缘智能:让每一个温室都成为计算中心

( 于景鑫 国家农业信息化工程技术研究中心)当人工智能的浪潮席卷全球,大语言模型(LLM)引领智能风潮之时,"智慧农业"也摩拳擦掌跃跃欲试。设施农业作为现代农业的翘楚,正站在数智化变革…

社交媒体分析:如何利用Facebook的数据提升业务决

在数字化时代,社交媒体已经成为企业战略中不可或缺的一部分。Facebook,作为全球最大的社交平台之一,提供了丰富的数据资源,这些数据不仅能够帮助企业了解市场趋势,还能提升业务决策的精准度。本文将探讨如何有效利用Fa…

四路一体行车记录仪,语音提示注意行人,保障车辆行驶安全

在叉车、货车、客车等行业中,随着运输业务量的不断增加,行车安全问题已经成为了一大难题。经常会发生车祸、司乘人身安全无保障、货物损失等意外情况,这些事件不仅会给企业带来经济损失,也会影响对应行业的整体形象。 如何提高运…

深入了解指针(7)

文章目录 1.qrost的使用2.qrost函数的模拟实现 1.qrost的使用 qrost—库函数—可以实现任意数据类型的快速排序。 void qsort(void* base, //base中存放的是待排序数组的第一个元素的地址 size_t num, //num存放的是base指向的数组中的元素个数 size_t size, //size是base指向…

《学会 SpringBoot 系列 · spring.factories 详解》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…

mysql 物理备份 MySQL 全量备份 增量备份 差异备份 日志备份万字长文 1.3万字

版权声明:本文为博主原创文章,遵循版权协议,转载请附上原文出处链接和本声明 注意,通常 完备增备,日志(binlog)备,结合使用 差异则根据具体情况选用。 此备份过程 属于公司 常用的单个数据…

凹凸纹理概念

1、凹凸纹理 纹理除了可以用来进行颜色映射外,另外一种常见的应用就是进行凹凸映射。凹凸映射的目的是使用一张纹理来修改模型表面的法线,让我们不需要增加顶点,而让模型看起来有凹凸效果。原理:光照的计算都会利用法线参与计算&…

数的个位相加

给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。返回这个结果。 示例 1: 输入: num 38输出: 2 解释: 各位相加的过程为: 38 --> 3 8 --> 11 11 --> 1 1 --> 2 由于 2 是一位数,所以返回 2。…

搜维尔科技:驾驶模拟器背后的技术: Varjo的虚拟/混合现实 (VR/XR)提供独特的优势,最终加快汽车开发创新的步伐

专业驾驶模拟器广泛应用于车辆开发,帮助汽车行业在开发过程的早期做出更好的设计决策。总体目标是为测试驾驶员提供最真实的驾驶体验,包括动态动作和声音,并测试控制算法或辅助系统等功能。环境越真实,驾驶员的体验就越接近最终车…

视觉SLAM ch3补充——在Linux中配置VScode以及CMakeLists如何添加Eigen库

ch3中的所有代码,除了在kdevelop中运行,还可以在VScode中运行。下面将简要演示配置过程,代码不再做解答,详细内容在下面的文章中。(这一节中的pangolin由于安装过程中会出现很多问题,且后续内容用不到该平台…

自动化解决 reCAPTCHA v2:CapSolver 教程

对于那些经常进行网页爬取的人来说,你是否曾觉得 reCAPTCHA v2 就像是互联网版的过于严格的裁判员,总是在质疑你的真实性?但如果你能够轻松且合规地与这些裁判员达成和解,使你的网络搜索和自动化任务变得更顺畅,那该有…

k8s部署kubeadm init初始化不成功,coredns处于pending,master和nodes处于notready状态

声明:本文仅为个人学习笔记使用,解决方法参考原文: https://blog.csdn.net/Harry_mumu/article/details/132099876 在部署完k8s集群后,节点一直处于notready状态(master和nodes) 查看kubectl get pods -n…

全球海事航行通告解析辅助决策系统

“全球海事航行通告解析辅助决策系统”是一个针对海事行业设计的智能系统,旨在帮助海上导航和航运操作人员解析和应对全球发布的海事航行通告。 要做这样的系统我们必须要了解海事签派员的日常工作。 海事签派员,也称为船舶操作员或船运调度员&#xff0…

HanLP分词的使用与注意事项

1 概述 HanLP是一个自然语言处理工具包&#xff0c;它提供的主要功能如下&#xff1a; 分词转化为拼音繁转简、简转繁提取关键词提取短语提取词语自动摘要依存文法分析 下面将介绍其分词功能的使用。 2 依赖 下面是依赖的jar包。 <dependency><groupId>com.ha…

替代进程注入的新工具

目录 前言 Windows Session 的利用 Windows Session 介绍 跨会话激活技术 什么是跨会话激活机制&#xff1f; 常见的跨会话激活技术 结合利用 地址 前言 众所周知&#xff0c;常用的C2工具&#xff08;例如CobaltStrike&#xff09;在另一个进程上下文中执行代码经常使…

【Android】不同系统版本获取设备MAC地址

【Android】不同系统版本获取设备MAC地址 尝试实现 尝试 在开发过程中&#xff0c;想要获取MAC地址&#xff0c;最开始想到的就是WifiManager&#xff0c;但结果始终返回02:00:00:00:00:00&#xff0c;由于用得是wifi &#xff0c;考虑是不是因为用得网线的原因&#xff0c;但…

Fultter项目中IOS打包问题整理(附带解决方案)

Fultter项目中IOS打包问题整理&#xff08;附带解决方案&#xff09; 问题一&#xff1a;CocoaPods 在你的项目中找不到名为 AlicloudPush 版本为 ~> 1.9.1 的 Pod 规范。报错信息问题分析解决方法 问题二&#xff1a;ruby版本问题报错信息问题分析问题原因解决方法 问题三&…

WPS真题题库导入刷题小程序:个人使用经验分享

这篇文章的诞生&#xff0c;是因为我即将踏上一场超级有趣的挑战——备考全国计算机等级二级WPS Office高级应用与设计的冒险之旅&#xff01; WPS的分值&#xff1a; 单项选择题20分(含公共基础知识部分10分)。 WPS处理文字文档操作题30分。 WPS处理电子表格操作题30分。 …

挑战程序设计竞赛c++(第一天)1.抽签(枚举,二分法查找)2.三角形(暴力枚举)

方法一&#xff1a; #include<iostream> #include<algorithm> #include<vector>using namespace std; char flag0; int n0; int m0; int shu[1000]{0}; int i; int main() {cin >> n;cin >> m;for (i0;i<n;i){cin >> shu[i];}vector&l…

Design Compiler——综合及debug流程

文章目录 前言一、什么是综合&#xff1f;二、综合的流程1. Develop HDL files2. Specify libraries3. Read design4. Define design environment5. Set design constraints6. Select compile strategy7. Synthesize and optimize the design8. Analyze and resolve design pro…