3、FPGA加速基础:流水线、并行处理与乒乓操作
各位同学,今天咱们聊聊FPGA加速的三个基本功。这三个东西,说白了就是FPGA工程师吃饭的家伙。我做了十几年低延迟交易系统,可以负责任地告诉你——不懂流水线、并行和乒乓,你根本做不出能用的交易加速卡。
3.1 流水线:把大任务拆成小步骤
先说说流水线。这个概念其实不新鲜,CPU里早就用了。但FPGA里的流水线,玩得更灵活。
什么叫流水线?我举个例子。你想想看,洗衣服这件事:洗衣、烘干、叠好。如果只有一个人,得等洗完才能烘干,烘干完才能叠。但如果你有三个人,第一个人洗,洗完交给第二个人烘干,同时第一个人继续洗下一批。这就是流水线。
在FPGA里,流水线就是把一个组合逻辑大块,切成若干小段,每段之间插上寄存器。这样做的好处是什么?
- 提升时钟频率:每段逻辑变短了,路径延迟变小,时钟就能跑得更快
- 提高吞吐量:虽然单个数据从进到出需要多个时钟周期(延迟变大了),但每个时钟都能输出一个结果
关键点:流水线增加的是延迟(Latency),但提高了吞吐量(Throughput)。在交易系统里,我们既要低延迟又要高吞吐,所以需要精心设计流水线级数。
我记得有一次做行情解析模块,原始代码里一个加法树用了8级组合逻辑,时钟只能跑到100MHz。我把它切成4级流水线,时钟直接飙到400MHz。虽然数据从进到出多了4个时钟周期,但整体延迟反而降低了——因为时钟快了4倍。
3.2 并行处理:同时干多件事
并行处理是FPGA的看家本领。CPU是串行的,一个时钟只能执行一条指令。但FPGA不一样,你可以同时做加法、乘法、查表、比较……所有操作都在一个时钟里完成。
我给大家画个图,看看并行处理在交易系统里怎么用。
看到没?行情数据进来后,价格解析、成交量统计、买卖盘口、时间戳处理,四个模块同时开工。这在CPU里得串行执行,但在FPGA里,一个时钟周期就全搞定了。
实战经验:我建议你在设计并行模块时,先画出数据流图。看看哪些操作可以同时做,哪些有依赖关系。并行不是越多越好,资源够用就行。
3.3 乒乓操作:让数据流不停歇
乒乓操作,这个名字挺形象的。就像打乒乓球,球在两边来回飞。在FPGA里,乒乓操作就是用两个缓冲区交替工作。
具体怎么玩?
- 准备两个RAM块:RAM_A和RAM_B
- 第一个周期,数据写入RAM_A,同时从RAM_B读出上一批数据
- 第二个周期,切换:数据写入RAM_B,同时从RAM_A读出
- 如此反复,读写交替进行
这样做的好处很明显——数据流永远不会停。写的时候在读,读的时候在写,没有空闲等待。
注意:乒乓操作需要双倍存储空间。在资源紧张的芯片上,要权衡一下。我曾经在一个项目里为了省资源,用了单缓冲,结果数据丢包了……后来老老实实改成乒乓,问题解决。
3.4 三种技术怎么配合?
这三种技术不是孤立的。在实际项目中,我通常这样组合使用:
| 场景 | 流水线 | 并行 | 乒乓 |
|---|---|---|---|
| 行情解析 | 每级解析一个字段 | 多路行情同时解析 | 输入缓冲乒乓 |
| 订单处理 | 校验→路由→执行 | 多订单并行处理 | 输出缓冲乒乓 |
| 数据聚合 | 多级累加流水 | 多维度同时聚合 | 中间结果乒乓 |
举个例子。我在做行情网关时,输入是10G以太网,数据包一个接一个来。我用了乒乓缓冲接收数据,然后用并行模块同时解析多个字段,最后用流水线把解析结果送到后续模块。整个链路延迟控制在200纳秒以内。
3.5 避坑指南
说了这么多,我给大家总结几个常见的坑:
- 流水线级数不是越多越好:每级流水线都要插寄存器,会占用资源。而且级数太多,数据从进到出的延迟会变大。我一般控制在3-5级。
- 并行度要匹配数据速率:不是所有模块都需要8路并行。如果数据速率只有100M,你搞个32路并行纯属浪费。
- 乒乓切换要小心:切换信号如果处理不好,会出现读写冲突。我习惯用格雷码做切换控制,避免亚稳态。
核心思想:流水线提升频率,并行提升带宽,乒乓消除等待。三者结合,才能做出真正的低延迟加速器。
好了,这一章的内容就到这里。这三种技术是FPGA加速的基石,后面的章节我们会反复用到。大家先把基础打牢,后面才能玩出花来。