3、存储层次全景:理解Flash、SRAM、TCM、Cache、外部RAM的层级关系、访问速度差异及在推理中的角色

在ARM Cortex-M7的推理优化中,存储层次是决定系统性能的底层物理约束。与PC或服务器不同,MCU的存储资源极其有限,且各级存储的访问延迟差异可达两个数量级。若不能清晰理解Flash、SRAM、TCM、Cache和外部RAM的层级关系,任何算子优化、算子融合或量化策略都如同在流沙上盖楼——算法层面的加速比会被存储瓶颈无情吞噬。本章将系统拆解Cortex-M7的存储金字塔,明确每一级存储的物理特性、访问代价以及在神经网络推理中的具体角色,并给出基于存储感知的工程决策方法。

Cortex-M7 存储层次与推理角色 TCM (ITCM/DTCM) 紧耦合内存 · 零等待 · 单周期访问 角色:权重/激活/中间缓冲区 I-Cache / D-Cache 硬件自动管理 · 命中约2-3周期 角色:缓存Flash指令与SRAM数据 内部SRAM (AHB SRAM) 主存储器 · 约2-4周期(含总线仲裁) 角色:主数据区、权重驻留、堆栈 内部Flash (代码/只读数据) 非易失 · 约20-30周期(带Cache加速) 角色:模型权重持久化、代码存储 外部RAM (SDRAM/PSRAM/Quad-SPI PSRAM) 通过外部总线 · 数十周期延迟 · 带宽受限 关键参数 TCM: 0等待 Cache: 2-3周期 SRAM: 2-4周期 Flash: 20-30周期 外部RAM: 30-100周期 容量参考 TCM: 16KB-256KB SRAM: 256KB-1MB Flash: 1MB-4MB 外部RAM: 8MB-64MB 推理瓶颈 Flash→权重加载 外部RAM→大模型 Cache Miss→惩罚 TCM不足→溢出

上图展示了Cortex-M7存储层次的完整金字塔结构。从顶部的TCM到底部的外部RAM,访问延迟逐级递增,容量逐级增大。在推理场景中,这种层级关系直接决定了数据放置策略:权重可以放在Flash(容量大但慢),也可以加载到SRAM(快但容量小),而最热的数据应放入TCM(最快但极小)。理解每一级的角色和代价,是进行存储规划的前提。

3.1 核心原理:存储层级与访问代价模型

Cortex-M7的存储系统设计遵循"局部性原理"——程序倾向于访问最近访问过的数据(时间局部性)和相邻地址的数据(空间局部性)。基于此,芯片设计了多级存储结构,每一级都是上一级的"缓存"或"后备"。

  • TCM(Tightly Coupled Memory):与CPU内核直接相连,不经过总线仲裁,指令访问ITCM、数据访问DTCM均为单周期。TCM本质上是CPU的"私有内存",地址空间固定,不受Cache策略影响。在推理中,TCM适合存放最频繁访问的权重切片、中间激活值或关键查找表。
  • Cache(I-Cache/D-Cache):硬件自动管理的缓存,对程序员透明。I-Cache缓存Flash中的指令,D-Cache缓存SRAM或外部RAM中的数据。Cache命中时延迟约2-3周期,但未命中时需从下一级加载,惩罚可达20-100周期。在推理中,Cache的行为直接影响卷积循环的指令吞吐和数据复用效率。
  • 内部SRAM(AHB SRAM):通过AHB总线访问的主存储器,典型延迟2-4周期(含仲裁)。SRAM容量通常为256KB-1MB,是推理中权重和激活的主要驻留地。由于SRAM与Flash、外部RAM共享总线带宽,多主设备访问时会产生竞争。
  • 内部Flash:非易失存储,存放代码和只读数据(如量化后的模型权重)。Flash的原始访问延迟高达20-30周期,但通过I-Cache和D-Cache的加速,顺序执行时可接近SRAM速度。然而,随机访问或Cache未命中时,Flash会成为严重瓶颈。
  • 外部RAM(SDRAM/PSRAM/Quad-SPI PSRAM):通过外部总线接口连接,延迟通常在30-100周期,带宽受限于总线宽度和时钟频率。外部RAM容量可达数十MB,适合存放超过内部SRAM容量的大模型,但每次访问都需付出高昂的延迟代价。

推理中的角色映射:在典型的CNN推理中,权重数据量往往超过内部SRAM容量(例如MobileNetV1的1.0版本权重约4.2MB)。此时必须将权重存储在Flash或外部RAM中,按需加载到SRAM/TCM参与计算。激活值(中间特征图)则优先放在SRAM,若SRAM不足则溢出到外部RAM。理解这一映射关系,是后续所有优化(如权重重排、激活压缩、双缓冲)的基础。

3.2 判断方法:如何评估存储瓶颈与数据放置策略

