php网站开发工程师招聘要求,西安可以做网站的,自己做网站要多久,重庆建设网站的公司简介核心模式驱动#xff08;Kernel Mode Driver#xff09; KMD主入口点在内存中接收一个推理作业#xff0c;从多个可用的作业中选择要执行的作业(如果在多进程系统上)#xff0c;并将其提交给核心引擎调度程序。该核心引擎调度程序负责处理来自NVDLA的中断#xff0c;调度每…核心模式驱动Kernel Mode Driver KMD主入口点在内存中接收一个推理作业从多个可用的作业中选择要执行的作业(如果在多进程系统上)并将其提交给核心引擎调度程序。该核心引擎调度程序负责处理来自NVDLA的中断调度每个独立功能块上的层并根据层的完成情况更新任何依赖关系。调度器使用来自依赖图的信息来确定后续层何时准备好被调度这允许编译器以优化的方式决定层的调度并避免KMD不同实现的性能差异。 核心引擎接口
神经网络被转换成硬件层以便在DLA硬件上执行。这些层使用依赖图相互连接并由被称为引擎调度器engine scheduler的模块在DLA上执行这个调度器负责更新依赖计数、处理事件和编程硬件层。它是DLA软件的核心模块可跨不同操作系统移植。可移植层应该使用底层的接口来启用核心引擎模块核心引擎模块也被称为固件firmware因为相同的源代码将用于配套控制器的固件中。
KMD一般的执行顺序如下
1probe期间用固件注册驱动程序
int32_t dla_register_driver(void **engine_contextvoid *driver_context)
此函数必须在启动时调用一次以初始化DLA引擎调度程序并在提交任何任务之前向固件注册驱动程序。将指针传递到param driver_context中的驱动程序上下文当固件调用可移植层的任何函数时该上下文作为param传递。它还更新指向引擎上下文的指针该指针必须在此后任何对固件的函数调用中传递。
参数
engine_context–指向引擎特定数据的指针
driver_context–指向驱动程序特定数据的指针。
返回
0表示成功负值表示错误
2驱动程序提交任务信息以供执行
dla_task_descriptor类型
任务描述符结构体该结构包括执行神经网络所需的所有信息例如层数、依赖图地址等。
int32_t dla_execute_task(void *engine_contextvoid *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_contextuint32_t addr)
读取DLA硬件寄存器可移植层负责使用正确的基址并在需要时负责任何IO映射。
参数
driver_context–dla_register_driver()中接收的驱动程序特定数据
addr–寄存器偏移。
返回
寄存器值
void dla_reg_write(void *driver_contextuint32_t addruint32_t reg)
写DLA硬件寄存器可移植层负责使用正确的基址并在需要时负责任何IO映射。
参数
driver_context–dla_register_driver()中接收的驱动程序特定数据
addr–寄存器偏移
reg–要写入的值。
int32_t dla_read_DMA_address(struct dla_task_desc *task_descint16_t indexvoid *dst)
从地址列表中指定的索引处读取DMA地址功能块编程操作使用该函数为功能块中DMA引擎读取地址。
参数
task_desc–正在执行的任务的任务描述符;
index–地址列表中的索引;
dst–指向更新地址的目标指针。
返回
0表示成功错误代码表示失败。
int 32_t dla_read_CPU_address(struct dla_task_desc *task _ descint16_t indexvoid *dst)
从指定索引处的地址列表中读取CPU可访问的地址引擎调度程序使用此函数从内存缓冲区读取数据运行引擎调度程序的处理器必须能够访问此函数返回的地址。
参数
task_desc–正在执行的任务的任务描述符;
index–地址列表中的索引;
dst–指向更新地址的目标指针。
返回
0表示成功错误代码表示失败
int32_t dla_data _read(void *driver_contextvoid *task_datauint64_t srcvoid *dstuint32_t sizeuint64_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 _ contextvoid *task_datavoid *srcuint64_t dstuint32_t sizeuint64_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_contextvoid *task_dataint16_t indexvoid *dst_ptruint32_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 *srcint chuint64_t len)
用常量字节ch填充src指向的存储区的len字节长度。
参数
src–存储区地址
ch–要填充的字节
len–要填充的内存区域的长度。
返回
存储区地址。
void *dla_memcpy(void *destconst void *srcuint64_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–格式化字符串和变量参数。