3、Ethos-U架构解析:Ethos-U55/U65 NPU架构、内存层次结构、DMA机制、与CPU/GPU的差异
Ethos-U系列NPU是Arm面向Cortex-M与Cortex-A系列处理器推出的专用神经网络加速单元,其设计目标并非追求极致算力,而是在功耗、面积与推理延迟之间取得平衡。理解Ethos-U55与U65的架构差异、内存层次结构以及DMA搬运机制,是进行图像分割模型内存带宽优化的前提。本章将从硬件微架构出发,剖析其数据通路与调度逻辑,并与CPU、GPU的典型执行模型进行对比,帮助开发者建立针对NPU的优化思维框架。
3.1 Ethos-U55与U65的微架构核心原理
Ethos-U55与U65共享同源的微架构设计理念,即“命令驱动、数据流触发、权重驻留”。两者均不包含通用可编程内核,而是由一组专用的MAC(乘累加)阵列、激活SRAM、权重SRAM以及DMA引擎构成。NPU通过主机CPU(Cortex-M或Cortex-A)下发命令描述符(Command Descriptor)来启动推理任务,命令描述符中包含了输入特征图(IFM)地址、输出特征图(OFM)地址、权重地址、算子类型、步长、填充等参数。
U55的MAC阵列规模为8x8x16(即8行8列,每个MAC支持16位乘累加)或16x16x8(8位乘累加),峰值算力约0.5 TOPS(8位整数)。U65则将MAC阵列扩展至32x32x8或32x16x16,峰值算力提升至4 TOPS(8位整数),并增加了对多命令队列和更复杂数据流调度的支持。两者均采用权重驻留(Weight Stationary)的数据流模式:权重从外部存储器加载后尽可能长时间保存在片上SRAM中,而输入激活则流式通过MAC阵列。这种模式对于图像分割模型尤为重要,因为分割网络的卷积层通常具有较大的通道数,权重复用率较高。
在指令执行层面,NPU并不像CPU那样逐条取指译码,而是通过硬件状态机解析命令描述符,直接控制DMA搬运和MAC计算。这意味着NPU的“程序”实际上是数据流图,而非指令流。开发者通过Vela编译器将TFLite模型转换为Ethos-U可执行的命令流(Command Stream),该过程会进行算子融合、权重重排、内存规划等优化。
3.2 内存层次结构与带宽瓶颈分析
Ethos-U的内存层次结构相对简洁,主要分为三个层级:外部大容量存储(Flash/DDR)、片上SRAM(权重SRAM + 激活SRAM)以及寄存器级缓冲。与CPU的多级Cache不同,Ethos-U的SRAM是软件显式管理的,开发者(或Vela编译器)需要明确规划哪些数据驻留片上、哪些数据流式搬运。
| 存储层级 | 容量范围 | 访问延迟 | 管理方式 | 典型用途 |
|---|---|---|---|---|
| 外部Flash/DDR | MB ~ GB级 | 数十ns ~ 数百ns | 软件显式管理 | 存储全部权重、输入图像、中间结果 |
| 权重SRAM | U55: 128KB ~ 512KB U65: 512KB ~ 2MB | 2~4周期 | 软件显式管理 | 驻留当前层或相邻层的权重 |
| 激活SRAM | U55: 32KB ~ 128KB U65: 128KB ~ 512KB | 1~2周期 | 硬件自动管理(双缓冲) | 缓存IFM/OFM的tile块 |
| 寄存器/累加器 | KB级 | 1周期 | 硬件控制 | MAC阵列的中间累加结果 |
带宽瓶颈通常出现在外部存储器接口。对于U55,其AHB接口位宽为32位,工作频率通常为100~200MHz,理论峰值带宽约400~800MB/s。U65采用AXI接口,位宽64位,频率可达400MHz以上,理论带宽超过3.2GB/s。然而,实际可用带宽受限于总线仲裁、刷新开销以及访问模式。图像分割模型中的转置卷积(Transposed Convolution)和上采样操作会产生非连续的内存访问模式,导致DMA效率下降。
在内存带宽优化中,最关键的设计原则是最大化数据复用。具体而言:
- 权重复用:将卷积核权重驻留于片上SRAM,避免每处理一个输出像素就重新读取权重。
- 输入激活复用:通过滑动窗口(Sliding Window)机制,相邻输出像素共享输入像素,减少IFM的重复读取。
- 输出激活暂存:在激活SRAM中累积部分和(Partial Sum),减少OFM的频繁写回。
--arena-cache-size参数控制激活SRAM的分配策略。对于图像分割模型,建议将arena cache size设置为激活SRAM总容量的70%~80%,剩余空间留给权重驻留。
3.3 DMA机制与命令队列调度
Ethos-U的DMA引擎是独立于MAC阵列的硬件模块,负责在外部存储器和片上SRAM之间搬运数据。DMA操作由命令描述符触发,每个描述符包含源地址、目的地址、传输长度、突发类型(Burst Type)等字段。DMA引擎支持双缓冲(Double Buffering)机制:当MAC阵列处理当前tile的数据时,DMA同时预取下一个tile的数据,从而隐藏搬运延迟。
命令队列(Command Queue)是NPU与主机CPU之间的异步接口。主机CPU将命令描述符写入内存中的环形缓冲区,然后通过写寄存器(如ETHOSU_CMD_Q_BASE)通知NPU。NPU硬件自动从队列中取出描述符并执行,执行完成后通过中断或状态寄存器通知主机。这种异步模型允许CPU在NPU推理期间执行其他任务(如图像预处理或后处理),提升系统级吞吐量。
对于U65,命令队列支持多级优先级,高优先级命令可以抢占低优先级命令的DMA传输。这在多模型并发或实时性要求高的场景中非常有用。然而,抢占会导致上下文切换开销,频繁抢占反而降低整体效率,因此建议仅在必要时使用。
// 命令描述符结构示例(简化)
typedef struct {
uint32_t cmd_type; // 0: DMA_LOAD, 1: DMA_STORE, 2: CONV, 3: POOL
uint32_t src_addr; // 源地址(外部存储器)
uint32_t dst_addr; // 目的地址(SRAM或外部)
uint32_t length; // 传输字节数
uint32_t ifm_params; // 输入特征图参数(通道数、高度、宽度)
uint32_t weight_addr; // 权重地址
uint32_t ofm_params; // 输出特征图参数
uint32_t flags; // 同步标志、中断使能等
} EthosU_CommandDesc;
在实际工程中,DMA带宽利用率往往受限于突发传输长度。Ethos-U的DMA支持1~16字的突发传输,但突发长度越长,总线利用率越高。对于图像分割模型,建议将tile尺寸设计为16字节对齐,并尽量使用16字突发。此外,避免在DMA传输路径上插入过多的内存屏障(Memory Barrier),否则会引入额外的等待周期。
3.4 与CPU/GPU的架构差异及优化启示
CPU、GPU与NPU在架构设计上存在本质差异,理解这些差异有助于开发者避免将CPU/GPU的优化经验错误地迁移到NPU上。
| 维度 | CPU(Cortex-M/A) | GPU(Mali) | NPU(Ethos-U) |
|---|---|---|---|
| 执行模型 | 指令流(Von Neumann) | SIMT(单指令多线程) | 数据流(命令驱动) |
| 缓存管理 | 硬件Cache(自动) | 硬件Cache + 软件tile | 软件显式SRAM管理 |
| 并行粒度 | ILP(指令级并行) | 线程级并行(数千线程) | MAC阵列级并行(固定规模) |
| 数据精度 | FP32/FP16/INT8 | FP32/FP16/INT8 | INT8/INT16(主要) |
| 内存带宽敏感度 | 中等(Cache缓解) | 高(大量线程竞争) | 极高(无Cache,直接暴露) |
| 典型优化手段 | 循环展开、Cache友好 | 线程块调度、共享内存 | tile规划、权重驻留、DMA重叠 |
CPU的优化核心在于减少指令依赖和提高Cache命中率,而NPU的优化核心在于减少外部内存访问次数和最大化MAC阵列利用率。GPU的优化强调线程级并行和延迟隐藏,但NPU的并行度是硬件固定的,开发者无法通过增加线程来提升性能,只能通过调整数据布局来匹配MAC阵列的访问模式。
对于图像分割模型,一个典型的优化案例是编码器-解码器结构中的特征图复用。以U-Net为例,编码器下采样后的特征图会在解码器中通过跳跃连接与上采样特征图拼接。若采用CPU实现,开发者可能倾向于将特征图保存在Cache中;但在NPU上,由于SRAM容量有限,必须将中间特征图写回外部存储器,并在需要时重新加载。此时,优化策略是:
- 调整tile大小:将特征图按通道维度切分为多个tile,使得每个tile的尺寸与激活SRAM容量匹配。
- 延迟写回:在编码器阶段,尽量将多个卷积层融合后再写回外部存储器,减少中间结果的写回次数。
- 跳跃连接优化:将跳跃连接的拼接操作放在NPU内部完成,避免在CPU侧进行内存拷贝。
memcpy来搬运数据,这会导致数据经过CPU中转,增加额外延迟和功耗。正确做法是使用NPU的DMA引擎直接搬运,或者通过Vela编译器自动生成DMA命令。
3.5 案例拆解:U-Net分割模型在U55上的内存带宽调优
假设我们有一个U-Net图像分割模型,输入为256x256x3的RGB图像,输出为256x256x2的掩码。模型包含4次下采样和4次上采样,每次下采样包含两个3x3卷积,每次上采样包含一个转置卷积和一个3x3卷积。模型总参数量约1.2MB(INT8量化),激活值峰值约2.5MB(在最低分辨率层)。目标平台为Ethos-U55,配置128KB权重SRAM和64KB激活SRAM。
初始现象:直接使用Vela默认配置编译,推理延迟为85ms,其中DMA等待时间占比约45%。分析发现,瓶颈在于上采样阶段的转置卷积产生了大量非连续内存访问,导致DMA突发效率降低至60%左右。
分析过程:通过Vela的--verbose输出和Arm的Streamline Profiler工具,观察到以下数据:
- 转置卷积的IFM读取带宽为1.8GB/s,但实际有效带宽仅1.1GB/s。
- 权重SRAM利用率仅55%,部分卷积层的权重在计算过程中被重复加载。
- 激活SRAM的arena cache命中率为78%,存在部分tile溢出。
优化操作:
- 调整tile切分策略:将转置卷积的输入按4x4的块进行切分,而非默认的2x2,使DMA突发长度从8字提升至16字,有效带宽提升至1.6GB/s。
- 权重重排:将转置卷积的权重按输出通道重排为“通道-高度-宽度”顺序,使权重读取更连续,权重SRAM利用率提升至82%。
- 激活SRAM分配:将
--arena-cache-size从默认的48KB调整为56KB,并设置--weight-estimation-scaled参数,使编码器阶段的中间特征图尽量驻留片上。
结果对比:优化后推理延迟降至52ms,DMA等待时间占比降至28%,整体吞吐量提升约39%。代价是编译时间从3秒增加至7秒(由于更复杂的tile规划),但运行时功耗降低了约15%。
复盘经验:对于包含转置卷积的分割模型,优先检查DMA突发长度是否匹配总线位宽;其次,权重驻留策略应优先考虑参数量大的层(如编码器第一层),而非所有层平均分配;最后,激活SRAM的分配需要结合模型结构动态调整,不能使用固定值。