NVDLA专题14:Runtime environment-用户模式驱动

news2024/9/21 18:53:01

运行时环境runtime environment)包括在兼容的NVDLA硬件上运行编译神经网络的软件。

它由两部分组成:

  • 用户模式驱动User Mode Driver, UMD): 这是应用程序的主接口,正如Compile library中所详述的,对神经网络进行逐层解析和编译后,会输出NVDLA Loadable存储格式的文件。用户模式运行时驱动程序加载这个文件,并将推理任务提交给内核模式驱动
  • 内核模式驱动Kernel Mode Driver, UMD): 由内核模式驱动(Kernel Mode Driver)引擎调度器(engine scheduler)组成,负责调度NVDLA上的编译网络,并对NVDLA寄存器进行编程配置每个功能模块

运行时环境使用保存为NVDLA Loadable镜像的神经网络存储表示,从NVDLA Loadable的角度来看,软件中的每个编译“层”在NVDLA实现中的功能块上都是可加载的。每一层包括关于它对其它层的依赖、它在存储器中用于输入和输出的缓存器(buffer)、以及用于执行每个功能块的特定配置信息。各层通过依赖关系图链接在一起,引擎调度器使用依赖关系图来调度各个层。Loadable NVDLA格式在Compiler实现和UMD实现之间是标准化的,所有符合NVDLA标准的实现都应该至少能够解释任何NVDLA Loadable映像,即使该实现可能缺少一些使用该Loadable映像运行推理所需的功能。

用户模式驱动程序栈和内核模式驱动程序栈都是作为定义的API存在的,并且希望用系统可移植层包装,在可移植层中维护核心实现通常需要相对较少的更改,这加快了需要在多个平台上运行NVDLA软件堆栈的工作。有了适当的可移植层,相同的核心实现应该可以在Linux和FreeRTOS上很容易地编译。类似地,在具有紧密耦合到NVDLA协控制器的“headed”实现中,可移植层的存在使得在该协控制器上运行与在没有这种伴随协控制器的“headless”实现中的主CPU上运行,使用相同的内核模式驱动程序成为可能。

用户模式驱动(UMD)

UMD提供了标准的应用编程接口(Application Programming Interface, API ),用于处理loadable镜像,将输入和输出张量绑定到内存位置,并将推理作业提交给KMD。该层使用一组定义的数据结构将神经网络加载到内存中,并以实现-定义的方式(implementation-defined fashion)将其传递给KMD。例如,在Linux上,这可能是一个ioctl(),将数据从用户模式驱动程序传递到内核模式驱动程序;在单进程系统中,KMD运行在与UMD相同的环境中,这可能是一个简单的函数调用,底层函数在用户模式驱动程序中实现。

Application Programming Interface

运行时库的接口实现的功能有:在从文件中重新读取可加载缓冲区后,执行函数处理从应用程序传来的可加载缓冲区,为张量和中间缓冲区分配内存,准备同步点,最后将推理作业提交给KMD。提交给KMD的推理任务被称为DLA任务。

主要接口介绍

对应的类名:nvdla::IRuntime

使用Runtime Interface 提交推理任务包括以下步骤:

1)创建NVDLA运行时实例

IRuntime *nvdla::createRuntime()

返回:IRuntime类实例。

2)获取NVDLA设备信息

NvU16 nvdla::IRuntime::getMaxDevices()

获取硬件配置支持的最大设备数量,运行时驱动程序支持向多个DLA设备提交推理作业,用户应用程序可以选择要使用的设备。一个任务不能跨设备分割,但一个任务只能提交给一个设备。

返回:支持的最大设备数。

NvU16 nvdla::IRuntime::getNumDevices()

从硬件配置支持的最大设备数量中获取可用设备的数量。

返回:可用设备数。

3)加载神经网络数据

NvError nvdla::IRuntime::load(const NvU8 *buf, int instance)

解析可从缓冲区加载的内容,并使用创建任务所需的信息更新ILoadable。

参数

buf:加载镜像buffer;

instance:加载这个神经网络的设备实例。

返回: NvError。

4)获取输入和输出张量信息

NvError nvdla::IRuntime::getNumInputTensors(int *input_tensors)

从加载的信息中获取神经网络输入张量。

参数

input_tensors:指针,用于更新输入张量的值。

返回:NvError。

NvError nvdla::IRuntime::getInputTensorDesc(int id, NvDlaTensor *tensors)