在实际项目中,工程师需要回答三个关键问题:当前推理的瓶颈在哪一级存储?数据应该放在哪里?如何验证放置策略的有效性?以下给出系统化的判断流程。

  1. 测量各级存储的实际访问时间:使用Cortex-M7的DWT(Data Watchpoint and Trace)单元中的CYCCNT寄存器,精确测量不同存储区域的读写延迟。编写微基准测试,分别对TCM、SRAM、Flash(带Cache)、外部RAM进行连续读写和随机访问测试,记录周期数。
  2. 分析推理过程中的数据流:统计模型各层的权重大小、激活大小、计算量(MACs)。计算理论所需带宽:带宽需求 = 权重读取量 + 激活读写量 / 推理时间。若带宽需求超过存储系统的实际带宽,则存在瓶颈。
  3. 使用Cache命中率监控:利用PMU(Performance Monitoring Unit)中的Cache事件计数器,监控D-Cache的命中率、未命中率、行填充次数。若D-Cache命中率低于90%,说明数据局部性差,需要调整数据布局或使用TCM。
  4. 进行存储映射实验:将同一模型分别全部放在SRAM、部分放在Flash、部分放在外部RAM,对比推理时间。通过二分法找到性能拐点,确定最优的数据放置组合。
存储层级 访问延迟(周期) 典型容量 推理中的典型用途 优化手段
TCM 1 16-256KB 最热权重、激活缓冲区、关键查找表 手动数据放置、链接脚本配置
Cache 2-3(命中) 16-64KB 自动缓存Flash指令和SRAM数据 数据对齐、循环分块、预取
内部SRAM 2-4 256KB-1MB 权重驻留、激活主存储、堆栈 内存池管理、双缓冲
内部Flash 20-30 1-4MB 代码、量化权重、常量表 I-Cache预取、D-Cache行填充
外部RAM 30-100 8-64MB 大模型权重、溢出激活 DMA传输、块读取、压缩

3.3 案例拆解:基于STM32H743的MobileNetV2推理存储优化

以STM32H743为例(Cortex-M7 @480MHz,内部SRAM 512KB,TCM 128KB,Flash 2MB,外部SDRAM 32MB),部署MobileNetV2(输入224x224,权重约3.4MB,激活峰值约1.2MB)。初始状态下,所有权重放在Flash,激活放在SRAM,推理时间为850ms。

初始现象与瓶颈分析:通过PMU监控发现,D-Cache命中率仅为72%,Flash读取等待周期占总执行周期的41%。进一步分析发现,卷积层权重按通道顺序存储,但计算时按输出通道访问,导致Cache行利用率低,频繁未命中。

优化步骤:

  1. 权重重排:将权重按"输出通道-输入通道-KH-KW"重排为"KH-KW-输入通道-输出通道"的NHWC布局,使连续访问的权重在内存中相邻。重排后D-Cache命中率提升至89%。
  2. TCM放置关键层:将模型的前两层(特征提取关键层)和最后一层(分类层)的权重(共约48KB)放入DTCM,消除这些层的Flash访问延迟。同时将中间激活缓冲区(约32KB)放入DTCM,减少SRAM总线竞争。
  3. 外部RAM承载大权重:将模型中间层的大权重(约2.8MB)通过DMA预加载到外部SDRAM,并采用双缓冲机制——当前层计算时,DMA预取下一层权重。SDRAM访问延迟虽高,但DMA的批量传输掩盖了延迟。
  4. Flash只读数据优化:将BatchNorm参数、量化缩放因子等小数据表放入Flash,并确保它们按Cache行对齐(32字节),减少行填充次数。

结果对比:优化后推理时间降至420ms,性能提升约2倍。其中权重重排贡献35%的加速,TCM放置贡献25%,DMA双缓冲贡献30%,Flash对齐贡献10%。

风险与代价:权重重排增加了模型转换的预处理时间(约2秒,可离线完成);TCM容量有限,放置过多会导致链接失败;外部RAM的DMA传输占用总线带宽,可能影响其他外设。此外,SDRAM的刷新周期会引入额外的延迟抖动,在实时性要求高的场景需谨慎使用。

复盘经验:存储优化不是简单的"把数据放快的地方",而是需要结合访问模式、数据生命周期、总线竞争等多维度因素。本案例中,权重重排的收益最大,因为它从根源上改善了Cache的局部性;而TCM的收益受限于容量,只能作为"点睛之笔"。

3.4 常见误区与总结复盘

在存储层次的理解和应用中,工程师常陷入以下误区:

  • 误区一:所有数据都放TCM。TCM容量极小(通常不超过256KB),且与Cache不协同工作。将大量数据放入TCM会导致链接失败或严重浪费。正确做法是仅将访问频率最高的数据放入TCM。
  • 误区二:忽视Cache的自动行为。有些工程师认为Cache是"透明的",无需干预。实际上,Cache的命中率高度依赖数据布局和访问顺序。通过简单的循环交换或数据对齐,往往能获得30%以上的性能提升。
  • 误区三:外部RAM一定慢。虽然外部RAM单次访问延迟高,但通过DMA批量传输、突发读取和双缓冲,可以有效掩盖延迟。在某些场景下,外部RAM+ DMA的组合甚至优于内部Flash的随机访问。
  • 误区四:只关注存储速度,忽略总线带宽。Cortex-M7的总线矩阵存在多个主设备(CPU、DMA、以太网等)竞争。即使数据放在SRAM,若DMA频繁占用总线,CPU访问SRAM的延迟也会增加。需要合理分配DMA优先级和传输时机。

总结复盘:存储层次优化的核心是"数据放置"与"访问模式"的匹配。建议遵循以下原则:1)先测量,后优化——用CYCCNT和PMU量化瓶颈;2)优先改善Cache局部性,这是性价比最高的手段;3)TCM用于"小而热"的数据,外部RAM用于"大而冷"的数据;4)善用DMA和双缓冲,将延迟转化为吞吐;5)每次优化后重新测量,因为存储瓶颈可能转移。