当前位置:首页 > 物联网 > 智能应用
[导读]很多芯片标称 TOPS 很高,实测却总在复杂模型上跑不满。NPU遇到这种落差时,先要看的往往不是乘加阵列,而是片上 SRAM 装不装得下合理分块,以及片外读写是否踩在对齐边界上。

很多芯片标称 TOPS 很高,实测却总在复杂模型上跑不满。NPU遇到这种落差时,先要看的往往不是乘加阵列,而是片上 SRAM 装不装得下合理分块,以及片外读写是否踩在对齐边界上。

片上缓冲决定了算子能否以连续节拍推进。卷积输入块、权重块和部分和若能同时留在本地,阵列就能边算边写;一旦某一类块放不下,就得把中间结果提前刷回主存,再在下一轮重新读回。这样乘加单元虽然没闲着,时间却被搬运切成了碎片。现场常见的“理论算力够、单帧还是慢”,本质上就是分块尺度没和片上容量对上。

分块过细会带来另一种浪费。通道数若不是阵列向量宽度的整数倍,最后一块常常只装了半仓数据,计算资源却仍按整块占用。为了凑齐尾块,有些编译器会额外插入 padding 和格式转换,进一步挤占 SRAM。此时算得慢并不意味着阵列弱,而是任务形状和硬件粒度错配,导致每一轮都在拿不满的瓢舀水。

DDR 突发对齐会把这种错配继续放大。片外内存最怕零碎访问,若分块边界让读写长度总是跨页或跨突发,控制器要多做地址翻转、仲裁和预充电。单次损失看起来不大,但层数一多就会变成稳定的带宽税。某些网络在实验室里只测平均带宽,看不出问题,到了多模型并发现场才暴露,因为此时任何一段不对齐访问都会把共享总线拖慢。

更好的做法,是让分块先服务于本地复用,再兼顾阵列并行度。输入块应尽量覆盖能复用的行缓冲窗口,权重块要避免被反复回读,部分和最好在片上完成足够多的累积后再落盘。如果为了追求单层最大并行度,把块做得只适合当前层却不适合前后层,跨层融合收益反而会丢掉。真正有效的分块,是看整条数据流而不是只看单个算子。

双缓冲也不是天然生效。理论上,一边计算一边预取可以隐藏搬运延迟,但前提是下一块数据大小稳定、地址连续且带宽留有余量。若块尺寸频繁变化,预取就会和当前计算争总线;若后台还有相机采集和日志写盘,双缓冲甚至会让拥塞更早出现。隐藏延迟的前提,是节拍被设计成规则流,而不是把所有不确定性都压给存储系统。

编译搜索还应把 bank 冲突算进去,因为某些块形状虽然在容量上放得下,却会让读写都落在同一片本地存储银行,结果阵列仍然在等数据错峰。

如果同一模型还混入大核和小核两类算子,分块策略最好分别建模,否则为大核挑的块形状,往往会让小核阶段出现新的尾块浪费。

排查时,不能只看总体 DDR 利用率,还应观察片上命中率、块尾浪费比例、每层外部读写次数和突发长度分布。若利用率不高却仍然慢,往往是访问不连续而不是纯粹带宽不够。把这些指标和层级时间线结合起来,才能分清是分块尺度有问题,还是对齐规则没被满足。

所以,存储层次才是许多加速器性能的第一道门槛。先把分块和对齐这两笔账算清,再谈峰值算力,NPU的标称能力才有机会落到真实吞吐上。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