用于获取神经网络的输入张量描述符。

参数

id:张量的ID;

tensors:张量的描述符。

返回:NvError。

NvError nvdla::IRuntime::getNumOutputTensors(int *output_tensors)

从加载的信息中获取神经网络输出张量。

参数

output_tensors:指针,用于更新输出张量的值。

返回:NvError。

NvError nvdla::IRuntime::getOutputTensorDesc(int id, NvDlaTensor *tensors)

用于获取神经网络的输出张量描述符。

参数:

id:张量的ID;

tensors:张量的描述符。

返回:NvError。

5)更新输入和输出张量信息

仅当张量信息改变时才需要,并非所有参数都可以改变。

NvError nvdla::IRuntime::setInputTensorDesc(int id, const NvDlaTensor *tensors)

设置神经网络的输入张量描述符。

参数

id:张量的ID; tensors:张量的描述符。

返回:NvError。

NvError nvdla::IRuntime::setOutputTensorDesc(int id, const NvDlaTensor *tensors)

设置神经网络的输出张量描述符。

参数

id:张量的ID;

tensors:张量的描述符。

返回:NvError。

6)为输入和输出张量分配内存

NvDlaError allocateSystemMemory(void **h_mem, NvU64 size, void **pData)

为输入和输出张量分配可由NVDLA访问的DMA内存。

参数

 h_mem: 存储内存句柄指针;

size:分配内存的大小;

pData: 分配内存的虚拟地址。

返回: NvError。

7)将内存句柄绑定到张量

NvError nvdla::IRuntime::bindInputTensor(int id, void *hMem)

NvError nvdla::IRuntime::bindOutputTensor(int id, void *hMem)

两个函数分别绑定输入和输出张量到内存句柄(memory handle).

参数

id:张量ID; hMem:

DLA内存句柄,由allocateSystemMemory()返回。

返回:NvError。

8)提交任务进行推理

提交推理任务,它阻塞了调用。

NvError nvdla::IRuntime::submit()

返回: NvError。

9)卸载神经网络资源

NvError nvdla::IRuntime::unload(int instance)

卸载网络数据,如果没有使用相同网络提交推理的计划,则释放所有用于神经网络的资源。

返回:NvError。

可移植层

UMD的可移植层(Portability layer)实现了访问NVDLA设备、分配DMA内存和将任务提交给底层驱动程序的功能。为了这个功能,UMD必须与KMD通信,并且通信接口依赖于操作系统。可移植层抽象了这个依赖于操作系统的接口。

主要类型和接口介绍

NvError类型

错误代码的枚举。

NvDlaHeap类型

内存堆来分配内存,NVDLA支持两个内存接口。通常,这些接口连接到DRAM(系统存储器)和内部SRAM,KMD可以根据内存类型维护单独的堆进行分配。

NvDlaMemDesc类型

内存描述符,它包括内存句柄和缓冲区大小。

NvDlaTask类型

DLA任务结构体,运行时驱动程序使用来自可加载的信息来填充它,并且被可移植层用来以实现定义的方式向KMD提交推理任务。

NvError NvDlaInitialize(void **session_handle)

该API用于初始化可移植层的会话(session),这可能包括分配维护诸如设备上下文、文件描述符之类的信息所需的一些结构,该函数可以为空。

参数: session_handle–更新会话句柄地址的[out]指针,该地址可以在此后调用的任何API中传递,可移植性层可以使用该地址来恢复会话信息。

返回 NvError。

void NvDlaDestroy(void * session_handle)

释放所有会话资源。

参数:session_handle–从NvDlaInitialize()获得的会话句柄地址。

NvError NvDlaOpen(void * session_handle,NvU32 instance,void **device_handle)

这个API应该用于打开DLA设备实例。

参数:session_handle–从NvDlaInitialize()获得的会话句柄地址。instance–SoC中有多个实例时要使用的NVDLA实例。

device_handle–[out]指针,用于更新设备上下文,它用于获取需要设备上下文进一步回调所需的设备信息。

返回 NvError

void NvDlaClose(void * session _ handle,void *device_handle)

关闭DLA设备实例

参数:

session_handle–从NvDlaInitialize()获得的会话句柄地址。

device_handle–从NvDlaOpen()获得的设备句柄地址。

