ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

FPGA如何实现沪深行情低延迟加速?原理、架构与落地实践

FPGA如何实现沪深行情低延迟加速?原理、架构与落地实践 FPGA在沪深行情加速里到底扮演什么角色这几年讨论的声量确实越来越大。我做了几年FPGA开发也陆续接触过几个金融低延迟相关的项目趁这次机会把从原理到落地的一整套思路整理出来。这篇文章不是泛泛介绍FPGA有多快而是聚焦在沪深行情这个具体场景下FPGA到底解决了什么问题、每一段代码每一块板卡是怎么配合的、实际部署中又会撞上哪些文档里不会写的问题。无论你是准备切入这个方向的FPGA工程师还是量化团队里想搞懂硬件方案的开发者这篇都应该能帮你省下不少弯路上的时间。1. 为什么沪深行情加速最终会落在FPGA头上1.1 一条行情从交易所到策略端的完整延迟链先看一条沪深行情的完整生命周期。交易所撮合引擎一旦产生新的成交或快照行情会经由交易系统的出口网关打包走千兆或万兆网络组播到券商、期货公司等会员单位。会员单位机房收到报文之后传统做法是经过服务器网卡进入内核协议栈再由行情软件进程去组播订阅、解包、重组快照最终把更新后的盘口数据交给策略进程。这条链路每一个节点都有成本而且这些成本不只是简单的数值叠加更麻烦的是它们还会抖动。举个例子网卡收包触发中断唤醒CPU本身就有微秒级的不确定性到了高并发时段内核协议栈里报文排队抖动可能直接冲到几十微秒甚至上百微秒。很多策略团队做回测的时候只算行情数据到达时间减去交易所原始时间戳这个总延迟看起来平均只有几十微秒但如果把延迟的P99和P999单独拎出来看很多时候是平均值的十几倍。这种抖动对抢单类策略是致命的因为对手方一旦用硬件把延迟压到稳定几微秒你平均几十微秒的软件方案基本等于在跟别人赛跑而裁判还是按最坏情况计的。这里就引出了FPGA的第一个核心价值确定性。FPGA上跑的是一套固定的流水线逻辑没有操作系统调度没有中断响应没有上下文切换报文进来之后经过哪一级、每一级花多少周期都是设计阶段定死的。只要你时序收敛、时钟稳定它每一次处理的延迟基本就是恒定值抖动可以控制在纳秒级这在金融领域是软件体系很难给到的特性。1.2 为什么CPU、GPU和DPDK都还差一口气有人可能会问那我用DPDK在用户态轮询收包绕过内核协议栈延迟不是也能压到很低吗确实DPDK确实很优秀它能把传统内核网络的几十微秒级延迟降到几个微秒级很多行情系统也用这套方案。但它仍然是软件架构CPU的指令流水线、分支预测失败、缓存未命中、多核之间的锁竞争这些都是物理层面无法根除的变数而且CPU资源还得让出一大部分给策略计算、风控检查这些同样吃资源的事情。行情解析一旦遇上全市场高并发软件方案往往得靠加大CPU核数来硬扛成本和复杂度嗖嗖往上走。GPU就更明显了。GPU强在吞吐也就是同一时间处理海量数据的并行计算能力但它的调用模式是先攒一批数据再搬运到显存、执行kernel、再搬回来。这种批处理模式天然带高延迟可能几十微秒甚至上百微秒就没了用在行情加速的极低延迟数据路径上完全是南辕北辙。行情加速的诉求不是每秒算多少个矩阵而是单条报文从网口进来之后能不能以固定且极小的延迟完成解析并投递。FPGA的硬件并行特点正好卡在这个需求上。它没有取指译码执行这套指令流架构而是把逻辑直接映射成电路。同一个时钟节拍下网络收包逻辑在跑、行情解析状态机在跑、盘口快照更新逻辑在跑、用户数据包也在被拼装发送所有这些发生在同一个时钟周期内各干各的互不干扰。一个粗略的数量级对比软件行情解析普遍在几微秒到十几微秒网卡硬件卸载加FPGA解析通常可以降到几百纳秒到一两微秒而且这个延迟几乎不随行情并发量变化。FPGA的第二个核心价值就此体现并行吞吐下的稳定性。提示低延迟领域有个说法叫99.999%的延迟比平均延迟值钱得多。FPGA的意义并不只是把平均值做低更重要的是把尾部延迟压平因为这决定了你在一场极端行情中会不会被扫掉。2. 沪深行情报文格式与FPGA加速的切入点2.1 沪深的行情报文格式为什么天生适合硬件解析做硬件加速第一步不是写代码而是先搞清楚报文格式。上交所目前主力行情用的是STEP协议基于二进制编码深交所则用自己的Binary行情格式老一代是二进制STEP新一代是Binary它们有个共同特点大量字段是定长的头部固定消息类型字段固定偏移数据区按既定布局排列。这对硬件来说是极大的便利。软件工程师看二进制协议通常先骂一顿——没有XML那种自适应标签字段顺序变了就要改代码。但硬件工程师反而喜欢这种死板。因为硬件逻辑最擅长的就是处理符号固定、偏移确定、长度可预期的数据流。比如上证逐笔成交行情一条消息里包含了证券代码、成交价格、成交数量、成交类型等字段每个占用几个字节、在消息的第几个字节偏移处都是白纸黑字规定好的。FPGA解析器要做的事情本质就是建立一条多级流水线按偏移量直接把对应字节切出来拼成内部总线结构再打上硬件时间戳送入后续逻辑。深交所有个有趣的特点它的组播包会在一定时间内重复发送多遍用于抗丢包。FPGA天然可以做去重在极短时间内记住最近收到的报文序号遇到重复序号直接丢弃同时把首包的低延迟保留下来。这在软件方案里需要维护哈希表等数据结构在硬件里则是若干个比较器和寄存器就能解决的问题。2.2 行情链路中真正值得用FPGA加速的环节不是整条链路都需要FPGA也不是任何环节强行塞一个FPGA就能见效。要选准位置。以我个人的经验沪深行情加速里值得用FPGA介入的主要有三段。第一段是物理接入和网络层。包括光模块到FPGA的10G/25G以太网MAC接收以及组播报文的过滤、去重、VLAN处理。这一段用FPGA的收益是首先去掉网卡和内核协议栈的开销直接把网络报文从线缆上接进硬件逻辑。第二段是行情解析和快照构建。这是纯计算密集工作也是FPGA最出彩的地方。把二进制行情解析成结构化的行情快照维护一个完整的五档或十档盘口实时更新逐笔成交、逐笔委托。软件方案在这个环节通常要消耗几十个微秒的CPU时间FPGA方案则可以在报文还在网络层处理的时候就同步开始解析完全流水化推进。第三段是计算输出和分发。策略系统往往需要的是自选股快照、异动通知、或特定格式的UDP组播数据。FPGA可以在解析之后直接生成这些精简过的投递报文再通过硬件网口发出去整个过程不过几个微秒。有些方案还会在FPGA里内置盘口统计、大单异动检测等逻辑这就把行情加速从快升级到了又快又聪明。我整理了一个常用对比表方便直观理解各环节的收益量级链路环节典型软件方案延迟FPGA方案典型延迟主要收益来源网卡收包至用户态5-20微秒0.3-0.8微秒绕过内核协议栈和中断组播过滤与去重2-5微秒0.1-0.5微秒硬件比较器、按端口并行处理行情报文解析10-50微秒0.5-2微秒定长字段流水线解析盘口快照构建10-40微秒0.5-3微秒并行更新多档位自选股行情输出5-15微秒0.3-1微秒硬件组帧直接发出这个表是量级参考不是严格 benchmark因为不同交易所、不同FPGA芯片、不同行情包大小都会影响实际数据。但方向是一致的FPGA至少能把行情数据路径的总延迟从几十微秒拉到微秒级。2.3 一句话理解FPGA的快时间并行和空间并行软件方案里一个线程在同一时刻只能干一件事。即使你有十六核CPU核与核之间数据交换还得走内存总线有锁竞争。FPGA则完全不同它把功能模块复制成多份电路同时运行在同一个时钟沿上。假设你要同时维护十只股票的盘口软件里可能是循环遍历十只股票的mapFPGA则直接放十个完全一样的盘口维护模块一个时钟周期内十个模块各算各的互不干扰。这也是为什么FPGA方案在行情并发量翻倍的时候延迟仍然能保持稳定。它不像CPU那样共享一套取指/执行资源而是资源随功能模块线性扩张。当然FPGA内部的逻辑资源是有限的结构设计需要平衡并行度和资源占用这是后话但空间换时间这个基本逻辑是理解全篇文章所有技术细节的前提。3. 拆解一套沪深行情硬件加速系统的核心模块3.1 低延迟网络收发从光口到MAC的每一个比特一个典型的FPGA行情加速板卡通常带一个或多个10G/25G光口通过SFP/SFP28光模块接收交易所组播行情。光模块出来的串行信号先进入FPGA内部的GTH/GTY等高速收发器完成CDR时钟数据恢复和串并转换再送入MAC层IP核解析以太网帧。这个链路里每一个环节都有降低延迟的空间。我见过不少团队一开始为了省事直接在FPGA里调用完整的Ethernet MAC IP核包括CRC校验、FCS处理、流控管理等。但真正做过低延迟的人会告诉你那些在通用网络设备里非常有用的功能在低延迟链路里反而是累赘。比如完整MAC核会把整帧数据缓存到FIFO再输出确保CRC校验通过才释放这就要多等一整帧的时间。万兆下一帧最短也有几百纳秒在高频交易这种量级下这个等待是不能容忍的。所以很多低延迟系统选择自己裁剪MAC逻辑只做前导码检测、SFD定位、尽可能早地把帧头解析出来。收到目的MAC和以太类型之后立刻就能判断这帧是不是行情数据是的话马上开始解析不需要等整帧接收完。这种边收边解的方式可以让首包解析延迟比完整MAC核方案再压缩几百纳秒。当然代价是CRC校验延迟处理或者干脆不做取舍全看业务风险能不能接受。金融场景里行情是组播重复发送的偶尔漏掉一个坏包问题不大自行裁剪确实有实际部署案例。3.2 行情解析引擎状态机加流水线怎么设计行情报文有固定的头部、消息类型字段和消息体。解析引擎核心是状态机加多级流水线。以深交所Binary为例收到一个完整的以太网帧后先定位到IP头确认UDP端口号是行情服务对应的端口再定位到UDP Payload按行情协议头部的消息类型字段分发到对应的解析模块。这里有个设计细节不同消息类型的解析路径完全不同比如逐笔成交和逐笔委托它们的消息结构就差异很大。如果单一状态机里顺序判断就会造成同一条流水线上不同消息的处理时间不同有的消息绕路延迟抖动就出来了。好做法是先做一次并行分发把不同类型的消息导入各自的专用解析通道每一条通道都是独立的流水线。这样每条消息不管属于哪一类型从进入到完成解析的延迟都基本一致这对维持端到端延迟的确定性很有帮助。解析完之后的字段比如股票代码、成交价、成交量需要统一拼接成内部结构体。FPGA里没有结构体指针实际操作是用一长串寄存器数组或BRAM空间按约定的地址偏移把字段写进去。盘口维护模块和分发模块再从这个约定的内存视图里读取。实际上这套做法就类似软件工程里的共享内存通信只是FPGA里没有锁因为数据写入和读取必须严格按流水线节拍错开所有模块共享同一份主时钟域或者经过跨时钟域同步来保证无竞争读写。3.3 硬件时间戳让延迟可以被精确测量做低延迟系统数据面上每一纳秒都很珍贵但测量和监控这些纳秒同样重要。FPGA板卡一般会带一个高精度时钟同步模块常见方案是支持PTPIEEE 1588协议从机房的Grandmaster时钟同步时间。硬件里专门有一个模块负责在物理层打时间戳比如检测到SFD分隔符之后的第一个字节就锁存当前的纳秒计数器值。行情帧进来时打接收时间戳解析完成后生成输出帧时再打发送时间戳这两个时间差就是FPGA板卡本身的驻留时间可以通过寄存器或者专门的监控帧上报给上位机。有了这套机制你就能随时知道板卡是不是在正常状态运行延迟是否出现劣化而不需要拿外部示波器去做复杂测量。3.4 转发、分发与过滤逻辑行情加速板卡不只是给一个策略供数据它通常要同时服务多个策略终端。FPGA里的组播复制逻辑会维护一份订阅表记录哪些目标端口需要哪些股票代码的行情然后按订阅过滤、复制、封装成独立UDP流发出去。常见的做法是把全市场行情全部解析完但只对订阅的自选股做详细快照输出。这样既能保证策略端只拿到最精简的数据又能让FPGA内部资源集中处理核心计算。分发模块还要处理输出QoS主要是速率平滑防止突发行情导致下行交换机的缓存打满。4. 一个行情加速项目的完整落地路径4.1 需求定义延迟目标到底怎么定才合理很多团队做这类项目的第一个分歧就是延迟目标定多少。如果直接说越快越好这个项目大概率做不完因为低延迟和稳定、可维护之间需要不断权衡。合理的做法是先做全链路的延迟预算。假设端到端目标是把行情从网口进到策略收到数据控制在3微秒以内。那么你可以把预算拆分物理光模块和CDR约0.3微秒MAC裁剪和处理约0.3微秒行情解析和快照构建约1微秒输出封装和发送约0.5微秒留出0.9微秒的余量给时序抖动和跨时钟域同步。有了这层预算技术选型和模块设计就有了依据每个环节不用无限压榨也没有人做无用功。提示延迟预算表应该写进设计文档并且作为评审的必查项。否则等到板卡联调阶段你大概率会遇到每个模块都说自己很快但加在一起就超标了的尴尬。4.2 硬件选型按资源余量和接口速度选型FPGA选型方面真实项目里主流会选择Xilinx UltraScale系列或者Intel Agilex/Stratix 10这类中等偏高端型号原因很直白需要的GTH/GTY高速收发器数量要够逻辑资源最好用掉六成左右留一定余量DSP资源用于可能的行情计算BRAM/UItraRAM用于缓存行情帧。如果是学习或者验证阶段黑金、正点原子这些厂商的Artix-7系列开发板完全够用尤其是黑金的FPGA开发板资料全AXI总线和高速接口的例程都有适合先在板子上把DDR读写、网络收发这些基本功跑通。Ep4ce10这种入门级芯片做FFT频谱仪或者基础逻辑训练没问题但跑万兆以太网和复杂行情解析会比较吃力所以学习用和项目用要分开看。时钟方案上板卡需要低抖动时钟芯片给高速收发器提供参考时钟。我习惯用Si534x系列它可以在线配置输出频率和相位而且抖动性能足够支撑25G光口。正规项目里每个光口尽量用独立的时钟域避免多个通道共享参考时钟引入串扰。4.3 RTL设计里的流水线节奏和跨时钟域问题设计解析模块时我习惯先把完整的流水线级数定下来。比如深交所Binary行情快照解析大概分五级第一级网络帧头过滤第二级UDP和行情头解析第三级消息类型分发第四级逐字段转换与快照更新第五级结果写回BRAM或输出FIFO。流水线的关键是每一级工作量尽量均衡否则某一级成为瓶颈会拖慢整体节拍。如果某一级逻辑路径太长导致时序跑不到300MHz就得再插入一级流水不过每多一级就多一个周期的固定延迟所以是在时序和延迟之间找平衡。跨时钟域是FPGA调试里最隐蔽的雷区。网络收发器输出的时钟域和用户逻辑主时钟域不是天然同一个处理不当会出现亚稳态表现为偶发丢数据或者状态机跳飞。我在跨时钟域边界一律使用异步FIFO或双寄存器同步器并且要求带valid信号的同步必须使用握手结构。仿真阶段不一定能查出这类问题上板后却可能一夜之间出现偶尔丢一个包的诡异现象最后定位到就是跨时钟域没处理好。4.4 上板调试眼图、误码率、链路状态一个都不能少FPGA上板调试第一步永远是测物理链路。接好光模块和线缆后先通过IBERT集成式误码率测试验证高速收发器的信号完整性。跑一晚上误码率眼图张开正常再进逻辑功能调试。信号完整性的坑经常出在PCB布线和光模块的电源噪声上比如25G信号对阻抗匹配要求严格差分走线对内等长、对间间距、过孔stub都是影响眼图的因素。调试时如果眼图闭合第一步不是换芯片而是检查电源纹波尤其是给GTH供电的0.9V/1.0V电源纹波稍微大一点眼图立刻劣化。逻辑调试阶段我强烈建议把ILA/SignalTap探针留好关键信号像状态机当前状态、解析计数、FIFO水位都要能观察。但注意ILA探针本身会占用逻辑资源并影响布局布线过多的探针可能pending到时序收敛。我的做法是常驻少量关键探针详细波形采集用条件触发方式只在异常时抓一拍数据。5. 部署到生产环境后绕不开的运维深坑5.1 固件升级如何在不能停机的前提下换版本FPGA最尴尬的运维问题是升级。软件可以热更新FPGA的逻辑更新往往意味着加载新的bitstream这期间板卡会短暂离线正在处理的行情会中断。对连续交易系统来说中断哪怕几秒钟都可能是事故。所以真实系统里一定要有双镜像机制。Flash里至少放两个bitstream区域一个Golden镜像一个Update镜像。上电默认加载Golden保证板卡能起来需要升级时先把新版本写入Update区域然后触发远程跳转加载。万一新版本跑不起来看门狗或远程触发能回退到Golden避免板卡变砖。这种机制在Xilinx和Intel的FPGA上都支持差别在于具体寄存器操作但思路完全一致。5.2 散热与稳定性FPGA温度对时序的隐性影响金融机房里风道通常很好但FPGA满负荷跑起来功耗真不低。尤其是高速收发器数量多、逻辑资源占用率高的时候结温升高会导致内部走线延迟变大本来收敛的时序裕量可能就不够了。时序裕量不足最直接的现象是偶发逻辑错误而且极难复现。所以正式部署前要专门做热冲压测试升温到结温上限附近跑满负荷行情24小时观察是否有逻辑错误或者链路误码率上升。FPGA内部有温度监测二极管通过XADC或者System Monitor模块可以实时读取结温运维监控页面里必须把结温加进去设定高温告警阈值同时机柜侧要有切实有效的风冷或液冷手段。5.3 与现有交易架构的对接最难的不是FPGA是兼容性行情加速板卡不是孤立存在的它要无缝嵌入现有的柜台系统或策略系统。有些团队习惯让FPGA输出行情快照的私有二进制格式但策略端原来的软件解析模块完全不认结果延误比加速还多。好的做法是让FPGA的输出格式尽可能兼容现有软件体系的接口。比如原有系统用UDP组播接收行情FPGA输出就同样用UDP组播载荷格式尽量靠拢原有协议甚至保持一致。策略端代码改动量就会小很多只需要替换数据源地址即可。同时提供双路输出能力一路是原始行情透传一路是加速处理后行情方便团队做并行A/B对比验收。5.4 监控与运维做一套让交易团队放心的状态面板交易团队不关心你逻辑设计得多漂亮他们关心的是行情有没有断、延迟有没有变大、板卡有没有过热。运维面板需要提供几个核心指标收包计数、丢包计数、输出行情计数、板卡驻留延迟、参考时钟失锁状态、结温、电源电压。这些数据通过板卡管理网口或PCIe寄存器由监控agent周期抓取上报。时钟失锁是我特别想强调的一项。FPGA低延迟系统依赖高精度时钟同步一旦参考时钟或者PTP同步失锁延迟会立刻变得不可预测。很多故障复盘最后都指向时钟失锁但监控里根本没有这项结果只能靠肉眼发现行情延迟异常。所以时钟状态必须做硬告警专门接进值班系统。6. 从FPGA入门到金融行情加速一条务实的学习路线6.1 先别碰万兆网口把基本功练扎实如果你现在还是FPGA新手看见万兆网卡直接作为起点十有八九要劝退。我建议沿着基础逻辑→接口时序→中等规模系统→高速接口这条路循序推进。首先把Verilog或SystemVerilog语法吃透然后重点练状态机和时序分析。能自己设计一个状态机实现UART发送ASCII字符串是最经典的起点理解串口波特率时钟分频原理跑通仿真和上板你就对时序概念有了第一手体感。之后做频率测量、信号发生器、PWM输出这类小项目本质是进一步熟悉计数器、分频器、PLL的配合。这些项目资源占用不高用入门级板卡就能跑但足以把always块、组合逻辑、时序逻辑这些基础概念内化成肌肉记忆。6.2 用中等项目建立系统观基础通了之后重点是培养系统级设计能力。这意味着你需要把多个小模块组合起来形成有输入输出、有数据流、有状态控制的完整系统。例子很典型用FPGA做DDS信号发生器再配合ADC回采形成一个闭环或者做一个基于FFT IP核的频谱仪把实时采集的数据做频域分析显示到TFT屏上。这期间会强迫你学会例化IP核、配置AXI接口、处理跨时钟域这些都是FPGA开发的核心高频技能。如果你对图像感兴趣可以做OV5640摄像头采集加HDMI显示。这个工程会涉及Sensor时序配置、DDR3缓存、图像缩放和HDMI输出整套下来基本覆盖了中等复杂度项目的所有常见套路接口时序、DDR读写、数据通路、流控。做完这个再去碰网络协议栈你会明显感觉对数据从一端流到另一端这个过程有了完整的认知。6.3 再向高速接口与网络方向进发有了前面的基础就可以开始啃高速接口LVDS接收、MIPI CSI/DSI、高速ADC采样以及以太网方向。千兆以太网可以先从RGMII接口起步自己实现一个精简MAC跑UDP收发理解CRC、帧格式、IP/UDP打包。这一步能完成你对网络报文的微观结构就彻底清楚了。然后再切万兆甚至25G光口。这个过程里你会真正接触GTH/GTY收发器、SFP光模块、CDR、SerDes这些工业级知识点。有个项目建议必须做用FPGA实现TDC或者ADC采样配合FPGA进位链F设计一个时序测量模块。这类项目对时序约束和源同步接口的锻炼非常充分。等你适应了SerDes和IBERT调试再回看行情加速网络这块架构基本就是熟悉模块的排列组合了。6.4 面向金融场景做一次仿真级实战学以致用最关键的一步是找一个公开的行情数据源或者自己造一组模拟沪深行情报文然后动手实现一个微型加速原型光口进来模拟行情帧FPGA里做帧头过滤、行情解析、盘口维护再从另一个网口输出精简行情UDP包。这个过程里你会把之前所有零散的知识点全部串起来而且会切身体会到低延迟设计的细节无处不在——什么时候用组合逻辑什么时候打一拍、FIFO深度设多少、要不要跨时钟域、解析结果要不要缓存每个决定都在微秒级纬度上影响端到端延迟。如果后续有精力可以考虑参加FPGA创新设计大赛找高速接口和实时数据处理方向选题行情加速、信号处理、机器视觉都是天然适合发挥FPGA优势的赛题。提示学习FPGA有个大坑——只看书不写代码不跑板。Verilog不是看会的是改bug改会的。哪怕是最简单的LED流水灯第一次RK板子上的下载调试过程也比你看十篇教程有用。最后说点项目之外的体会做了几个低延迟方向的项目之后我最大的感受是金融行情加速这个领域真正的分水岭其实不是硬件设计技巧而是对整个数据链路从物理层到业务层的通盘理解。你写出来的每一行逻辑最终都是一条纳秒级通道上的一小节决定它优劣的不只是时序收敛还有你对业务语义吃得多透。个人建议如果你想深耕这个方向一定要抽时间弄懂STEP协议和深交所Binary协议的全部细节弄懂组播网络里的交换机行为、PTP时钟分发机制最好再了解点交易业务常用的盘口、撤单、逐笔归因这些概念。硬件工程师如果能直接跟量化策略团队对话那你的价值就不是一块能解析行情的高速板卡而是能把业务问题翻译成硬件方案的架构师。保持对确定性延迟这个核心指标的执念只要下功夫从FPGA入门到真正涉足金融低延迟领域并没有想象中那么遥远。
返回列表