一、硬件化动机:为什么要把交易算法跑在FPGA上?
各位同学好,我是老张。做量化交易硬件加速这行十几年了,今天咱们聊聊最根本的问题——为什么非要用FPGA跑交易算法?
很多人觉得,CPU不是挺好的吗?Xeon跑个Python策略,一天几百万笔交易,够用了吧?
嗯,我刚开始也这么想。直到有一次,我在一个高频做市项目里,眼睁睁看着CPU上的策略因为一次GC暂停,错过了最佳报价窗口——那一瞬间的损失,够买好几块高端FPGA开发板了。
说白了,软件和硬件的差异,就藏在三个关键词里:延迟、确定性、吞吐量。咱们一个一个拆开看。
1.1 延迟:微秒级的生死线
先问个问题:你的交易策略能容忍多少延迟?
如果是做日频、小时频交易,几十毫秒的延迟根本无所谓。但如果你做的是高频做市、统计套利、跨交易所价差套利——延迟就是生命线。
我见过最极端的场景:某家自营交易公司,为了把订单从上海传到东京的延迟降低1微秒,愿意花几百万美金租用专用光纤。为什么?因为1微秒的领先,意味着能抢到更好的成交价格。
咱们看看CPU和FPGA在延迟上的本质差异:
| 维度 | CPU(软件) | FPGA(硬件) |
|---|---|---|
| 指令执行方式 | 顺序取指、译码、执行 | 并行硬件逻辑直接运算 |
| 操作系统开销 | 中断、上下文切换、调度延迟 | 无操作系统,裸金属执行 |
| 内存访问 | 多级Cache、TLB缺失、页表遍历 | BRAM/URAM直接访问,无缓存缺失 |
| 典型端到端延迟 | 1-10微秒(甚至更高) | 10-100纳秒 |
核心差异:CPU是"取指令→执行"的冯·诺依曼架构,每一步都有固定开销。FPGA是"逻辑门直接算",没有指令开销,没有操作系统干扰。
我在一个项目中做过对比测试:同样的期权定价模型(Black-Scholes),CPU上用C++优化到极致,延迟约3.2微秒;FPGA实现后,延迟降到47纳秒。差了将近70倍。
避坑指南:我曾经以为FPGA延迟低是理所当然的,结果第一次做PCIe DMA传输时,发现驱动层就有几百纳秒的抖动。记住:FPGA本身延迟低,但数据进出FPGA的接口才是真正的瓶颈。建议用RDMA或直接网口接入,绕过PCIe。
1.2 确定性:为什么软件会"卡顿"?
延迟低还不够,关键是延迟要稳定。
你想想看,如果一笔交易平均延迟是1微秒,但偶尔会跳到100微秒——这种"毛刺"对高频策略是致命的。因为你的对手盘可能就在那100微秒里抢走了流动性。
CPU为什么会有毛刺?原因太多了:
- 操作系统调度:Linux内核可能把你的交易线程挂起,去处理网卡中断
- Cache Miss:数据不在L1 Cache里,得去L2甚至主存取,延迟暴增
- TLB缺失:虚拟地址转物理地址时,页表不在TLB里
- 垃圾回收:如果你用Java/C#,GC暂停是噩梦
- 超线程干扰:同一个物理核上的另一个线程抢资源
FPGA呢?没有操作系统,没有Cache,没有虚拟内存。每个逻辑门的行为在综合时就已经确定了。输入信号进来,经过固定的组合逻辑和时序逻辑,输出结果——每一拍都是确定的。
关键数据:在CPU上,延迟的抖动(jitter)通常是平均延迟的10-100倍。在FPGA上,如果设计得当,抖动可以控制在1-2个时钟周期内(比如10纳秒以内)。
我记得有一次帮一家期货公司做套利系统。他们的CPU方案在回测时表现完美,但实盘时经常出现"滑点"。后来抓包分析发现,每当系统日志写入磁盘时,交易线程就会被阻塞几十微秒。换成FPGA后,这个问题彻底消失了。
注意:FPGA的确定性也不是绝对的。如果你用了DDR4内存(有刷新周期)、或者通过PCIe与CPU交互(有总线竞争),仍然会有微小的抖动。真正的"硬实时"方案,是把所有数据都放在FPGA内部的BRAM/URAM里,或者用HBM(高带宽内存)。
1.3 吞吐量:并行才是王道
延迟和确定性讲完了,咱们聊聊吞吐量。
CPU的吞吐量提升靠什么?主频、多核、SIMD指令集。但有个根本限制:指令级并行度有限。一个CPU核心一次只能处理一条指令流(虽然现代CPU有超标量、乱序执行,但本质还是串行的)。
FPGA不一样。你可以把算法拆成多个流水线阶段,每个阶段用独立的硬件逻辑并行处理。比如:
- 阶段1:行情数据解析(解析UDP包、提取订单簿)
- 阶段2:信号计算(计算买卖压力、价差、波动率)
- 阶段3:策略决策(判断是否下单、下单价格和数量)
- 阶段4:订单发送(组装FIX协议包、发送到交易所)
这四个阶段在CPU上是串行执行的。但在FPGA上,你可以让它们像工厂流水线一样同时工作——每个时钟周期,四个阶段各处理一笔不同的数据。
我做过一个极端的例子:一个基于L2订单簿的统计套利策略,CPU单核每秒处理约50万笔行情更新。FPGA实现后,每秒处理超过2000万笔——40倍的吞吐量提升。
为什么能差这么多?因为FPGA的并行是"空间并行"——用更多的逻辑资源同时做更多的事。CPU的并行是"时间并行"——靠更快的时钟跑更多的指令。空间并行的扩展性远好于时间并行。
当然,这里有个前提:你的算法要适合流水线化。如果算法有大量的条件分支(if-else嵌套很深),FPGA的优势会打折扣。但交易算法有个特点——大部分计算是数值型的(加减乘除、比较、排序),非常适合硬件化。
1.4 一张图看懂:软件 vs 硬件
说了这么多,咱们用一张SVG图来总结一下核心逻辑:
1.5 什么时候该用FPGA?
说了这么多FPGA的好处,但也不是所有场景都适合。我给大家一个简单的判断标准:
适合用FPGA的场景:
- 延迟要求 < 1微秒(比如高频做市、套利)
- 延迟抖动必须 < 100纳秒(比如期权做市)
- 吞吐量要求 > 100万笔/秒(比如全市场行情处理)
- 算法相对固定,不需要频繁更新
不适合用FPGA的场景:
- 策略每天改好几次(FPGA开发周期长)
- 算法逻辑极其复杂(大量条件分支、递归)
- 数据量很小,延迟要求不高(杀鸡用牛刀)
- 团队没有硬件开发经验(学习曲线陡峭)
我个人习惯是:先用CPU做策略研究和回测,等策略稳定了,再把核心计算逻辑搬到FPGA上。这样既保证了灵活性,又拿到了性能优势。
好了,这一章咱们把"为什么用FPGA"这个问题讲透了。下一章,我会带大家看看FPGA的内部结构——那些LUT、FF、BRAM、DSP到底是怎么工作的,以及如何用它们来搭建交易算法的硬件流水线。
公众号:蓝海资料掘金营,微信deep3321