NVDLA专题15:Runtime environment-核心模式驱动
核心模式驱动(Kernel Mode Driver)

KMD主入口点在内存中接收一个推理作业,从多个可用的作业中选择要执行的作业(如果在多进程系统上),并将其提交给核心引擎调度程序。该核心引擎调度程序负责处理来自NVDLA的中断,调度每个独立功能块上的层,并根据层的完成情况更新任何依赖关系。调度器使用来自依赖图的信息来确定后续层何时准备好被调度,这允许编译器以优化的方式决定层的调度,并避免KMD不同实现的性能差异。

核心引擎接口
神经网络被转换成硬件层,以便在DLA硬件上执行。这些层使用依赖图相互连接,并由被称为引擎调度器(engine scheduler)的模块在DLA上执行,这个调度器负责更新依赖计数、处理事件和编程硬件层。它是DLA软件的核心模块,可跨不同操作系统移植。可移植层应该使用底层的接口来启用核心引擎模块,核心引擎模块也被称为固件(firmware),因为相同的源代码将用于配套控制器的固件中。
KMD一般的执行顺序如下:
1)probe期间用固件注册驱动程序
int32_t dla_register_driver(void **engine_context,void *driver_context)
此函数必须在启动时调用一次,以初始化DLA引擎调度程序,并在提交任何任务之前向固件注册驱动程序。将指针传递到@param driver_context中的驱动程序上下文,当固件调用可移植层的任何函数时,该上下文作为param传递。它还更新指向引擎上下文的指针,该指针必须在此后任何对固件的函数调用中传递。
参数
engine_context–指向引擎特定数据的指针;
driver_context–指向驱动程序特定数据的指针。
返回
0表示成功,负值表示错误
2)驱动程序提交任务信息以供执行
dla_task_descriptor类型
任务描述符结构体,该结构包括执行神经网络所需的所有信息,例如层数、依赖图地址等。
int32_t dla_execute_task(void *engine_context,void *task_data)
该函数初始化子引擎(sub-engines)并开始任务执行,从硬件接收的事件触发进一步的编程和层调度。
参数:
engine_context–dla_register_driver()中收到的引擎特定数据;
task_data–读取任务信息时要传递的任务特定数据。
返回
0表示成功,负值表示错误
3)固件对硬件层进行编程(后面移植层进行介绍)
4)从硬件接收到中断;
int32_t dla_isr_handler(void * engine_context)
当接收到DLA中断时,调用该函数,可移植层应该使用该平台支持的机制注册它自己的处理程序,并从处理程序中调用这个函数。当固件在进程上下文中对层进行编程时,对该函数的调用必须受到锁的保护,以防止处理中断。
参数
engine_context–dla_register_driver()中收到的引擎特定数据;
返回
0表示成功,负值表示错误
5)中断后处理事件的下半部分调用程序
int32_t dla_process_events(void *engine_context, uint32_t *task_complete)
中断处理程序只是记录事件,并不处理这些事件,中断处理程序完成后,可移植层必须在线程/进程上下文中调用该函数。
参数
engine_context–dla_register_driver()中收到的引擎特定数据;
task_complete–指向指示任务完成的参数指针,如果所有层都被处理,firmare向其写入1。
返回
0表示成功,负值表示错误
6)清理任务和引擎状态
void dla_clear_task(void *engine_context)
此函数重置引擎调度程序状态,包括操作描述符缓存、错误值、子引擎状态、事件等,并从固件中清除先前的任务状态。任务完成后,可移植层可以调用该函数,调用它不是强制性的,但是调用它将确保在下一个任务执行之前保持干净的状态。
参数
engine_context–dla_register_driver()中收到的引擎特定数据。
返回
0表示成功,负值表示错误。
可移植层
核心引擎模块(固件)独立于操作系统,但它仍然需要一些操作系统服务,如内存分配、读/写IO寄存器、中断通知,在KMD实现的可移植层应该为核心引擎模块提供以下接口的实现。
固件编程硬件层
uint32_t dla_reg_read(void * driver_context,uint32_t addr)
读取DLA硬件寄存器,可移植层负责使用正确的基址,并在需要时负责任何IO映射。
参数
driver_context–dla_register_driver()中接收的驱动程序特定数据;
addr–寄存器偏移。
返回
寄存器值
void dla_reg_write(void *driver_context,uint32_t addr,uint32_t reg)
写DLA硬件寄存器,可移植层负责使用正确的基址,并在需要时负责任何IO映射。
参数
driver_context–dla_register_driver()中接收的驱动程序特定数据;
addr–寄存器偏移;
reg–要写入的值。
int32_t dla_read_DMA_address(struct dla_task_desc *task_desc,int16_t index,void *dst)
从地址列表中指定的索引处读取DMA地址,功能块编程操作使用该函数为功能块中DMA引擎读取地址。
参数
task_desc–正在执行的任务的任务描述符;
index–地址列表中的索引;
dst–指向更新地址的目标指针。
返回
0表示成功,错误代码表示失败。
int 32_t dla_read_CPU_address(struct dla_task_desc *task _ desc,int16_t index,void *dst)
从指定索引处的地址列表中读取CPU可访问的地址,引擎调度程序使用此函数从内存缓冲区读取数据,运行引擎调度程序的处理器必须能够访问此函数返回的地址。
参数
task_desc–正在执行的任务的任务描述符;
index–地址列表中的索引;
dst–指向更新地址的目标指针。
返回
0表示成功,错误代码表示失败
int32_t dla_data _read(void *driver_context,void *task_data,uint64_t src,void *dst,uint32_t size,uint64_t offset)
这个函数从本地内存中UMD传递的缓冲区读取数据,经过的缓冲区地址在地址列表中共享,神经网络描述符包含这些缓冲区地址列表中的索引。固件将这些数据从UMD共享的缓冲区读入本地缓冲区,以使用这些信息。
参数
driver_context–dla_register_driver()中接收的驱动程序特定数据;
task_data–dla_execute_task()中接收的特定于任务的数据;
src–地址列表中的索引;
dst–本地存储器地址;
大小–数据大小;
offset–从UMD缓冲区开始的偏移量。
返回
0表示成功,错误代码表示失败
int32_t dla_data_write(void *driver _ context,void *task_data,void *src,uint64_t dst,uint32_t size,uint64_t offset)
此函数将数据从本地缓冲区写入UMD传递的缓冲区,经过的缓冲区地址在地址列表中共享,网络描述符包含这些缓冲区地址列表中的索引。固件将此数据从本地缓冲区写入UMD共享的缓冲区,以更新信息。
参数
driver_context–dla_register_driver()中接收的驱动程序特定数据;
task_data–dla_execute_task()中接收的特定于任务的数据;
src–本地存储器地址;
dst–地址列表中的索引;
大小–数据大小;
Offset–从UMD缓冲区开始的偏移量。
返回
0表示成功,错误代码表示失败。
DESTINATION_PROCESSOR
运行固件的处理器将访问内存。
DESTINATION_DMA
内存将由NVDLA DMA引擎访问
int32_t dla_get_dma_address(void * driver_context,void *task_data,int16_t index,void *dst_ptr,uint32_t destination)
UMD共享的一些缓冲区由负责DLA硬件编程的处理器访问,在有头配置的情况下,它将是伴随协控制器,而在无头配置的情况下,它将是主CPU。此外,一些缓冲区由子引擎内的DLA DMA引擎访问。根据配置,此函数应返回目标用户可访问的正确地址。
参数
driver_context–dla_register_driver()中接收的驱动程序特定数据;
task_data–dla_execute_task()中接收的特定于任务的数据;
index–地址列表中的索引;
dst_ptr–指向更新地址的指针;
destination–DMA地址、DESTINATION_PROCESSOR或DESTINATION_DMA的目的地用户。
int64_t dla_get_time_us(void)
以微秒为单位读取系统时间。
返回
以微秒为单位的时间值。
void *dla_memset(void *src,int ch,uint64_t len)
用常量字节ch填充src指向的存储区的len字节长度。
参数
src–存储区地址;
ch–要填充的字节;
len–要填充的内存区域的长度。
返回
存储区地址。
void *dla_memcpy(void *dest,const void *src,uint64_t len)
参数
dest–目标存储区地址;
src–源存储区地址;
len–要复制的内存区域的长度。
返回
目标存储区地址
void dla_debug(const char *str,...)
将调试消息打印到控制台
参数
str–格式化字符串和变量参数
void dla_info(const char *str,...)
将信息消息打印到控制台
参数
str–格式化字符串和变量参数
void dla_warn(const char *str,...)
将警告消息打印到控制台
参数
str–格式化字符串和变量参数
void dla_error(const char *str,...)
将错误消息打印到控制台
参数
str–格式化字符串和变量参数。
相关文章:
NVDLA专题15:Runtime environment-核心模式驱动
核心模式驱动(Kernel Mode Driver) KMD主入口点在内存中接收一个推理作业,从多个可用的作业中选择要执行的作业(如果在多进程系统上),并将其提交给核心引擎调度程序。该核心引擎调度程序负责处理来自NVDLA的中断,调度每…...
计算机毕业设计选题推荐-班级管理系统-教务管理系统-Java/Python项目实战
✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…...
推荐一款开源、高效、灵活的Redis桌面管理工具:Tiny RDM!支持调试与分析功能!
1、引言 在大数据和云计算快速发展的今天,Redis作为一款高性能的内存键值存储系统,在数据缓存、实时计算、消息队列等领域发挥着重要作用。然而,随着Redis集群规模的扩大和复杂度的增加,如何高效地管理和运维Redis数据库成为了许…...
Java项目: 基于SpringBoot+mybatis+maven新闻推荐系统(含源码+数据库+毕业论文)
一、项目简介 本项目是一套基于SpringBootmybatismaven新闻推荐系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简单、…...
《Python读取 Excel 数据》
关于如何在 Python 中读取excel数据。 方法一: 我们可以使用 pandas 库来读取 Excel 数据。 通过以下命令安装: pip install pandas 以下是读取 Excel 数据的代码: import pandas as pd # 读取 Excel 文件 data pd.read_excel(…...
Druid连接池
一.什么是Druid连接池? Druid 是阿里巴巴开源的一款数据库连接池(Database Connection Pool),具有高效、稳定、安全等特点。除了连接池的功能外,Druid 还提供了强大的 SQL 监控、统计、日志记录、防火墙等功能。它主要…...
Python3网络爬虫开发实战(14)资讯类页面智能解析
文章目录 一、详细页智能解析算法1.1 提取标题1.2 提取正文1.3 提取时间 二、列表页智能解析算法三、智能分辨列表页和详细页四、完整的库4.1 参考文献4.2 Project 页面智能解析就是利用算法从页面的 HTML 代码中提取想要的内容,算法会自动计算出目标内容在代码中的…...
社交媒体的未来:Facebook如何通过AI技术引领潮流
在数字化时代的浪潮中,社交媒体平台不断演变,以适应用户需求和技术发展的变化。作为全球领先的社交媒体平台,Facebook在这一进程中扮演了重要角色。尤其是人工智能(AI)技术的应用,正在深刻地改变Facebook的…...
Java 面试题:从源码理解 ThreadLocal 如何解决内存泄漏 ConcurrentHashMap 如何保证并发安全 --xunznux
文章目录 ThreadLocalThreadLocal 的基本原理ThreadLocal 的实现细节内存泄漏源码使用场景 ConcurrentHashMap 怎么实现线程安全的CAS初始化源码添加元素putVal方法 ThreadLocal ThreadLocal 是 Java 中的一种用于在多线程环境下存储线程局部变量的机制,它可以为每…...
使用人力劳务灵工安全高效的发薪工具
实现企业、劳务、蓝领工人三方的需求撮合、劳务交付、日结考勤、薪费结算一体化闭环,全面为人力企业降低用工成本、提高用工效率。 发薪难 日结/周结/临时工人员难管理,考勤难统计,发薪耗时间 发薪慢 人工核算时间长,微信转账发薪容易限额…...
使用W外链创建微信短链接的方法
创建短链是将长链接转换为更短、更易于分享和记忆的链接的过程。W外链是一个提供短链接生成服务的平台,它支持多种功能,包括但不限于: 短链制作:用户可以将长链接缩短为易于分享的短链接,还支持自定义短链后缀。防红防…...
【人工智能学习笔记】4_4 深度学习基础之生成对抗网络
生成对抗网络(Generative Adversarial Network, GAN) 一种深度学习模型,通过判别模型(Discriminative Model)和生成模型(Generative Model)的相互博弈学习,生成接近真实数据的数据分…...
基于MinerU的PDF解析API
基于MinerU的PDF解析API - MinerU的GPU镜像构建 - 基于FastAPI的PDF解析接口支持一键启动,已经打包到镜像中,自带模型权重,支持GPU推理加速,GPU速度相比CPU每页解析要快几十倍不等 主要功能 删除页眉、页脚、脚注、页码等元素&…...
猫头虎分享:看完百度内部讲话,整理出李彦宏关于大模型的10个判断
🦁 猫头虎分享:看完百度内部讲话,整理出李彦宏关于大模型的10个判断 📢 大家好!我是猫头虎技术团队的首席写作官。今天为大家带来一篇重量级内容:从百度内部讲话中,整理了李彦宏对大模型的10大…...
vue3透传、注入
属性透传 传递给子组件时,没有被子组件消费的属性或事件,常见的如id、class 注意1 1.class、style是合并的,style中如果出现重复的样式,以透传属性为准2.id属性是以透传属性为准,其他情况透传属性名相同,…...
数模原理精解【9】
文章目录 混合高斯分布概述定义性质参数估计计算Julia实现 详述定义原理 核心参数1. 均值(Means)2. 协方差矩阵(Covariance Matrices)3. 权重(Weights)4. 聚类个数(高斯模型个数,K&a…...
Java中的linkedList类及与ArrayList的异同
继承实现关系 public class LinkedList<E>extends AbstractSequentialList<E>implements List<E>, Deque<E>, Cloneable, java.io.Serializable 由于涉及的类过多,画起来过于繁琐,这里只展示最外层的继承实现关系 可以看到它是…...
【精选】文件摆渡系统:跨网文件传输的安全与效率之选
文件摆渡系统可以解决哪些问题? 文件摆渡系统(File Shuttle System)主要是应用于不同网络、网段、区域之间的文件数据传输流转场景, 用于解决以下几类问题: 文件传输问题: 大文件传输:系统可…...
tkinter 电子时钟 实现时间日期 可实现透明 无标题栏
下面是一个使用tkinter库实现的简单电子时钟的例子,可以显示当前的日期和时间,并且可以设置窗口为透明且无标题栏。 import tkinter as tk import timedef update_time():current_time time.strftime("%Y-%m-%d %H:%M:%S")label.config(text…...
【hot100-java】【除自身以外数组的乘积】
R8-普通数组篇 印象题,计算前缀,计算后缀,计算乘积。 class Solution {public int[] productExceptSelf(int[] nums) {int n nums.length;int[] prenew int[n];pre[0]1;for (int i1;i<n;i){pre[i]pre[i-1]*nums[i-1];}int[] sufnew int[…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
WEB3全栈开发——面试专业技能点P7前端与链上集成
一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染(SSR)与静态网站生成(SSG) 框架,由 Vercel 开发。它简化了构建生产级 React 应用的过程,并内置了很多特性: ✅ 文件系…...
