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

运行时环境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.rhkb.cn/news/420755.html

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

相关文章

网络药理学:1、文章基本思路、推荐参考文献、推荐视频

文章基本思路 选择一味中药或者中药复方(常见的都是选择一味中药,如:大黄、银柴胡等),同时选择一个要研究的疾病(如食管癌等)获得中药的主要化学成分或者说活性成分(有时候也以化合…

第146天:内网安全-Web权限维持各语言内存马Servlet-api类Spring类Agent类

目录 前置知识及资源 案例一: 权限维持-Web-内存马-PHP 案例二: 权限维持-Web-内存马-Python 案例三: 权限维持-Web-内存马-JAVA 案例四: 权限维持-Web-内存马-哥斯拉&冰蝎 哥斯拉 ​编辑 冰蝎 前置知识及资源 什么是…

程序员如何写笔记并整理资料?

整理笔记 word。没错,我也看了网上一大堆软件,还有git管理等等。个人认为如果笔记只是记录个人的经验积累,一个word就够了,那些notepad,laTex个人觉得不够简练。word。 1.word可以插入任何文件附件(目前最大的word 20…

C++笔记---list

1. list的介绍 list其实就是就是我们所熟知的链表(双向循环带头结点),但其是作为STL中的一个类模板而存在。 也就是说,list是可以用来存储任意类型数据的顺序表,既可以是内置类型,也可以是自定义类型&…

六西格玛绿带培训多少钱

在探讨“六西格玛绿带培训多少钱”这一主题时,我们不得不深入了解六西格玛方法论在企业质量管理中的重要作用,以及绿带培训作为这一方法论推广和应用的关键环节。六西格玛,作为一种以数据驱动的管理哲学和方法论,旨在通过减少缺陷…

深入理解Java中的clone对象

目录 1. 为什么要使用clone 2. new和clone的区别 3. 复制对象和复制引用的区别 4.浅克隆和深克隆 5. 注意事项 1. 为什么要使用clone 在实际编程过程中,我们常常遇到这种情况:有一个对象 A,需要一个和 A 完全相同新对象 B,并…

ModuleNotFoundError: No module named ‘keras.layers.core‘怎么解决

问题 ModuleNotFoundError: No module named keras.layers.core,如图所示: 如何解决 将from keras.layers.core import Dense,Activation改为from tensorflow.keras.layers import Dense,Activation,如图所示: 顺利运行&#xf…

IOS Siri和快捷指令打开app

使用场景 需要Siri打开应用或者在自定义快捷指令打开应用,并携带内容进入应用。 1.创建Intents文件 1.1 依次点开File->New->File 1.2 搜索intent关键字找到 SiriKit Intent Definition File文件 1.3 找到刚才创建的Intent文件,点击然后New Inte…

【JS逆向学习】快乐学堂登陆接口(自定义DES加密、ddddocr验证码识别)

逆向目标 网址:https://www.91118.com/Passport/Account/Login接口:https://www.91118.com/passport/Account/LoginPost参数: passr 逆向过程 输入手机号、密码、验证码 点击登陆,多试几次,然后观察并比较不通请求…

MMO 地图传送,UI系统框架设计

地图传送 创建传送点 建碰撞器触发 //位置归零 建一个传送门cube放到要传送的位置(这个teleporter1是传出的区域 这是从另一张地图传入时的传送门 创建一个脚本TeleporterObject给每个传送cube都绑上脚本 通过脚本,让传送门在编辑器下面还能绘制出来 …

GIT | git提交注释自动添加信息头

GIT | git提交注释自动添加信息头 时间:2024年9月6日10:20:11 文章目录 GIT | git提交注释自动添加信息头1.操作2.commit-msg文件 1.操作 2.commit-msg文件 #!/bin/sh # # An example hook script to check the commit log message. # Called by "git commit&q…

基于SpringBoot+Vue+MySQL的流浪猫狗宠物救助救援网站管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 在当今社会,随着宠物数量的激增及人们关爱动物意识的提升,流浪猫狗问题日益严峻。为解决这一问题,构建一套高效、便捷的流浪猫狗宠物救助救援网站管理系统显得尤为重要。本系统基于SpringBoot…

CSP-CCF★★★201812-2小明放学★★★

目录 一、问题描述 二、解答 (1)注意: (2)80分版: (3)100分版: 三、总结 一、问题描述 二、解答 (1)注意: 题目的n小于等于10的…

m3u8网页视频文件爬取与视频合成

文章目录 m3u8网页视频文件爬取与视频合成下载m3u8文件下载m3u8文件列表所对应的ts文件下载ffmpeg m3u8网页视频文件爬取与视频合成 我们经常在网络上找到的自己想要的视频素材却无法下载,并且打开控制台一看视频是通过分割成一份份的.ts文件发送过来的。 下载m3u8…

零信任安全:重新思考数字世界的访问

目录 ​编辑 网络安全形势的演变 数字安全的变化 引入零信任安全 零信任的当今意义 了解零信任原则 零信任架构的核心概念 实施微分段 持续验证:积极主动的立场 与传统安全模型的对比 在现代企业中实施零信任 零信任实施基础知识 多重身份验证 (MFA) 的…

c++(继承、模板进阶)

一、模板进阶 1、非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。 非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中…

非监督式机器学习:群集

聚类分析是一种非监督式机器学习形式,在此形式下,基于观察值的数据值或特征的相似性,将观察值分组到群集中。 这种就是非监督式机器学习,因为它不使用先前已知的标签值来训练模型。 在聚类分析模型中,标签是群集&#…

帧缓冲 framebuffer

一、基本概念 framebuffer: 帧缓存、帧缓存(显示设备) Linux内核为显示提供的一套应用程序接口。(驱动内核支持) 分辨率: 像素点 显示屏:800 * 600(横向有800个像素点,纵向有60…

DAY73

作业 pro文件&#xff1a; QT texttospeech 头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPushButton> //按钮类 #include <QLabel> //标签类 #include <QLineEdit> //行编译器类 #include…

阿里中间件——diamond

一、前言 最近工作不忙闲来无事&#xff0c;仔细分析了公司整个项目架构&#xff0c;发现用到了很多阿里巴巴集团开源的框架&#xff0c;今天要介绍的是中间件diamond. 二、diamond学习笔记 1、diamond简介 diamond是一个管理持久配置&#xff08;持久配置是指配置数据会持久化…