NvError NvDlaSubmit(void *session_handle,void *device_handle,NvDlaTask *tasks,NvU32 num_tasks)

向KMD提交推理任务

参数:

session_handle–从NvDlaInitialize()获得的会话句柄地址。

device_handle–从NvDlaOpen()获得的设备句柄地址。

tasks–要提交进行推理的任务列表。

num_tasks–要提交的任务数。

返回 NvError

NvError NvDlaAllocMem(void *session _ handle,void *device_handle,void **mem_handle,void **pData,NvU32 size,NvDlaHeap heap)

分配、固定和映射DLA引擎可访问内存。例如,对于DLA位于IOMMU之后的系统的情况,此调用应确保为该内存创建IOMMU映射。对于Linux,内部实现可以使用现成的框架,比如ION

参数:

session_handle–从NvDlaInitialize()获得的会话句柄地址。

device_handle–从NvDlaOpen()获得的设备句柄地址。

mem_handle–[out]由这个函数更新的内存句柄。

pData–[out]如果分配和映射成功,则提供一个虚拟地址,通过该地址可以访问内存缓冲区。

Size–要分配的缓冲区大小。

堆–实现定义的内存堆选择。

返回 NvError

NvError NvDlaFreeMem(void *session_handle,void *device_handle,void *mem_handle,void *pData,NvU32 size)

释放掉NvDlaAllocMem()分配的DMA内存。

参数:

session_handle–从NvDlaInitialize()获得的会话句柄地址。

device_handle–从NvDlaOpen()获得的设备句柄地址。

mem_handle–从NvDlaAllocMem()获得的内存句柄地址。

pData–NvDlaAllocMem()返回的虚拟地址。

Size–分配的缓冲区的大小。

返回 NvError

void NvDlaDebugPrintf(const char *format,...)

向调试控制台输出消息(如果有)。

参数: format–指向格式字符串的指针。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据看板多端查看无压力,教你轻松设置响应式布局

最近,山海鲸可视化新增了一个非常实用的功能,叫作“响应式布局”。今天我来为大家介绍一下这个新功能以及它如何提升我们在不同设备上的使用体验。 你可能在用手机浏览网页时注意到,有些网站在手机和电脑上的显示方式几乎相同。然而&#xff…

讯方·智汇云校北京校区

讯方智汇云校北京校区介绍 讯方技术紧抓国家数智化转型契机,依托京西智谷,建立AI智算产业人才能力中心,提供智算全流程服务和智算人才培养。研发了讯方AI场景创新工坊、讯方AI行业支撑智能体等核心产品,同时导入华为全系列智算人…

C++20中头文件bit的使用

C20中头文件bit是数字库(numeric library)的一部分,定义用于访问、操作和处理单个位和位序列(individual bits and sequences of bits)的函数。 1.std::endian:指示标量类型的字节序(byte order),支持little(小端序)、big(大端序)、native: 如果所有标量…

AI大模型行业深度:行业现状、应用情况、产业链及相关公司深度梳理

随着人工智能技术的迅猛发展,AI大模型已经成为全球科技竞争的焦点、未来产业的关键赛道以及经济发展的新动力,展现出巨大的发展潜力和广阔的应用前景。目前,AI大模型的应用落地引发行业关注。技术的持续进步促使AI大模型的应用逐步从云端向终…

GitLab CI Runner安装

参考文章:[花了两天,搞了Gitlab-Runner CI/CD实现自动化部署,可比Jenkins香太多啦!!!!_gitlab的cicd取代jenkens-CSDN博客] Gitlab的CI需要安装CI专用的GitLab Runner,否则跑不起来…

Vue+SpringBoot+数据库整体开发流程 2

本篇是继我的另一篇博客VueSpringBoot数据库整体开发流程 1-CSDN博客 目录 四、前端开发 简单开发 启动项目 五、前后端联通 四、前端开发 简单开发 (1)直接修改项目的App.vue文件中的route-link, (2)新建这个Fe…

【北京迅为】《STM32MP157开发板使用手册》- 第二十章 Trusted Firmware-A 移植+第二十一章 U-Boot移植

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器,既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构,主频650M、1G内存、8G存储,核心板采用工业级板对板连接器,高可靠,牢固耐…

炸裂!新版 SD WebUI Forge 出图速度更快!支持最新Flux 模型!(保姆级安装教程)

