您的位置:首页 >> 期货要闻 >> 文章正文
 

中信建投证券:期交所五档组播行情FPGA解码加速器设计与实现
时间:2024-3-29 21:53:56

  期交所五档组播行情FPGA解码器设计与实现

  期交所五档组播行情FPGA解码器是通过FPGA来实现对五档组播行情的解码加速功能。FPGA收到组播行情后进行解码,并在内部实时维护一个合约索引表和订单簿,经过数据规整化后,通过PCIe DMA将最新五档行情推送到策略服务器。由于采用定制化模板,策略服务器接收到的行情数据可以直接使用,从而实现了最优的行情解码加速。

  关键词:期交所;FPGA;行情解码

  1 背景

  近些年中国金融衍生品市场进入了快速发展阶段,期货期权交易业务以其丰富的风险管理功能受到越来越多投资者的青睐,也对商品市场的平稳运行起到了至关重要的作用。中信建投(601066)证券作为期交所的主做市商之一,始终致力于提升自身期货期权做市业务水平。

  做市业务属于一种典型的高频交易业务,系统的运行速度直接决定了业务的盈利能力。行情解码作为做市系统的关键路径之一,对速度有着极致的要求,软件方案通常使用低延迟网卡接收网络行情,再通过CPU在Cache中做行情解码。这种方案在行情解码方面虽然也有不错的表现,但是当合约数量增加、突发数据变多时性能会出现瓶颈,导致行情获取的延迟和抖动增加。本文提出一种基于FPGA技术的期交所五档行情解码加速方案,与软件方案相比,该方案能够做到更低的落地延迟和零抖动,有效提升期货期权做市业务的竞争力。

  2 整体结构设计

  2.1 报文结构

  期交所行情数据传输协议为二进制协议,采用网络字节序的大端存储方式,以组播的形式发送,每一个UDP数据包包含若干个报文,报文结构如图1所示。每个报文头部固定占用4个字节,对报文类型、消息个数和正文长度进行声明,正文部分存放多个相邻的消息,其消息总个数和总长度均在报文头部结构中标识。每个消息头部固定占用2个字节,对消息长度进行声明,后续部分为消息正文。

  图1 报文结构

  2.2 整体结构

  行情解码加速器通过信息提取与对齐模块(ExtractWithAlignment)接收UDP协议栈解析后的报文数据,根据报文长度、消息个数、消息长度等信息进行数据提取和对齐,解码模块(Decoder)根据报文类型对数据进行解码和分类存储,在内部实时维护一个合约索引表(IndexTable)和订单簿(OrderBook),数据重组模块(DataRestruct)根据业务需求提取订单簿内容并转化为定制化的精简数据结构,最终通过PCIe DMA上传。ConfigSpace模块用于寄存器配置和状态信息反馈。整体结构如图2所示。

  图2 行情解码加速器整体结构

  3 FPGA实现

  3.1 信息提取与对齐

  信息提取与对齐模块首先将报文头部剥离,提取报文类型、消息个数和报文长度字段,然后逐个消息提取消息长度和消息体数据。由于可能存在多个报文以及多个消息混合在一起传输,不能保证行情数据包是64位对齐的,为了方便后级逻辑识别和处理,模块将以消息为单位对有效数据进行提取和64位对齐处理。处理过程的状态机跳转如图3所示。

  信息提取处理过程的核心操作是对报文结构的解析,状态机首先需要对报文尾部进行检测,当报文尾部出现时,对报文结构进行分类解析。报文尾部出现时可能存在以下几种典型状态:

  1)数据仅包含当前报文尾部:该状态在下一拍时直接处理新的报文即可;

  2)数据包含当前报文尾部以及下一报文的部分报文头部:该状态寄存下一报文的部分报文头部,在下一拍时解析其余报文头部、报文正文;

  3)数据包含当前报文尾部以及下一报文的报文头部:该状态寄存下一报文的报文头部,在下一拍时解析报文正文;

  4)数据包含当前报文尾部以及下一报文的报文头部、报文正文:该状态寄存下一报文的报文头部,部分报文正文,在下一拍时解析剩余报文正文。

  如果未检测到报文尾部,则需要对消息尾部进行检测,当消息尾部出现时,对消息结构进行分类解析。消息尾部出现是可能存在以下几种典型状态:

  1)数据仅包含当前消息尾部:该状态在下一拍时直接处理新的消息即可;

  2)数据包含当前消息尾部以及下一消息的部分消息头部:该状态寄存下一消息的部分消息头部,在下一拍时解析其余消息头部、消息正文;

  3)数据包含当前消息尾部以及下一消息的消息头部:该状态寄存下一消息的消息头部,在下一拍时解析消息正文;

  4)数据包含当前消息尾部以及下一消息的消息头部、消息正文:该状态寄存下一消息的消息头部,部分消息正文,在下一拍时解析剩余消息正文。

  在完成有效信息提取后进行64位对齐处理即可进行解码操作。

  图3 信息提取处理过程状态机跳转

  3.2 行情解码

  行情解码模块主要依据报文类型和数量字段对行情数据进行区分,再对不同类型数据分别进行解码。做市业务主要关注如表1所示的合约索引报文、初始行情报文、单腿行情报文、组合行情报文、单腿深度行情报文和组合深度行情报文几种类型。

  表1 报文类型对应关系

  3.2.1 合约索引信息管理

  FPGA内部需要存储所有合约索引(Index)对应的合约编码(InstrumentId)。根据目前交易所的合约数量要求,我们预留最大8192个合约编码的存储空间。

  合约索引信息报文从系统启动开始至系统关闭,期间每50毫秒推送一个UDP数据包,包内包含一个报文,报文内包含多个消息,消息的结构如表2所示。合约索引的分配是从0自增的连续数据,因此设计合约索引表时,直接将合约索引当做存储地址,通过存储地址访问合约索引表内的合约编码。

  表2 合约索引信息报文结构

  硬件启动后,索引信息管理模块自动将合约索引表全部清0。接收行情后根据合约类型区分出是单腿合约还是组合合约,再解析出Index和InstrumentId,然后用Index做地址,把InstrumentId分别写入对应的合约索引表的SRAM中。

  合约索引行情主要区分首包和其他包,如图4所示,状态机在解析完首包的包头和包体之后,继续解析其他包的包头和包体,直到全部行情解析完成。

  图4 合约索引信息解析状态机

  3.2.2 初始行情管理

  初始行情报文从系统启动开始至系统关闭,期间每50毫秒推送一个UDP数据包,每个UDP数据包内包含一个报文,报文内包含多个消息。每个消息由多个字段组成,每个字段长度为4字节,最多可以包含7个字段。初始行情报文结构如图5所示。

  图5 初始行情报文结构

  本设计主要关注并解析如表3所示的字段类型。在对初始行情进行解析时,主要区分首字段和其他字段,状态机在处理完首字段后,继续处理其他字段。当处理完所有字段后,将行情中解析出的4种类型字段值组合成,通过Index进行索引,对订单簿中的初始行情RAM进行更新。

  表3 初始行情报文字段类型表

  3.2.3 单腿行情和组合行情管理

  单腿行情和组合合约的消息结构和图5初始行情报文类似,由多个长度为4字节的字段组成,最多包含23个字段。第一个字段包含价格精度和合约索引,第二个字段开始需要按位进行解析。本设计主要关注和解析如表4所示字段类型。

  表4 单腿行情和组合行情字段类型

  在对单腿行情进行解析时,主要区分首字段和其他字段,状态机在处理完首字段后,继续处理其他字段。更新时间由秒和微秒两部分组成,通过公式(1)计算得到单位为毫秒的更新时间。总成交金额TradeTurnover用两个字段表示,读取时先以整数形式将part1和part2读出,然后使用公式(2)将两个整数拼接起来,最后根据价格精度将其转换为精确的总成交金额。

  当处理完所有字段后,将解析出的最新价、成交量、持仓量、总成交金额、精度等字段组合,通过Index进行索引,对订单簿中的单腿行情RAM进行更新,同时将更新时间供单腿深度行情管理模块使用。

  组合行情的处理方式和单腿行情处理方式类似,但组合行情仅解析更新时间供组合深度行情管理模块使用即可。

  3.2.4 单腿深度行情和组合深度行情管理

  单腿合约的深度行情由单腿行情报文(0x10)和单腿深度行情报文(0x20)组成。组合合约的深度行情由组合行情报文(0x11)和组合深度行情报文(0x21)组成。深度行情UDP数据包结构如图6所示。

  图6 深度行情UDP数据包结构

  深度行情报文由多个字段组成,最多可以包含11个字段。第一个字段包含价格精度和合约索引,第二个字段开始需要按位进行解析,每个字段长度为8字节,前4字节解析规则与初始行情报文相同,包含符号位、字段类型、价格,后4字节包含该价位的委托量和订单个数,深度行情结构如图7所示。

  图7 深度行情消息结构

  本设计解析如表5所示字段类型的深度行情数据信息,采用面积换速度的设计思路,将深度行情解析为五档买价、五档卖价、五档买量、五档卖量四部分数据,分别通过一拍存储到订单簿中对应存储的RAM中,减少了因为数据量大导致的RAM存取时间开销。

  表5 深度行情字段类型

  如图8所示,状态机在处理完最后一个字段后,需要获取当前报文的更新时间,再通过Index索引到上一次推送相同合约行情时的时间来进行对比。如果时间相同,则不进行更新,如果时间不同,则向后级推送该行情,并将更新时间通过Index索引对Orderbook中的时间戳管理RAM进行更新。深度行情管理模块在每处理完一个深度行情时产生一个FinishQ和Finish_Data信号,通知数据规整化模块从订单簿中获取并上传最新的行情数据。

  图8 深度行情解析状态机

  3.3 合约索引表和订单簿

  合约索引表和订单簿均通过Index值作为地址进行索引。

  合约索引表用来维护合约编码,分为单腿合约索引表和组合合约索引表两部分,合约编码最大位宽是20字节,均存储在位宽20 字节、深度8192的双口SRAM中。合约索引信息管理模块每收到一个合约索引消息,该模块都会按合约索引作为存储地址将合约编码写入SRAM;数据规整化模块每完成一个深度行情的更新,该模块都会通过合约索引在对应的存储地址读取一份合约编码。

  订单簿用来维护合约索引、初始行情、单腿行情、组合行情、单腿深度行情、组合深度行情等信息,其他行情都会被FPGA自动过滤。为了提高并行度,订单簿将不同类型的数据分别存储于不同的SRAM中,再通过Index索引到对应的SRAM。根据策略需要,FPGA在订单簿内部维护单腿行情、组合行情的最新数据,再通过单腿深度行情、组合深度行情的FinishQ信号触发所有行情信息的合并及上传动作。

  3.4 数据规整化

  数据规整化(DataRestruct)模块分为单腿深度规整化模块和组合深度规整化模块两部分,主要用于读取两类深度行情的订单簿数据并进行精简规整化输出。如图9所示,上半部分为单腿深度规整化模块的处理流程,下半部分为组合深度规整化模块的处理流程,两个模块的行情输出结果通过Mux2to1模块进行Round Robin轮询调度后输出给PCIe DMA接口。

  图9 数据规整化模块处理流程

  数据规整化模块首先检查对应的FinishQ信号,每当产生FinishQ信号时,根据Finish_Data存储的合约索引判断待读取的SRAM地址,单腿深度行情从订单簿中读取并整合UpdateTimeStamp、InstrumentId、InitData、SingleData、DepthPriceData、DepthVolCntData数据存入对应的FIFO中,再根据FormOut模块的状态机填充精简数据结构并输出到后级MUX轮询,组合深度行情整合CMBUpdateTimeStamp、CMBInstrumentId、CMBDepthPriceData、CMBDepthVolCntData数据存入对应的FIFO中,再根据CMBFormOut模块的状态机填充精简数据结构并给到后级MUX轮询输出。

  本设计中用于PCIe DMA上传的精简规整化数据结构如表6所示,填充时每一拍(pat)向PCIe DMA接口输出256bit位宽的行情数据,总共6拍完成一个深度行情模板的输出。模板通过Tag字段区分两种类型的行情,通过Decimal字段维护五档行情的精度,数据结构尽可能根据软件需求进行字段填充,将同类型的数据聚集在一起方便策略服务器进行Cache读取。模板内预留了Rsv位用于填充未来策略算法可能需要的行情字段,并在专门设计预留了8字节的rsv位用于填充pcie header报文头部信息,最大限度保证策略服务器内存的Cache对齐,从而减小处理器读取数据时的延迟开销。

  表6 数据规整化后的精简数据结构

  4 性能分析

  行情解码加速器性能方面主要关注穿透延迟、吞吐量和抖动。板级测试方法如图10所示。期交所行情源回放服务器产生的行情通过一层交换机分为TCP行情和TCP镜像行情,策略服务器安装一块SolarFlare网卡和一块FPGA,网卡连接TCP行情用于软件的网络行情接入,FPGA连接TCP镜像行情用于硬件的网络行情接入。FPGA解码完成后通过PCIe接口将行情存储在策略服务器的内存中,策略软件在解码完成后将结果和内存中FPGA的输出结果通过结果比较函数进行对比,计算出平均时延和胜率。

  图10 软硬件性能比对测试框图

  策略服务器选用Dell R740服务器,CPU型号为Intel Xeon Gold 6226R,主频2.90GHz,32核。网卡型号为Solarflare SFC9220 10/40G。行情解码加速器选用Xilinx U50系列FPGA板卡,集成自研通用MAC、UDP协议栈和PCIe DMA模块,FPGA板卡工作频率可以达到380MHz,支持10G网络接入。测试时分别在行情解码加速器的入口和出口处打点,其中M1为行情在UDP协议栈出口处时间戳打点,M2为行情在PCIe DMA入口处时间戳打点,M2和M1的时间差值便是行情解码加速器的硬件穿透延迟。根据实际测试结果,行情解码加速器的硬件穿透延迟约为79ns。

  吞吐量受限于整条通路的瓶颈位置,抖动取决于吞吐出现瓶颈时待处理行情的平均排队时间。堵塞与否是由网络行情大规模输入时,解码模块处理速度和报文信息提取对齐模块处理速度是否匹配决定的。本设计解码模块的处理速度能够满足信息提取对齐模块的处理速度,实现流水处理,因此不会造成反压和阻塞的情况。根据实际测试结果,行情解码加速器在10倍速行情回放压力测试中,无数据反压和丢包现象,输出零抖动。

  使用期交所生产仿真测试环境进行性能和正确性比对测试,延迟和胜率测试结果如表7所示,在输出约376万个深度行情的情况下进行对比,FPGA解码方案和生产环境所使用的低延迟网卡+软件解码方案输出结果完全一致,并且具备较高的胜率和一定的延迟优势。

  表7 FPGA硬件解码方案与网卡+软件解码方案性能比对结果

  5 结束语

  本文针对期货期权做市业务需求,提出并设计实现了一种基于FPGA的行情解码加速器,并且在实现行情解码的基础上实现了数据规整化等定制化功能,使得策略服务器接收到的数据可以直接进行使用,不需要进行二次处理,优化了行情解码的延迟水平。通过和目前生产环境使用的SolarFlare网卡和软件解码方案进行性能比较,FPGA硬件方案具备较高的胜率和一定的延迟优势,对提高做市业务水平具有一定的价值。

作者: chengtianhao 来源: