2. Snapdragon硬件架构解析

在骁龙平台上做视觉AI,最容易踩的坑是“把模型丢给CPU跑”。CPU通用性强,但每帧推理都靠它,功耗和延迟会迅速失控。真正决定端侧视觉AI能否稳定实时运行的,是四类异构单元的合理分工:Spectra ISP负责把光信号变成干净图像,Hexagon DSP承担定点张量计算,Adreno GPU处理浮点并行与图像后处理,Kryo CPU做调度、控制流和轻量算子。理解它们的协同机制,才能写出真正高效的部署方案。

四类单元的能力边界

先明确各单元“擅长什么、不擅长什么”,这是分工的前提。

  • Spectra ISP:流水线式图像信号处理,包含Bayer去马赛克、黑电平校正、镜头阴影校正、自动白平衡、自动曝光、降噪、色调映射等。它以极低功耗完成高吞吐像素处理,输出YUV或RGB。它不做神经网络推理,但决定了送入模型的图像质量。
  • Hexagon DSP:含标量、向量(HVX)和张量(HMX)扩展,擅长INT8/INT16定点卷积、矩阵乘、激活函数。典型视觉模型(MobileNet、YOLO-Nano、DeepLab)量化后主要跑在这里,能效比最高。
  • Adreno GPU:大规模SIMD浮点并行,适合FP16/FP32算子、自定义层、图像几何变换、光流、后处理(NMS、绘制)。对不规则访存和分支较敏感,功耗高于DSP。
  • Kryo CPU:通用控制,负责相机管线配置、内存管理、任务编排、前后处理中的小算子、以及DSP/GPU无法覆盖的算子回退。

一个常见的误解是“DSP最快,全部放DSP”。实际上,若模型含大量动态shape、非量化算子或复杂控制流,DSP反而会因回退到CPU而变慢。分工的核心依据是算子类型 + 数据精度 + 访存模式。

协同机制:从光子到推理结果

下面这张图展示了单帧视觉AI任务的完整信号链与单元分工。注意数据流方向:ISP → 内存 → DSP/GPU → CPU汇总,各单元通过共享内存和同步栅栏协作,而非串行等待。

单帧视觉AI任务的异构协同信号链 CMOS Sensor Bayer RAW 10/12bit Spectra ISP 去马赛克 / 降噪 / AWB 色调映射 / 缩放 输出 NV12 / RGB 共享内存 / ION 零拷贝缓冲区 Hexagon DSP HVX + HMX INT8 卷积 / 矩阵乘 激活 / 池化 Adreno GPU FP16 算子 / 自定义层 NMS / 绘制 / 光流 几何变换 Kryo CPU 任务编排 / 同步 控制流 / 小算子 结果汇总输出 推理结果 后处理 输出 检测框 / 类别 分割掩码 关键协同点 ① ISP 输出直接写入共享内存,DSP/GPU 零拷贝读取,避免 CPU 搬运。 ② DSP 完成主干推理后,通过 fastrpc 将张量句柄传给 CPU,GPU 并行做 NMS 与绘制。 ③ CPU 用栅栏(fence)同步各单元,确保下一帧 ISP 写入前上一帧已被消费。

分工决策:什么算子放哪里

实际部署时,可以用下面的判断逻辑快速分配算子。假设我们部署一个量化后的YOLO-Nano,输入416×416 NV12:

算子/阶段推荐单元理由
Bayer→NV12、缩放Spectra ISP硬件流水线,功耗最低
Conv 3×3 INT8Hexagon DSP (HMX)张量加速器原生支持
Depthwise Conv INT8Hexagon DSP (HVX)向量单元高效
SiLU / LeakyReLUHexagon DSP可融合进卷积
Resize / ConcatAdreno GPU访存不规则,GPU更灵活
NMSAdreno GPU 或 CPU分支多,GPU并行排序
绘制检测框Adreno GPU图形管线原生
相机控制、任务调度Kryo CPU控制流

注意:上表是典型分配,不是绝对。若模型未量化(FP32),DSP的HMX无法发挥,此时GPU可能更合适;若模型含大量动态shape,CPU回退不可避免,应尽量把回退算子集中到少数层,减少跨单元同步开销。

一个可复现的协同配置示例

以高通SNPE(Snapdragon Neural Processing Engine)为例,部署时通过运行时选择目标单元。下面是一个DSP优先、GPU后处理的配置片段:

# 1. 模型量化并编译为DLC
snpe-dlc-quantize --input_dlc yolov8n.onnx.dlc \
  --input_list calibration_list.txt \
  --output_dlc yolov8n_quant.dlc

# 2. 指定DSP运行,启用HVX+HMX
snpe-net-run --container yolov8n_quant.dlc \
  --input_list input_list.txt \
  --use_dsp --dsp_graph_name yolov8n \
  --perf_profile burst

# 3. 后处理在GPU侧通过OpenCL完成NMS
#    张量句柄经fastrpc从DSP传到CPU,再交给GPU

运行后重点观察三个指标:DSP利用率(应接近饱和但不持续100%)、每帧端到端延迟(含ISP、推理、后处理)、CPU占用率(应低于30%,否则说明回退过多)。若CPU占用偏高,用SNPE的layer-wise profiling定位回退层,再决定是否改写算子或换精度。

实用判断:当DSP推理时间占端到端延迟的60%以上、CPU占用低于25%、GPU仅用于后处理时,说明分工基本合理。若ISP输出到推理之间出现明显等待,检查共享内存缓冲区数量是否足够(建议至少3个:ISP写、DSP读、GPU后处理各一)。

协同中的常见陷阱

第一,精度不匹配导致回退。DSP的HMX只吃INT8/INT16,若模型中混有FP32算子,SNPE会将该层回退到CPU,跨单元同步一次约增加0.5~2ms。第二,缓冲区不足导致ISP阻塞。ISP是硬实时流水线,若下游消费不及时,它会丢帧或降帧率。第三,GPU与DSP争抢带宽。两者都访问共享内存,若同时大量读写,LPDDR带宽会成为瓶颈,表现为两者利用率都不高但延迟上升。此时应错峰:DSP推理当前帧时,GPU处理上一帧的后处理。

理解这四类单元的分工与协同,本质上是理解“数据在哪里、计算在哪里、同步在哪里”。把这三件事在部署前想清楚,端侧视觉AI的实时性和功耗就有了基本保障。