开发日志[第7周]:规划将NPU当作CPU的计算资源进行管理 #7
Dirinkbottle
announced in
Announcements
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
工作进展:本周主要做的是规划,无实习任务相关的实质性代码工作
本周做出了对下周工作的详细规划以及个人对aarch64的详细学习
-规划如下:
NPU 协处理器化架构设计 (NPU as FPU)
1. 概述
本项目提出并实现一种创新的异构计算架构,旨在将 NPU 从传统的、基于 VFS/ioctl 的“设备”模型,提升为与 CPU 核心紧耦合的“协处理器”。其设计目标是通过极致的软硬件协同,实现 NPU 算力调度
2. 核心设计哲学
彻底废弃传统基于 VFS(虚拟文件系统)和
ioctl的松耦合设备驱动模型。将 NPU 提升为与 CPU 平级的计算协处理器(类比 FPU 浮点运算单元)。通过共享 DMA 内存、定制化系统调用(Syscall)与“懒汉式”上下文切换(Lazy Context Switch)实现算力调度。3. 内核数据结构扩展 (TCB 升级)
为了让操作系统的调度器(Scheduler)能够接管 NPU 资源,必须扩展内核的任务控制块(TCB /
task_struct):npu_isdirty: booltrue:表示当前物理 NPU 硬件的内部 SRAM 和寄存器中,依然保留着该任务的数据和状态。false:表示该任务的 NPU 状态已被换出,或者尚未使用过 NPU。npu_context: struct4. 用户态基础框架 (
libnpu)在用户层封装底层细节,向应用程序开发者提供极简的 C/C++ 接口。
专属内存分配 (
dma_malloc系统调用)malloc。用户通过dma_malloc直接向内核申请一段物理地址连续的 DMA 内存。强制中断注入
libnpu会在底层介入,将每个微小可配置算子任务结构体中的中断控制位(IRQ Enable)强制设为开启。这是后续内核能够精准捕获算子边界、实现状态保存的关键。内联汇编触发 (
npu_workAPI)SVC陷入指令),直接触发定制的resolve_npu系统调用。5. 内核态调度核心 (
resolve_npu系统调用)这是整个架构的调度心脏。当 CPU 通过
SVC陷入内核态后,严格按照以下流水线执行:阶段 1:内存转换与前置检查
IDLE或BUSY)。阶段 2:懒汉式上下文切换 (Lazy Context Switch)
调度器需要仲裁当前物理 NPU 硬件的归属权。
npu_isdirty == true,且该任务并非当前请求任务。IDLE。如果是BUSY,当前 CPU 线程必须挂起睡眠(加入等待队列),直到 NPU 算完当前算子并触发硬件中断。IDLE后,内核立刻将 NPU 硬件内的全量寄存器状态抽取出来,保存到那个“前任任务”的npu_context中。npu_isdirty标志位修改为false。阶段 3:恢复当前状态并启动硬件
npu_context(即之前被切换出去的状态)。npu_context里的数据原封不动地写回 NPU 的物理控制寄存器。npu_isdirty标志位置为true。BUSY,CPU 退出系统调用,返回用户态继续执行或调度其他普通线程。6. 硬件中断处理程序 (NPU IRQ Handler)
由于
libnpu强制开启了每个算子的中断,NPU 每算完一个微小算子就会发出硬件 IRQ。IDLE(空闲)。resolve_npu系统调用中,因为 NPUBUSY而挂起睡眠的其他任务线程,让它们得以重新参与 NPU 的抢占与上下文切换流程。Beta Was this translation helpful? Give feedback.
All reactions