3、硬件加速与FPGA:FPGA在高频交易中的应用、硬件描述语言基础、FPGA与CPU协同
各位同学,今天我们来聊聊高频交易里最硬核的一块——FPGA。说实话,很多做软件出身的朋友一听到FPGA就头大,觉得那是硬件工程师的活。但我要告诉你,在高频交易这个领域,不懂FPGA,你就永远只能吃别人剩下的汤。
为什么?因为CPU的时钟频率已经卡在4-5GHz上不去了,而FPGA可以轻松跑到几百兆赫兹,并且它的处理延迟是纳秒级的。你想想看,在微秒定胜负的交易世界里,这差距有多大。
FPGA在高频交易中的应用
FPGA在高频交易里到底能干什么?我总结下来,主要有三个场景:
- 行情解析:把交易所发过来的二进制行情数据,直接在FPGA里解析成结构化的订单簿数据。CPU处理一个UDP包可能要几微秒,FPGA只需要几十纳秒。
- 信号生成:把交易策略的逻辑烧进FPGA里,让它根据行情变化直接生成买卖信号。省去了数据从网卡到CPU再到内存的来回折腾。
- 订单发送:把交易指令直接通过FPGA发送到交易所的网关。我记得有个项目,客户要求订单从策略决策到发出不能超过500纳秒,不用FPGA根本不可能。
核心观点:FPGA不是用来替代CPU的,而是用来做CPU做不了的事——极低延迟的确定性处理。
我在项目中遇到过一家做市商,他们用FPGA做期权定价。CPU算一次要3微秒,FPGA只要80纳秒。你想想看,同样一个策略,别人比你快40倍,这还怎么玩?
硬件描述语言基础
说到FPGA开发,就绕不开硬件描述语言。目前主流的有两种:Verilog和VHDL。我个人习惯用Verilog,语法更像C语言,上手快一些。
但这里有个坑,我必须提醒你:写Verilog不是在写软件,而是在画电路。很多新手把Verilog当C语言写,结果综合出来的电路乱七八糟。
来看一个最简单的例子——一个D触发器:
module d_flip_flop (
input wire clk, // 时钟
input wire rst_n, // 复位,低有效
input wire d, // 数据输入
output reg q // 数据输出
);
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
q <= 1'b0;
else
q <= d;
end
endmodule
注意看,这里用的是 <= 非阻塞赋值,而不是 = 阻塞赋值。为什么?因为硬件里所有寄存器是并行更新的,不是像软件那样顺序执行。我曾经见过一个同事,把所有赋值都写成阻塞的,结果仿真没问题,上板子就跑飞了。嗯,这个坑我踩过。
再来看一个稍微复杂点的——4位计数器:
module counter_4bit (
input wire clk,
input wire rst_n,
input wire en,
output reg [3:0] count
);
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
count <= 4'b0000;
else if (en)
count <= count + 1'b1;
end
endmodule
这个计数器在高频交易里有什么用?我告诉你,行情时间戳的生成、UDP包的序号校验、还有各种定时器的实现,都离不开它。
个人经验:刚开始学FPGA时,建议用仿真工具(比如ModelSim)先跑一遍,看看波形对不对。别一上来就烧板子,烧坏了心疼。
FPGA与CPU协同
好了,现在你知道了FPGA能做什么,也知道了怎么用Verilog写点基础逻辑。但实际系统中,FPGA和CPU是协同工作的。说白了,FPGA负责快但笨的活,CPU负责慢但聪明的活。
典型的架构是这样的:
这个图你看懂了吗?数据从网络进来,先到FPGA做预处理,然后通过PCIe或者共享内存传给CPU做策略决策,决策结果再回到FPGA发出去。整个链路里,FPGA负责把最耗时的网络协议解析、数据过滤、时间戳打标这些活干了,CPU只做最核心的策略计算。
FPGA和CPU之间的通信方式,我常用的有三种:
| 通信方式 | 延迟 | 带宽 | 适用场景 |
|---|---|---|---|
| PCIe DMA | ~1μs | 高 | 批量数据传输 |
| 共享内存(DDR) | ~100ns | 中 | 小数据量高频交互 |
| GPIO/SPI | ~10ns | 低 | 控制信号、状态同步 |
避坑指南:我曾经在一个项目里,FPGA和CPU之间用了PCIe DMA,结果发现每次DMA传输的启动开销太大,导致整体延迟反而比共享内存还高。后来改成共享内存+轮询的方式,延迟降了80%。所以,别迷信技术指标,要看你实际的使用场景。
最后,我想说一句:FPGA开发的门槛确实比纯软件高,但回报也大。你想想看,当你的竞争对手还在用CPU处理行情时,你已经用FPGA把延迟降到了纳秒级,这种优势是碾压性的。
嗯,今天就先聊到这里。下一节我们会深入讲FPGA上的行情解析实现,包括UDP协议栈的硬件化、订单簿的并行构建这些硬核内容。到时候我会带你们手写一个简单的行情解析器。
课后思考:如果你现在有一个交易策略,延迟要求是10微秒,你觉得用FPGA还是CPU更合适?为什么?