1. 异构计算基础:为什么交易系统需要异构计算?CPU、GPU、FPGA的架构差异与适用场景
各位同学,今天我们来聊聊一个很实在的问题:为什么你的交易系统跑得不够快?
我入行那会儿,大家觉得用C++写个回测引擎就挺牛了。后来发现,策略稍微复杂点,回测跑一宿都出不来结果。再后来做高频,发现行情来了,CPU还在那忙着上下文切换,订单早被别人抢走了。
说白了,单靠CPU已经扛不住了。这就是异构计算登场的根本原因。
1.1 CPU的困境:它太“全能”了
CPU的设计哲学是“通用”。它要处理操作系统、网络请求、数据库查询,还得跑你的策略逻辑。它什么都能干,但什么都不精。
我举个例子。你在CPU上算1000只股票的因子,CPU会一条指令一条指令地取、译码、执行。遇到分支预测错了,还得清空流水线重来。你想想看,这效率能高吗?
CPU的核心痛点:
- 串行执行为主:虽然有多核,但单线程性能受限于主频和功耗墙
- 缓存依赖重:数据不在L1/L2里,就得等几百个时钟周期去内存拿
- 上下文切换开销大:操作系统调度线程,光保存恢复寄存器就够喝一壶的
我个人习惯:在评估一个策略能否上生产时,先看它的计算模式。如果是大量条件判断、逻辑分支,CPU还是首选。但如果是批量数学运算、矩阵计算,那就要考虑GPU了。
1.2 GPU:为并行而生
GPU最初是给图形渲染设计的。你想啊,屏幕上几百万个像素点,每个都要算颜色、光照、纹理,这天然就是并行的活。
交易系统里,很多场景跟图形渲染很像。比如计算投资组合的VaR,你要模拟几万条路径,每条路径独立计算。再比如做统计套利,你要同时算几百对价差序列的均值回归速度。
GPU的优势:
- 数千个计算核心:一个GPU有几千个CUDA核心,可以同时处理成千上万个任务
- 高内存带宽:HBM2e显存带宽可达1.6TB/s,CPU的DDR5才几十GB/s
- 适合SIMD模式:单指令多数据,一条指令对一堆数据做相同操作
避坑指南:我曾经把一个策略直接扔到GPU上跑,结果比CPU还慢。为什么?因为策略里全是if-else分支判断,GPU的warp divergence(线程束分歧)导致大部分核心在空转。记住:GPU怕分支,怕数据依赖。
1.3 FPGA:硬核的“可编程电路”
FPGA是个有意思的东西。它不像CPU那样取指令执行,也不像GPU那样有固定架构。FPGA的本质是可重构的硬件电路。
你可以把FPGA想象成一堆积木。你需要什么功能,就搭什么电路。想做个加法器?搭一个。想做个FIFO队列?搭一个。想做个行情解码器?直接搭个硬件解析器,一个时钟周期就能解析一条行情报文。
FPGA的杀手锏:
- 极低延迟:硬件电路没有指令开销,从输入到输出可能就几个纳秒
- 确定性:没有操作系统干扰,没有中断,延迟是固定的
- 流水线设计:可以做到每个时钟周期输出一个结果,吞吐量极高
注意:FPGA开发门槛高。写Verilog/VHDL跟写软件完全是两码事。我见过不少团队,花三个月写了个FPGA行情解析器,结果bug一堆,最后还不如用CPU加DPDK方案。所以,不是所有场景都值得上FPGA。
1.4 三种架构的对比:一张表说清楚
| 特性 | CPU | GPU | FPGA |
|---|---|---|---|
| 核心数量 | 4-64核 | 数千核 | 可编程逻辑单元 |
| 时钟频率 | 3-5 GHz | 1-2 GHz | 200-500 MHz |
| 延迟 | 微秒级 | 毫秒级(含传输) | 纳秒级 |
| 并行模式 | MIMD(多指令多数据) | SIMD(单指令多数据) | 流水线/数据流 |
| 开发难度 | 低 | 中 | 高 |
| 功耗 | 中等 | 高 | 低 |
| 适用场景 | 策略逻辑、风控、订单管理 | 批量回测、蒙特卡洛模拟、因子挖掘 | 行情解码、极速交易、低延迟链路 |
1.5 交易系统里的异构计算架构
在实际项目中,我们不会只用一种硬件。一个成熟的交易系统,往往是CPU + GPU + FPGA的组合拳。
我画了一张图,帮你理解它们怎么分工协作:
1.6 什么时候该上异构计算?
不是所有交易系统都需要异构计算。我见过有人用FPGA做日频策略的订单路由,纯属浪费。这里给你几个判断标准:
- 延迟敏感度:如果你的策略需要在微秒甚至纳秒级别响应,FPGA是唯一选择。做市商、高频套利就是典型。
- 计算密度:如果策略涉及大量矩阵运算、蒙特卡洛模拟,GPU能带来10-100倍加速。期权定价、风险分析都适合。
- 吞吐量要求:如果每秒要处理几十万笔行情,CPU扛不住,FPGA的流水线设计可以做到每个时钟周期处理一笔。
- 功耗限制:在机房机柜里,功耗是硬成本。FPGA的能效比(每瓦性能)通常优于CPU和GPU。
我的建议:先从CPU开始,用性能分析工具(perf、vtune)找到瓶颈。如果瓶颈在计算,考虑GPU。如果瓶颈在延迟,考虑FPGA。别一上来就搞异构,先优化算法,再优化硬件。
1.7 一个真实案例
我之前参与过一个期权做市项目。一开始全跑在CPU上,延迟大概50微秒。后来发现,大部分时间花在期权定价模型的计算上。
我们把定价模型移植到GPU上,延迟降到5微秒。但还不够,因为竞争对手已经做到1微秒以下。
最后,我们把核心的定价逻辑用FPGA实现,延迟直接降到200纳秒。配合CPU做策略逻辑和风控,整个系统延迟控制在1微秒以内。
嗯,这就是异构计算的威力。不是某个硬件多牛,而是让合适的硬件做合适的事。
好了,这一章就到这里。记住:异构计算不是炫技,是解决实际问题的工具。下一章我们会深入GPU编程,讲讲怎么用CUDA加速你的回测引擎。