AI芯片片上SRAM为何总不够?分块调度怎么排?
扫描二维码
随时随地手机看文章
模型规模没变,利用率却总上不去,很多时候不是算力单元太少,而是片上缓存先被撑爆。AI芯片一旦把局部存储和分块调度看得过于理想,乘加阵列就会反复等数据,而不是持续吃满。
片上 SRAM 的麻烦从来不只是容量数字。看起来还有几兆字节可用,并不代表某个卷积块、注意力片段或归一化中间值能顺利放进去,因为真实访问还受 bank 数、端口数、读写时序和对齐约束共同限制。只要某一类张量在同一时刻争同一组 bank,表面上“装得下”的分块也会变成实际上“拿不快”。
分块策略的第一层取舍,是优先复用哪一侧张量。若把输入特征图切得太小,权重能复用,可激活搬运次数会暴涨;若把输出通道切得太碎,部分和回写次数又会上升,累加值还可能被迫落回片外。真正有效的 tile 不是单看单层算子,而是要把前后层的可复用边界一起算进去,避免某一层局部最优把整段流水线拖成全局最差。
很多实现喜欢把块尽量做大,觉得这样最能摊薄外存带宽,但块一大,寄存器和局部缓冲中的活跃值也会一起变多。某些算子在数学上很适合融合,到了硬件上却因为中间值生命周期太长,反而挤掉原本可并行驻留的 tile。此时问题看起来像 SRAM 不够,本质却是活跃张量集合被编译器排得过于拥挤。
对AI芯片而言,双缓冲也不是天然稳赚。预取下一块数据确实能掩盖搬运时延,可前提是当前块的计算时间足够长,且地址生成、DMA 通道和 bank 使用没有与正在执行的算子正面冲突。若当前 tile 太小,算子很快结束,预取还没完成;若两个缓冲区落在同一组物理 bank 上,所谓重叠只会变成更严重的争用。
分块调度还要面对跨算子的边界。卷积后接激活、归一化后接投影、注意力前后接重排,这些步骤若各自独立最优,张量格式转换与回写读回成本就会被反复支付。更稳妥的做法,是让编译器在局部内存预算内优先保住最贵的中间值不落片外,再围绕这个锚点安排 tile 顺序,而不是每层都从零开始重新找最优。
验证这类问题时,单看总带宽利用率不够,还要拆 bank 冲突率、DMA 空转比例、部分和回写次数以及阵列待料周期。只有把这些指标并起来看,才能判断问题是容量上限到了,还是调度把原本可用的容量浪费在了错误位置。
很多性能回退只会出现在少数边界输入上,比如超长序列、非整除通道数或特殊头数配置。若 profiling 只覆盖常规形状,调度器很容易在量产后才暴露局部缓存踩线的问题。若再叠加多头并行或分组卷积,局部 bank 争用还会更早放大,边界案例尤其如此。把最坏形状一并压测,通常比单看平均案例更能守住真实吞吐下限。
所以,片上 SRAM 看似不够,往往不是单纯少了几块存储,而是分块边界没有围着数据复用来画。把局部缓存和调度顺序一起排对,阵列吞吐才会真正抬起来。





