通道尾块与流水填充决定NPU阵列利用率
相同的理论运算量,不一定对应相同的运行时间。对于使用固定规模乘加阵列的NPU,通道尾块中的无效位置,以及短任务反复支付的流水填充时间,都可能让峰值算力难以兑现。
先看通道维度的整除关系。假设一个理想化内核每轮并行计算十六个输出通道,模型需要二十四个通道,且实现无法把其他任务装入余下位置,那么两轮共提供三十二个位置,真正有效的只有二十四个。由这一维得到的利用比例为四分之三。这个例子只描述通道尾块,尚未计入访存和流水开销,也不代表所有硬件都按十六路工作;具体粒度必须从目标后端的内核约束获得。
尾块是否产生真实代价,还取决于实现如何处理不足整块的部分。某些内核仍发出完整矩阵指令,只屏蔽无效输出;另一些具备较小指令形状,或能在通道之间重新分配计算。填充到对齐维度可能方便向量读写,却不会凭空增加有效结果。因此应同时报告原始模型所需运算和硬件实际执行的运算,避免用补零后的总量计算吞吐率,使较低的有效利用率看起来接近峰值。
如果允许修改网络结构,可以在精度验证后比较相邻的对齐通道配置。减少少量通道有时能去掉整个尾块,增加少量通道也可能不增加计算轮次,但两者都可能改变特征表达和后续层形状,不能只按本层收益决策。对于已经固定的模型,应优先尝试后端支持的分组映射或小形状内核;分组卷积还需核对每组内部通道粒度,整层总通道能够整除,并不意味着每个组都能填满阵列。测试还应排除自动选择了另一套内核的情况。改变通道数后若运行路径同时变化,耗时跳变就不能全部归因于尾块,必须结合实际执行指令和内核选择记录重新解释。
尾块处理完毕后,脉动阵列仍可能在短归约上表现不佳。数据沿处理单元逐级传播,边缘单元开始工作后,远端单元尚在等待输入;最后一批数据送入后,部分结果也需要继续传播才能完成。在简化的矩形阵列模型中,传播开销与阵列两个方向的长度相关,不能把整个执行区间都当成满载乘加。归约长度较短、任务无法连续衔接时,这些固定阶段占比尤其明显。
因此,NPU的短矩阵任务即使没有通道尾块,也可能达不到长矩阵的吞吐率。诊断时可固定输出矩阵形状,改变归约维度并观察周期增长:若短归约阶段的每次有效运算成本明显更高,而较长归约趋于稳定,就应检查填充排空和任务切换的贡献。真实实现可能有多级流水、片上广播或多阵列协作,不能直接用某条简化周期公式替代实测,只能用其解释趋势并指导采样。
缓解这一问题需要让阵列获得更长的连续工作区间。对彼此独立且内核允许拼接的任务,可尝试合并映射,减少反复启动;但跨请求批处理会增加等待,具有严格时限的单帧处理未必适合。另一个选择是使用更小的阵列分区,缩短传播距离,代价则可能是减少同一任务的并行资源。比较时应把任务到达约束固定,并同时检查完成时延,不能单凭连续压测时的忙碌比例作结论。
判断阵列是否匹配模型,应分别核对维度能否填满和任务能否持续供给。前者解释稳定执行中的空位,后者解释启动与结束的损失;只有二者都受控,峰值吞吐才有参考价值。





