3. 算法选型与可行性分析

好,咱们进入第三个关键环节。需求明确了,系统方案也定了,接下来就是挑算法、算资源、写报告。这一步做不好,后面开发到一半发现算力不够、内存爆了,那可就尴尬了。我见过太多项目死在这上面。

3.1 常见SOC算法:三类典型代表

SOC里跑的算法,说白了就三大类:信号处理、控制、AI推理。咱们一个一个说。

3.1.1 信号处理类算法

这类算法最老牌,也最成熟。比如FFT、FIR/IIR滤波器、CORDIC、卡尔曼滤波。它们的特点是:计算模式固定,数据流清晰,非常适合硬件加速。

我个人的习惯是:只要能用信号处理解决的问题,绝不用AI。为什么?因为信号处理算法的功耗和延迟是确定的,好算。AI那玩意儿,你想想看,模型大小、推理时间,都得靠实测才能摸清。

典型例子:麦克风阵列的波束成形。用延时求和(Delay-and-Sum)算法,复杂度O(N),硬件实现简单。但如果你非要用深度学习来做,那功耗至少翻3倍。

3.1.2 控制类算法

PID、MPC(模型预测控制)、LQR这些。控制算法对实时性要求极高,通常跑在RTOS或者裸机上。我在项目中遇到过一个问题:PID的积分项饱和,导致系统震荡。后来加了抗饱和(Anti-Windup)机制才解决。

控制算法的选型,核心看两点:

  • 响应速度:控制周期是1ms还是10ms?决定了你用简单PID还是复杂MPC。
  • 模型精度:系统模型准不准?不准的话,MPC效果还不如调好的PID。

避坑指南:我曾经在一个电机控制项目里,为了追求“先进”选了MPC,结果模型参数标定花了两个月,最后发现PID加个前馈就能满足指标。嗯,有时候简单就是美。

3.1.3 AI推理算法

这几年最火的。CNN、RNN、Transformer,还有各种轻量级网络(MobileNet、TinyML)。AI算法在SOC上的落地,核心挑战是:怎么把大模型塞进小芯片

我建议你记住一个原则:能量化就量化,能剪枝就剪枝,能蒸馏就蒸馏。INT8量化能把模型体积压缩4倍,推理速度提升2-3倍,精度损失通常不到1%。

3.2 算法复杂度分析:别光看大O

教科书上教我们看大O复杂度,但实际工程中,常数项往往比大O更致命。举个例子:

// 算法A:O(n),但每次循环有3次乘法和2次访存
for (i = 0; i < n; i++) {
    y[i] = a * x[i] + b * y[i-1];  // 3 mul + 2 load + 1 store
}

// 算法B:O(n²),但每次循环只有1次加法
for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++) {
        sum += x[i][j];  // 1 add + 1 load
    }
}

当n很小的时候(比如n=10),算法B可能比算法A还快。为什么?因为算法A的访存开销太大了。我在项目中遇到过类似情况,当时用O(n²)的算法反而比O(n)的快,就是因为常数项和缓存命中率的差异。

所以,做复杂度分析时,我建议你关注三个维度:

  • 计算复杂度:乘加次数、除法次数(除法很贵!)
  • 访存复杂度:数据量、访问模式(连续还是随机?)
  • 控制复杂度:分支预测、循环开销

3.3 资源评估:算力、内存、功耗

这是选型的硬约束。咱们一个一个拆。

3.3.1 算力评估

算力通常用GOPS(每秒十亿次操作)或GMACs(每秒十亿次乘加)来衡量。怎么估算?

举个例子:一个1D FIR滤波器,阶数为M,采样率为Fs。每秒需要的乘加次数 = M × Fs。如果M=128,Fs=48kHz,那么算力需求 = 128 × 48000 = 6.144 MMACs ≈ 0.006 GMACs。嗯,这点算力对现代SOC来说,毛毛雨。

但如果是AI推理呢?以MobileNetV2为例,一次推理大约需要3亿次乘加(300 MMACs)。如果要求30fps,那算力需求就是 300M × 30 = 9 GMACs。这就不是毛毛雨了,得用NPU或者DSP才能扛住。

注意:算力不是线性叠加的。多核并行时,要考虑通信开销和负载均衡。我曾经在一个项目里,4核DSP的理论算力是100 GOPS,实际跑出来只有60 GOPS,就是因为数据搬运占了40%的时间。

3.3.2 内存评估

内存分两块:程序存储数据存储

算法类型 程序存储(Flash) 数据存储(SRAM/DRAM) 典型值
信号处理(FFT) 2-10 KB N × 4 bytes(复数) N=1024时,约8KB
控制(PID) 1-5 KB 几十个变量 通常 < 1KB
AI推理(TinyML) 模型权重:100KB-2MB 中间特征图:50KB-1MB 总内存约 200KB-3MB
AI推理(大模型) 模型权重:10MB-100MB+ 中间特征图:5MB-50MB 需要外部DRAM

我建议你留出30%的内存余量。为什么?因为调试阶段会加各种log、中间变量,还有中断栈、RTOS任务栈。我曾经因为内存算得太紧,导致系统在极端情况下栈溢出,查了三天才找到原因。

3.3.3 功耗评估

功耗是SOC设计的命门。算法选型对功耗的影响,比你想象的大得多。

一个简单的估算方法:

  • 每MIPS(百万条指令)大约消耗 0.5-2 mW(取决于工艺和电压)
  • 每MMACs大约消耗 0.1-0.5 mW(硬件加速器)
  • 每MB的SRAM访问,大约消耗 10-50 mW

举个例子:一个语音唤醒算法,如果用DSP跑MFCC+GMM,功耗大约 5-10 mW。如果用CNN做端到端唤醒,功耗可能飙到 30-50 mW。但唤醒率可能从95%提升到98%。这3%的唤醒率提升,值不值那5倍的功耗?这就是选型时要权衡的。

我的经验:功耗评估一定要做最坏情况分析。比如AI推理,平时功耗可能只有20mW,但如果连续跑大模型,温度升高,漏电流增加,功耗可能翻倍。嗯,散热设计也得跟上。

3.4 技术选型报告:怎么写才专业?

报告是给老板和客户看的,也是给自己留底的。我写技术选型报告,通常包含以下5个部分:

  1. 需求回顾:一句话说清楚要解决什么问题
  2. 候选算法列表:至少2-3个方案,不能只有一个
  3. 评估矩阵:用表格对比各方案的性能、资源、功耗、开发难度
  4. 推荐方案:明确说选哪个,为什么
  5. 风险与缓解措施:比如“如果模型量化后精度下降,回退方案是...”

评估矩阵示例:

指标 方案A:传统信号处理 方案B:轻量AI 方案C:全量AI
准确率 92% 96% 98%
算力需求 10 MMACs 50 MMACs 500 MMACs
内存需求 16 KB 128 KB 2 MB
功耗 3 mW 15 mW 80 mW
开发周期 2周 6周 12周
推荐

你看,方案B虽然准确率不是最高,但它在算力、内存、功耗和开发周期上取得了平衡。这就是选型的艺术——不是选最好的,而是选最合适的

最后说一句:技术选型报告写完后,一定要做一次可行性验证。拿实际数据跑一遍,看看资源占用是不是和估算的一致。我见过太多报告写得天花乱坠,一跑就露馅的。嗯,纸上得来终觉浅,绝知此事要躬行。