取决于你的算法复杂度、并行度以及数据搬运的效率。
对于简单的"向量加法",FPGA 甚至可能比 PS(ARM CPU)更慢 ;但对于"卷积、滤波、复杂数学运算",FPGA 会快出 10 倍到 100 倍。
我们可以从以下三个维度来拆解这个"快"字:
1. 理论算力的对比:并行 vs 顺序
- PS (Cortex-A9) :是串行执行的。即使有 NEON 协处理器,它一次也只能处理少量数据(SIMD)。如果你算 1024 个加法,CPU 需要跑一个循环,每个循环耗费几个时钟周期。
- PL (FPGA) :是并行 执行的。在 HLS 中,如果你使用
#pragma HLS UNROLL,你可以同时调用 10 个甚至 100 个乘法器(DSP)在同一个时钟周期完成计算。
2. 实际案例对比(以图像卷积/滤波为例)
假设你正在处理一张 的图片进行高斯滤波:
| 平台 | 执行方式 | 耗时估计 |
|---|---|---|
| PS (ARM A9) | 嵌套循环,逐像素计算 | ~100ms - 200ms |
| PL (HLS 优化) | 行缓冲 (Line Buffer) + 流水线并行 | ~2ms - 10ms |
| 提升倍数 | - | 10x - 50x |
为什么快这么多?
因为 FPGA 不需要像 CPU 那样不停地"取指令、译码、执行"。硬件电路一旦跑起来,数据就像水流一样流过计算单元,每个时钟周期都能吐出一个处理好的像素点。
3. 决定"快慢"的三个关键因素
在 Zynq-7020 上,如果你发现 FPGA 没比 PS 快,通常是因为以下原因:
A. 数据搬运开销(最大的坑)
正如你在代码中看到的,你需要 Xil_DCacheFlushRange(刷新缓存)。
- CPU 算:数据就在 Cache 里,直接算。
- FPGA 算:CPU 写数据 -> 刷新 Cache -> FPGA 从 DDR 读数据 -> 计算 -> FPGA 写回 DDR -> 丢弃 Cache -> CPU 读结果。
结论:如果算法太简单(比如仅仅是加法),搬运数据的时间会远远超过节省的计算时间。
B. 算法的复杂度
- 简单运算:PS 占优。
- 复杂运算(求平方根、三角函数、多层卷积):PL 占优。FPGA 可以通过消耗资源换取极低的指令周期。
C. 流水线 (Pipeline) 的深度
在 HLS 中,如果没有写好 PIPELINE 约束,FPGA 可能也是顺序执行的,主频又只有 100MHz-200MHz(远低于 A9 的 667MHz),这时候 FPGA 反而会输。
4. 什么时候该用 PL 运行?
满足以下条件之一,就应该把算法从 FreeRTOS 迁移到 PL:
- 实时性要求极高:比如电机控制,必须在几个微秒内做出反应,CPU 可能会被中断打断,但 FPGA 不会。
- 重复性计算量大:如视频流处理、FFT 变换、神经网络推理。
- 多通道同步:你需要同时处理 4 路传感器的原始数据。
总结建议
如果你只是做 C = A + B,在 PS 端做就好。如果你要做 1024 点的 FFT 或者 3x3 的图像卷积 ,PL 端通过 HLS 优化后,性能通常会有 20 倍以上 的质跃。