异构计算,说白了就是让CPU、GPU、NPU这三个家伙一起干活。我刚开始接触高通平台时,总觉得把任务扔给NPU就完事了。结果呢?性能反而更差了。后来才明白——任务怎么分、数据怎么传、同步怎么搞,这三件事没想清楚,再强的NPU也白搭。
13.1 任务划分策略:谁该干什么活
我个人习惯把任务划分分成三个层次来思考。先看一个我常用的划分原则:
| 处理器 | 擅长领域 | 不擅长领域 |
|---|---|---|
| CPU | 控制逻辑、分支预测、小批量数据处理 | 大规模并行计算、矩阵运算 |
| GPU | 图像渲染、并行浮点运算、张量操作 | 强依赖分支、递归算法 |
| NPU | 定点量化推理、卷积、全连接层 | 动态形状、非结构化数据 |
嗯,这里要注意:NPU最怕动态形状。我在项目中遇到过,一个模型输入尺寸不固定,NPU每次都要重新编译,那延迟直接翻倍。后来我强制把输入padding到固定尺寸,问题就解决了。
13.2 任务划分的具体策略
我总结了三种常见的划分模式,你想想看哪种适合你的场景:
策略一:流水线划分
把模型按层切分。比如前几层在NPU跑,中间层在GPU跑,后处理在CPU跑。这样做的好处是三个处理器可以同时工作。但有个坑——数据要在不同处理器之间搬来搬去,这个开销有时候比计算本身还大。
我的经验:流水线划分适合模型层数多、每层计算量大的场景。如果模型很小,切分的收益可能被数据搬运开销吃掉。
策略二:数据并行划分
把输入数据分成多份,CPU、GPU、