大家是不是经常为SD WebUI卡顿、爆显存而苦恼?一启动SD 电脑就开始发烫, 尤其低显存用户屡屡"中招",不得不一遍遍重启。作为AI绘画的必备工具,WebUI却还有这么多"坑",着实让人不爽!😠 好消息是,…

盘点2024年8月Sui生态发展,了解Sui近期成长历程

随着技术的不断沉淀和产品的不断打磨,Sui生态在2024年8月取得了令人欣喜的进步。作为创新的L1协议,Sui不仅在技术革新方面表现突出,还在DeFi、游戏应用和开发者工具等领域展现出强大的潜力。 本篇文章将全面盘点Sui在过去一个月内的技术创新…

Vue3生命周期钩子函数(Vue3生命周期)

前言 Vue 3 引入了一些变化,特别是针对生命周期钩子函数。Vue 3 支持两种API风格:传统的选项式API(Options API)和新的组合式API(Composition API)。我们都知道选项式 API 是 Vue 2 中熟悉的语法风格&#…

opencv学习:模板匹配和argparse 模块的代码实现及优缺点

模板匹配 模板匹配算法(Template Matching Algorithm),这是一种在图像处理和计算机视觉领域常用的方法,用于在一个大图像中寻找一个小模板图像的位置。模板匹配算法通过滑动窗口的方式在目标图像上移动模板图像,并计算…

数据结构 Java DS——分享部分链表题目 (2)

前言 关于JAVA的链表,笔者已经写了两篇博客来介绍了,今天给笔者们带来第三篇,也是分享了一些笔者写过的,觉得挺好的题目,链接也已经挂上了,笔者们可以去看看 入门数据结构JAVA DS——如何实现简易的单链表(用JAVA实现)-CSDN博客 数据结构 Java DS——链表部分经典题目 (1)-C…

Vue双向数据绑定代码解读

Vue核心基础-CSDN博客 数据双向绑定原理_哔哩哔哩_bilibili 原理示意图 前置知识 reduce()方法 用于链式获取对象的属性值 Object.defineProperty()方法 Object.defineProperty(obj, prop, descriptor) obj:要定义属性的对象。prop:要定义或修改的属性…

睿考网:中级经济师报名条件中的相关工作怎么定义?

在中级经济师报考条件中,明确不同学历需要满足相关工作经验的要求,怎么看我的工作是否为相关工作呢? 1.从事经济类相关的工作岗位 也就是说考生在本单位从事的工作性质需要与经济行业相关,如本单位的财务、会计、审计、出纳等相…

原地旋转数组--189. 轮转数组

189. 轮转数组 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步:…

传授大伙如何用ai工具优化自己的代码》》拥抱机器时代》》提示词工程

之前在做数据开发时候遇到的问题数据表格批量生成建表的宏出问题了,此时只好硬着头皮写vba代码,此时您想我不会vba也不知道怎么使用但是sql语句建表格式总还是知道的那么此刻开始我们的提示词开发代码时刻 先进行具体提示词开发>>>>>>>>>…

SpringCloud nacos

**************************** 准备工作 首先准备号nacos的镜像 根据镜像创建nacos容器 nacos:container_name: nacosimage: nacos/nacos-server:v2.1.0-slimports: #需要监听三个端口- "8848:8848"- "9848:9848"- "9849:9849"privileged: tr…

Axure高效打造大屏可视化BI数据展示

在使用AxureRP软件设计大屏可视化BI数据显示模板时,我们可以遵循一系列高效的方法和步骤来确保设计的质量和效率。以下是一个详细的教程,指导如何高效地使用AxureRP进行大屏界面设计。 一、确定设计标准与分辨率 通常,大屏可视化设计以标准的…

MySQL事务【后端 13】

MySQL事务 在数据库管理系统中,事务(Transaction)是一个非常重要的概念,它确保了数据库操作的完整性和一致性。MySQL作为一种流行的关系型数据库管理系统,自然也支持事务处理。本文将深入探讨MySQL事务的基本概念、特性…

基于YOLOv8的PCB缺陷检测算法,加入一种基于内容引导注意力(CGA)的混合融合方案(一)

💡💡💡本文内容:针对基于YOLOv8的PCB缺陷检测算法进行性能提升,加入各个创新点做验证性试验。 1)提出了一种基于内容引导注意力(CGA)的混合融合方案,mAP0.5由原始的0.966提升至0.975 1.PCB缺陷…