3. 视觉工作负载特征分析
在EyeQ这类面向ADAS/AD的嵌入式视觉SoC上做性能优化,第一步不是调参,而是把工作负载“看透”。EyeQ的算力结构具有明显的异构特征:CPU负责调度与后处理,向量DSP(如EyeQ4的VMP、EyeQ5的VPU)承担卷积与像素级运算,专用加速器(如PM、SMP、深度/光流引擎)处理特定算子,而片上SRAM带宽与DDR带宽往往比峰值算力更早成为瓶颈。因此,同一颗芯片上跑检测、分割、跟踪、深度估计四类任务,其瓶颈位置、并行维度和优化手段完全不同。本节从计算模式、内存访问特征、并行性三个维度逐一拆解,并给出可落地的分析方法和示例参数。
一、四类任务的计算模式差异
检测(Detection)以CNN主干加检测头为主,典型如YOLO/SSD类结构。其计算量集中在3×3卷积,属于高算术强度(Arithmetic Intensity, AI)算子:每读取一个输入像素会被复用多次。以一层64通道、3×3、输出64通道、特征图128×128为例,乘加次数约为64×64×3×3×128×128≈6.0×10⁸ MAC,而输入输出数据量仅约(64+64)×128×128×1B≈2.1MB,AI可达数百MAC/Byte。这类任务对算力敏感,对带宽相对友好,适合向量DSP或矩阵加速器批量执行。
分割(Segmentation)分为语义分割与实例分割。语义分割(如可行驶区域、车道线)常采用编码器-解码器结构,解码阶段包含大量上采样、逐元素相加和逐像素分类。其特点是分辨率高、通道数低,逐像素操作占比大,AI显著低于卷积层,容易退化为“带宽受限”。实例分割还叠加ROI Align等不规则采样,访存局部性差。
跟踪(Tracking)通常不是纯神经网络任务,而是“检测+关联+滤波”的混合负载。以卡尔曼滤波跟踪为例,每帧对每个目标做状态预测与更新,矩阵规模小(如4×4或6×6),但目标数量多、调用频繁,属于控制流密集、分支多、单次计算量小的负载。若采用匈牙利算法做数据关联,还会出现O(n³)的匹配开销,n为目标数。
深度估计(Depth Estimation)若基于双目立体匹配,核心是代价体构建与代价聚合,涉及大量滑动窗口和视差搜索;若基于单目CNN,则接近密集回归任务。双目方案中,代价体维度为W×H×D(D为视差范围),访存量随D线性增长,是典型的带宽吞噬型负载。
二、内存访问特征:带宽与局部性
EyeQ的片上SRAM容量有限(EyeQ4约2.5MB,EyeQ5约数MB级),无法容纳整张特征图,因此必须做分块(tiling)。检测网络的特征图在分块后,块间存在halo重叠,重叠区域会被重复读取。以3×3卷积、块大小32×32为例,halo为1像素,额外读取比例约为(34²-32²)/32²≈12.9%。若块太小,halo开销急剧上升;块太大,则SRAM放不下。这是检测任务调优的核心矛盾。
分割任务的访存模式更“散”。上采样常采用最近邻或双线性插值,双线性需要读取4个邻域点,且输出分辨率高,导致读放大。逐像素分类层输出通道数等于类别数,若类别为10、分辨率为1024×512,输出张量约5MB,远超片上容量,必须写回DDR,带宽压力显著。
跟踪任务的访存量小但随机性高。目标状态向量、协方差矩阵、观测矩阵分散存储,且目标数量动态变化,缓存命中率低。若每帧处理50个目标,每个目标做一次6×6矩阵求逆与两次矩阵乘法,计算量约50×(6³+2×6²)≈1.4×10⁴ FLOP,几乎可忽略,但分支预测失败和缓存缺失可能让CPU耗时达到微秒级。
深度估计的代价体是访存大户。以1280×720分辨率、64个视差层、每层1字节计算,代价体约59MB,必须分块并复用。视差搜索时,同一像素在不同视差下反复读取右图对应行,若不做行缓存,DDR读取量会放大64倍。
三、并行性分析:能并行什么,不能并行什么
检测网络的并行性最好:通道维可完全并行,空间维在分块边界外可并行,适合映射到向量DSP的SIMD通道或矩阵加速器的MAC阵列。优化重点是提高向量化率,例如把通道数对齐到向量宽度(如EyeQ4 VMP的16通道),避免尾部标量处理。
分割网络的并行性受限于逐像素依赖。上采样与逐元素相加存在数据依赖,但不同输出像素之间独立,可按行或按块并行。瓶颈在于带宽,因此优化方向是算子融合:把“卷积+BN+ReLU+上采样”融合为一个kernel,减少中间张量写回。
跟踪任务的并行性在目标级。不同目标的卡尔曼预测与更新相互独立,可用CPU多线程或任务队列并行。但数据关联(如匈牙利算法)存在全局依赖,难以直接并行,通常采用贪心近似或分簇处理来降低复杂度。
深度估计的并行性在视差维和空间维。代价体构建时,每个视差层可独立计算;代价聚合时,沿视差方向做SGM(半全局匹配)存在路径依赖,但4个或8个扫描方向之间可并行。优化重点是行缓存复用与视差范围裁剪。
四、可落地的分析清单
在实际项目中,建议按以下清单逐项采集数据,形成工作负载画像。以下参数为教学示例,实际值需以目标芯片手册和实测为准。
| 任务 | 典型算子 | AI估算(示例) | 主要瓶颈 | 并行维度 | 优化抓手 |
|---|---|---|---|---|---|
| 检测 | 3×3 Conv, 1×1 Conv | 200~800 MAC/B | 算力/向量利用率 | 通道、空间块 | 通道对齐、分块调优 |
| 分割 | 上采样、逐元素加、逐像素分类 | 5~30 MAC/B | DDR带宽 | 行/块、类别 | 算子融合、降低输出精度 |
| 跟踪 | KF预测/更新、数据关联 | <5 MAC/B | 控制流/缓存 | 目标级 | 批量矩阵、贪心关联 |
| 深度估计 | 代价体、SGM聚合 | 10~50 MAC/B | 带宽/行缓存 | 视差、扫描方向 | 视差裁剪、行复用 |
综合来看,四类任务在EyeQ上的优化策略可以概括为:检测“压算力、提向量”,分割“降带宽、做融合”,跟踪“减分支、批处理”,深度估计“裁视差、复行缓存”。只有先完成工作负载特征分析,后续的算子映射、内存布局和调度策略才有依据,否则容易在错误的瓶颈上投入优化资源。