http://mp.weixin.qq.com/s/BviH6gAqej6lHd9XxFKUfg

【交易技术前沿】基于FPGA技术的FAST行情解码研究 / 钟浪辉,陈敏,陈坚,刘啸林,秦轶轩,李道双

2017-09-08 上交所技术服务

本文选自《交易技术前沿》第二十七期 (2017年6月)。
钟浪辉1,陈敏1,陈坚1,刘啸林1,秦轶轩2,李道双2,
1上交所技术有限责任公司
2南京艾科朗克信息科技有限公司
E-mail :lhzhong@sse.com.cn

1、FAST行情与解码技术
2015年上海证券交易所正式启用了FAST行情。目前FAST行情的基本情况为:

FAST行情最大的优势在于行情时延降低和发布频率提高,理论上时延低于10毫秒。与此同时,行情的快速解析至关重要,因为行情快速解析直接影响到了资管产品的盈亏,是资管产品盈亏的首要因素。目前,上海证券交易所对行情的法定解析依靠EzSR软件,它依托主流通用操作系统、通用处理器(CPU)、主流通用网卡等,存在通用计算机无法逾越的性能瓶颈。
为了提高解析行情的速度,我们需要更专业的解决方案,考虑到证券行业相比其它行业具有日新月异的特色,新的解决方案必须能够快速更新,适应不断变化的业务需求。
2、新的解决方案面临的备选技术
专用芯片(ASIC)具备最快的运行速度和极高的可靠性,但是自定制此类专用芯片需要大量的初期投资、漫长的设计与制造过程,巨大的非经常性工程(NRE)费用,最主要的是一旦固化并生产出来就不能再变更,一般情况下需要大规模生产来降低单价成本。
GPU(Graphic Processing Unit)是一种专门运行绘图运算工作的处理器,其并不能完全替代CPU,但是可以减少显卡对CPU的依赖,加快绘图运算工作,尤其是在进行三维绘图运算时,功效更加明显。后来人们发现GPU的并行运算原理其实可以被推广到一般的运算当中,于是GPGPU(General Purpose GPU)的概念出现了,它开始运用OpenGL的shading language让GPU来执行一些简单的一般运算,因流水线深度受限,流式计算并不合适。
FPGA (Field Programmable Gate Array) 是一种硬件可重构的体系结构,通过对其自身内部电路进行重新连接(硬件编程)来实现用户想要的功能。FPGA具备硬件运行速度与可靠性,同时具有软件的灵活性,但却没有通用处理器数量的限制,而且不同于通用处理器的串行处理特性,它有真正的并行处理能力,每个处理单元相互独立。FPGA是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物,常被用作ASIC专用芯片的小批量替代品,除在通信、军工、工业控制等传统领域外,近年来被大规模部署在微软、百度等公司的数据中心、人工智能等领域,甚至在欧美的金融领域广泛应用。
3、各类技术的比较
ASIC 专用芯片在吞吐量、延迟和功耗三方面都无可指摘,但ASIC 研发成本高、周期长,不适合灵活多变的证券业务。
CPU、GPU与FPGA的比较如下:

相比CPU以及GPU,FPGA更适合计算密集型任务。FPGA同时拥有流水线并行和数据并行,而GPU只有数据并行。
例如处理一个数据包有10个步骤,FPGA 可以搭建一个10级流水线,流水线的不同级在处理不同的数据包,每个数据包流经10级之后处理完成。每处理完成一个数据包,就能马上输出。而GPU的数据并行方法是做10个计算单元,每个计算单元也在处理不同的数据包,然而所有的计算单元必须按照统一的步调,做相同的事情。这就要求10个数据包必须一起输入、一起输出,输入输出的延迟增加了。GPU在上百甚至几千个内核满负荷计算时拥有无与伦比的计算性能,但是行情解码处理这类负荷并不能让它表现出高性能。
对通信密集型任务,FPGA 上的收发器可以直接接上40 Gbps甚至100 Gbps的网线,以线速处理任意大小的数据包。而CPU 需要从网卡把数据包收上来才能处理。虽然GPU也可以高性能处理数据包,但GPU是没有网口的,意味着需要首先把数据包由网卡收上来,再让GPU去做处理,这样吞吐量受到CPU和网卡的限制。
综上, FPGA 的主要优势是稳定又极低的延迟,适用于流式的计算密集型任务和通信密集型任务,例如行情解码、资管产品事前、事中的风险控制。不管通信还是机器学习、加密解密,算法都是很复杂的,如果试图用FPGA完全取代CPU,势必会带来 FPGA 逻辑资源极大的浪费,也会提高FPGA程序的开发成本。更实用的做法是FPGA和CPU协同工作,局部性和重复性强的归FPGA,复杂的归CPU。

4、FPGA主要设计流程

FPGA是由存放在片内RAM中的程序来设置其工作状态的,因此工作时需要对片内的RAM进行编程。用户可以根据不同的配置模式,采用不同的编程方式。加电时,FPGA芯片将EPROM中数据读入片内编程RAM中,配置完成后,FPGA进入工作状态。掉电后,FPGA恢复成白片,内部逻辑关系消失,因此,FPGA能够反复使用。不同的编程数据,可以产生不同的电路功能。因此,FPGA的使用非常灵活。目前在全球市场中,Xilinx、Intel两大公司对FPGA的技术与市场仍然占据绝对垄断地位。FPGA设计的主要流程如图1所示。
图1 FPGA设计流程

4.1电路设计与输入
电路设计与输入是指通过某些规范的描述方式,将工程师电路构思输入给EDA工具。常用的设计方法有硬件描述语言(HDL)和原理图设计输入方法等。原理图设计输入法在早期应用得比较广泛,它根据设计要求,选用器件、绘制原理图、完成输入过程。这种方法的有点是直观、便于理解、元器件库资源丰富。但是在大型设计中,这种方法的可维护性较差,不利于模块构造与重用。
目前进行大型工程设计时,最常用的设计方法是HDL设计输入法,其中影响最为广泛的HDL语言是VHDL和Verilog HDL。他们的共同特点是利用由顶向下设计,利于模块的划分与复用,可移植性好,通用性好,设计不因芯片的工艺与结构不同而变化,更利于向ASIC的移植。
图2是所需要设计的四位同步计数器,图3是此电路设计的硬件描述语言。工程师通过硬件描述语言(图3所表示的Verilog代码),向EDA工具说明自己的电路构思(图2所表示的四位同步计数器),从而通过EDA工具,得到最终自己想要的电路。

图2 四位同步计数器`timescale 1ns/100ps// 模块端口定义module Counter (//声明输入信号input        CLK,input        RST_N,//声明输出信号output [3:0] CNT);//声明内部信号reg [3:0] cnt;assign CNT = cnt;//功能定义always@(posedge CLK, negedge RST_N) beginif (!RST_N) //若复位,输出为0cnt <= #5 4'h0;else//输出加1cnt <= #5 cnt + 1'b1;  endendmodule

图3 四位同步计数器Verilog代码

4.2功能仿真
功能仿真也称为前仿真,主旨在于验证电路的功能是否符合设计要求,其特点是不考虑电路门延迟与线延迟,主要是验证电路与理想情况是否一致。可综合FPGA代码是用RTL级代码语言描述的,其输入为RTL级代码与测试程序(Testbench)。图4为四位同步计数器Testbench的原理图, 图5为四位同步计数器Testbench代码,图6为用Modelsim得到的仿真波形。

图4 四位同步计数器Testbench

 `timescale 1ns/100ps  module Counter_tb;// 声明内部信号reg        clk;reg        rst_n;wire [3:0] cnt;// 声明时钟常熟parameter PERIOD = 20; Counter counter (.CLK(clk),.RST_N(rst_n),.CNT(cnt));// 提供激励信号initial begin#0 clk   = 1'b0;rst_n = 1'b0;#5 rst_n = 1'b1;end// 产生仿真所需时钟信号50MHzalways #(PERIOD/2) clk = ~clk;endmodule

图5 四位同步计数器Testbench代码

图6 四位同步计数器仿真波形

4.3综合优化
综合优化(Synthesize)是指将HDL语言、原理图等设计输入翻译成由与、或、非门,RAM,触发器等基本逻辑单元组成的逻辑连接(网表),并根据目标与要求(约束条件)优化所生成的逻辑连接,输出edf和edn等标准格式的网表文件,供FPGA/CPLD厂家的布局布线器进行实现。
4.4综合后仿真
综合完成后需要检查综合结果是否与设计一致,做综合后仿真。在仿真时,把综合生成的标准延时文件反标志到综合仿真模型中去,可估计门延时带来的影响。综合后仿真虽然比功能仿真精确一些,但是只能估计门延时,不能估计线延时,仿真结果与布线后的实际情况还有一定的差距,并不十分准确。这种仿真的主要目的在于检查综合器的综合结果是否与设计输入一致。目前主流综合工具日益成熟,对于一般性的设计,如果设计者确信自己标注明确,没有综合歧义发生,则可省略该步骤。但是如果在布局布线后仿真时发现有电路结构与设计意图不符的现象,则常常需要回溯到综合后仿真以确认是否时由于综合歧义造成的问题。
图7 在QuartusII中对计数器进行综合

图8 在综合后RTL Viewer中的计数器
4.5实现与布局布线
综合结果的本质是一些由与、或、非门,触发器,RAM等基本逻辑单元组成的逻辑网表,它与芯片的实际的配置情况还有较大的差距。此时应该使用FPGA/CPLD厂商提供的软件工具,根据所选芯片的型号将综合输出的网表适配到具体FPGA/CPLD器件上,这个过程就叫做实现过程。因为只有器件的开发商最了解器件的内部结构,所以实现步骤必须选用器件开发商提供的工具。一般根据设计的主要矛盾,选择面积或者速度或者是两者平衡等优化目标,但是当两者冲突时,一般满足时序约束要求更重要一些,此时选择速度或时序优化目标更佳。

图9 计数器设计的资源占用情况

图10 计数器设计的资源占用率
4.6时序仿真
将布局布线的延时信息反标注到设计网表中,所进行的仿真就叫时序仿真或布局布线后仿真,也叫后仿真。该仿真的仿真延时文件包含的延时信息最全,不仅包含了门延时,还包含了实际布线延时,所以布局布线后仿真最准确,能够较好的反映芯片的实际工作情况。一般来说,布线后仿真步骤必须进行,通过布局布线后仿真能检查设计时序与FPGA实际运行情况是否一致,确保设计的可靠性和稳定性。

图11 计数器设计的时序报告
4.7调试加载配置
设计开发的最后步骤就是在线调试或者将生成的配置文件写入芯片中进行测试。示波器和逻辑分析仪是逻辑设计的主要调试工具。传统的逻辑功能板级验证手段是用逻辑分析仪分析信号,设计时要求FPGA和PCB设计人员保留一定数量FPGA管脚作为测试管脚,编写FPGA代码时将需要观测的信号作为模块的输出信号,在综合实现时在把这些输出信号锁定到测试管脚上,然后连接逻辑分析仪的探头到这些测试管脚,设定触发条件,进行观测。
任何仿真或验证步骤出现问题,就需要根据错误定位返回到相应的步骤更改或者重新设计逻辑设计的主要调试工具。传统的逻辑功能板级验证手段是用逻辑分析仪分析信号,设计时要求FPGA和PCB设计人员保留一定数量FPGA管脚作为测试管脚,编写FPGA代码时将需要观测的信号作为模块的输出信号,在综合实现时在把这些输出信号锁定到测试管脚上,然后连接逻辑分析仪的探头到这些测试管脚,设定触发条件,进行观测。
4.8FPGA设计与软件设计的区别
FPGA设计与传统软件编程最大的区别在于前者是在设计硬件,是在组合那些晶体管的连接来完成设计;后者如C语言,是在设计程序,是用已经组合好的晶体管,来指挥这些已经连接好的晶体管完成一定的动作。FPGA工程师在写代码时,都会清楚的了解,最终代码所综合出的是怎样的硬件逻辑,就如同名称那样,硬件描述语言是用来描述硬件行为与逻辑的。而软件工程师通过编写指令控制处理器顺序执行任务,主要关心逻辑和抽象,关心代码量大了之后复杂度可控,不需要针对特定资源设计。
图12所示范的,是一段经典的软件程序,其作用是用来累加n个整数。对于任何一个单口单入程序都能用顺序,分支和循环3种结构实现。

Func sum(int n)
{  If (n<1) return -1;  If (n>1000) return -1;  i=0;    total=0;  for (;i<n;i++)  {  total+=i  }  return total;
}  

图12 n个整数累加软件程序
在FPGA设计时所用的硬件描述语言,此处以Verilog为例,也有类似的语义特性。
4.8.1 Verilog 的顺序结构
Verilog作为硬件描述语言,其描述的主要模块之间都是并行执行的。这和软件编程基于冯诺依曼结构,编写指令对处理器做顺序操作有着本质的区别。因此,Verilog从代码本身并不具备强烈顺序性,即按照代码的先后顺序而执行。但这并不意味着Verilog不能用来描述顺序结构,为了描述顺序逻辑,FPGA设计师经常使用有限状态机(Finite State Machine)这一模型。
有限状态机,又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。图12是状态机跳转图,State表示状态,Transition表示进行状态跳转的条件。

图13 有限状态机跳转图
在用Verilog实现有限状态机时,一般采用三段式block来描述状态机的三个组成部分,状态存储器(state register)、下一状态逻辑(next state logic)、和输出逻辑(output logic)。

//状态存储器
always @(posedge clk or negedge rst_n) begin  if(~rst_n) curr_state <= START;else curr_state <= next_state;
end  //下一状态逻辑
always @(*) begin  case(curr_state)  START : if(Transition1) next_state=STATE1;elsenext_state=START;STATE1 : if(Transition2) next_state=STATE1;else if(Transition4)next_state=STATEN;……endcase
end //输出逻辑
always @(*) begin  case(curr_state)  START : out = 2b‘00;STATE1 : out = 2b‘01;……endcase
end 

图14 三段式Verilog有限状态机
4.8.2 Verilog 的条件分支结构
在Verilog中有以下两种可综合的条件结构,if语句与case语句。if语句只有两个分支可供选择,case语句是一种多分支选择语句。

if(select)  out <= in;
else  out <= ~in;  case(select)  2’b00 : out <= a; 2’b01 : out <= b;    2’b10 : out <= c;  2’b11 : out <= d;
endcase  

图15 Verilog条件分支语句
Verilog的if语句与case语句,相对应与C语言中的if与switch case语句,从逻辑语义角度看是相同的。但有一点不同的是,Verilog 的case语句在第一个相匹配的case item被执行后就会终止后面case item语句的执行,不需要像C语言那样使用break语句,用来跳出switch语句。这是因为Verilog的case语句在最终将被综合成一个多路选择器,如图16所示。

图16 Full parallel case综合所得多路选择器
4.8.3Verilog 的循环结构
在Verilog中存在着4种类型的循环语句,用来控制执行语句的执行次数。
forever语句: 连续执行的语句。
repeat语句: 连续执行n次的语句。
while语句: 执行语句,直至某个条件不满足。
for 语句:三个部分,语义与C语言相同
for(表达式 1;表达式 2;表达式3)

while(表达式)
stament blocks

forever
stament blocks

repeat(表达式)
stament blocks
图16 图17 Verilog循环语句
Verilog的while与for循环语句,从语义上和C语言的for 与while语句相同。forever 相当于C语言中的while(true),repeat则表示连续循环n次。和C语言不同的是,如果想要使得Verilog代码可以被综合,即可以利用这段代码来生成所设计的硬件,循环次数表达式必须在程序编译过程中保持不变,即是一个常数,不可根据外部输入的变换而动态的更改循环次数。
5、国外证券期货领域的FPGA应用
国外主要的监管机构有:
SEC(美国证券与交易所委员会)
CTFC (美国商品期货交易委员会)
FIA(美国期货行业协会)
FIX国际协议联盟
IIROC (加拿大投资业监管组织)
ESMA(欧洲证券及市场管理局)
MiFID II 和(金融工具市场指令II)
FSA(英国金融服务管理局)
这些监管机构分别发布了行业监管要求,例如FIA–《交易公司风险控制建议》规定:
风险指标设置
价格波动范围
异常波动处置
乌龙指报单大小
重复指令执行阈值
报单速率
行情数值范围合理性检测
急停功能
做市商自我保护机制
IIROC –《交易监管合规条例》规定:

工欲善其事,必先利其器。面对市场司空见惯的高频交易,各大机构为了满足监管要求,不约而同地使用FPGA来实现风控,有效避免一般软件在风控领域(包含行情快速解析)的力不从心。首先,由于采用流水线逻辑体系结构,数据流的处理延时要低,在金融风险控制等应用中,这是关键优势;其次,FPGA的浮点运算等短板可以通过内嵌IP核解决,同样的性能消耗更少的功耗;第三,FPGA具有很好的通用性和广泛的连通性,能与低延时网卡等外部设备配合使用;最后一点就是它的灵活性,以周为单位的开发管理与以秒为单位的变更管理,适应业务变化的同时最大程度地保护了原有投资。
6、国内证券期货领域的FPGA应用
目前国内证券、期货相关机构、公司也在密切关注更快的行情解码技术,这些技术对于交易、风控也有帮助,直接关系到资管产品的合规性与盈利水平。
每个机构的每个资管产品一般都需要紧盯着日内的交易,按照国内监管机构的监管要求实施风控,例如:是否有错误或异常(比如波动率异常)、是否违反风控规定等(比如仓位超标,击穿风控线),面对行情极端变化、订单庞大的现实情况,目前许多机构开始放弃纯粹软件方案,考虑利用FPGA的运算快、延时低、功耗低、易变更等特点来实现风控。
南京艾科朗克(Accelecom)信息科技有限公司、杭州盛立金融软件开发(杭州)有限公司等提供的基于FPGA的行情、风控、交易方面的解决方案正在逐步为行业所接受。

7、课题研究的技术路线
今年初,上交所技术有限责任公司开设了《FAST行情硬解码》课题,希望通过课题研究能够深入、直观感性地理解、应用FPGA技术,充分发挥它的长处、回避它的弱点与风险,由于我公司在此方面人才储备不足,目前课题研究联合了南京艾科朗克信息科技有限公司,研究人员希望推出不同的解码工具并直接进行正确性、稳定性、延时等方面的比对。
在课题成果演示机房,我们与其他用户公平地、同步地获取上交所行情组播数据,但是做了如下四个方面的处理以提升行情解码速度:
FPGA卡内采用低延迟光网络技术。
FPGA卡内硬件化各层通讯协议栈;
FPGA卡内对FAST行情进行硬件解码;
FPGA卡内对多路FAST行情进行合并优选;
实现低延迟光网络,除了采用低延迟交换设备,对于终端设备也有高要求,在物理层上要提高光电转换信噪比,降低误码率;在其上层各传输协议要尽量做到硬件加速,如将MAC、IP、TCP/UDP协议栈整个实现到FPGA中。在此基础上才开始行情解析。
本解码系统输入行情数据,对获取的行情UDP报文经解析得到的FAST报文,通过数据存储备份模块保存和记录后将行情包发送给报文选择模块;对上述步骤发送的FAST报文,根据报文中的时间戳检验行情数据的先后顺序,对于具有相同时间戳的FAST报文,只对其中首个到达的进行提取,其余具有相同时间戳的行情FAST报文将被丢弃。
8、课题研究的主要步骤与预期目标
首先,研究人员将依据低延迟光网络、基于FPGA的高性能计算特性,制定需要使用、集成的第三方IP核,需要自主完成的逻辑设计以及FPGA卡与外部的数据、应用接口;此阶段预期正确解析出上交所FAST行情,并且无丢包、低延迟。此阶段的难点在于FPGA软硬件的交互,需要进过较长周期的开发及系统测试,测试组测试需严谨、周密。
其次,定义C/C++纯软件的解码方案以及对外输出的数据接口;此阶段预期正确解析出上交所行情,并且无丢包、尽可能稳定、平滑、低延迟。此阶段的难度不大,按照一般的软件工程循序渐进开发即可。

9、课题进展与未来展望
5月,本课题已经初具成果,开发出行情硬解码的原型产品。为进一步了解市场需求、夯实将来转化为产品的基础,同时对课题涉及的软硬件进行技术打磨和性能优化,课题组提请公司允许进行少量不同应用场景的用户测试。测试用户以证券公司总部、数据中心用户为主,营业部级的用户也可以参测,考虑到营业部大部无直连的FAST行情源,所以需要通过总部先行申请(临时)接入我公司高速地面行情网。作为比对工具的纯软件的行情解析软件也初具成果,用户测试期间可以与FPGA硬解码联合组成双活的异构行情解析产品,在FPGA卡本身出故障无法解析时用户仍然可以获得连续的行情,免去用户侧的应急切换操作。
6月,测试用户对课题成果进行了积极反馈,各测试单位基本认可课题成果。但是,考虑到收费与免费会影响用户对课题成果的真实判断,目前课题组拟报请公司同意试销售,设立不超过三个月的试用期,试用后继续使用的用户需要按年收费。如果通过试销售发现课题能取得一定的商业价值与社会意义,这就证明硬解码不仅是快速、稳定、可靠、的解决方案,更可能发展为稳定成熟、经济实用的产品。届时,我公司可能顺应市场需求研发基于FPGA技术的系列产品,利用其IO资源丰富,内部程序并行运行等特点,为证券行业提供行情快速解析、风险控制、期权波动率与希腊字母计算、ETF指数跟踪等方面的解决方案,降低行业风险、提高行业安全运营水平。

(转)基于FPGA技术的FAST行情解码研究相关推荐

  1. 上交所技术 基于FPGA技术的FAST行情解码研究

    本文选自<交易技术前沿>第二十七期 (2017年6月). 钟浪辉1,陈敏1,陈坚1,刘啸林1,秦轶轩2,李道双2, 1上交所技术有限责任公司 2南京艾科朗克信息科技有限公司 E-mail ...

  2. 基于FFMPEG 的跨平台视频编解码研究

    第33卷 第11期 2011年11月 武 汉 理 工 大 学 学 报 JOURNALOF WUHANUNIVERSITYOFTECHNOLOGY Vol.33 No.11 췍췍췍췍췍췍췍췍췍췍췍췍췍췍 ...

  3. python实现高校教务管理系统_基于Python技术的教务管理系统的研究与开发

    龙源期刊网 http://www.qikan.com.cn 基于 Python 技术的教务管理系统的研究与 开发 作者:戴雯惠 来源:<价值工程> 2018 年第 27 期 摘要:随着教育 ...

  4. 基于高光谱技术的农作物常见病害监测研究

    基于高光谱技术的农作物常见病害监测研究 1.发现问题 近年来随着信息技术的快速发展,高光谱技术以数据量丰富.灵敏.可靠的特点迅速应用于农业生产中,成为主要检测农作物病害的有效技术手段之一. 2.农作物 ...

  5. hadoop下计算机网络安全设计与实现,基于PKI技术的网络安全平台设计研究

    科技信息 0 IT技术论坛0 SCIENCE&TECHNOLOGY INFORMATION 2008年 第4期 基于 PKI技术的网络安全平台设计研究 马 (陕西交通职业技术学院 骞 陕西 西 ...

  6. 基于JSP技术进行信息交互的研究与应用

    首页 | 最新栏目 | 关于我们 | 读者园地 | 联系我们 基于JSP技术进行信息交互的研究与应用       摘  要  从信息交互的方式着手,结合开发项目中遇到的实际问题,本文总体上将JSP动态 ...

  7. 基于BIM技术的施工管理平台研究

    BIM技术是一种数字化建模技术,它根据建筑图纸等信息生成三维的建筑模型,可以在最早期向我们展示该建筑物.BIM技术与工程项目成本管理系统相结合,方面可以提高项目前期的预算精度,同时也可以帮助企业在项目 ...

  8. gis根据范围批量分开图斑_基于BIM-GIS技术的公路预防性养护研究

    多年来,国内外学者陆续将BIM技术及GIS技术引入到公路信息化管理,在公路建设.路政执法和资产管理方面取得较好的效果.美国联邦公路局将GPS.GIS及多媒体视频等技术应用到公路资产管理,可以迅速的定位 ...

  9. 基于V2G技术的电动汽车有序充放电研究

    1.研究背景 众所周知,能源问题.环境问题和碳中和问题一直是全球的热点问题.要想解决这些问题带给人类的困扰,就必须在各个领域提出与之相应的发展规划.早在很多年前,在能源领域就开始大力发展新能源发电,意 ...

  10. 精简指令集计算机组成,基于FPGA的精简指令集计算机的研究与开发

    摘要: 大规模可编程逻辑器件CPLD和FPGA是当今应用最广泛的两类可编程专用集成电路(ASIC),电子设计工程师用它可以在办公室或实验室里设计出所需的专用集成电路,从而大大缩短了产品上市时间,降低了 ...

最新文章

  1. L2-006 树的遍历-团体程序设计天梯赛GPLT
  2. P2014 选课 (树形动规)
  3. tensorflow随笔-简单CNN(卷积深度神经网络结构)
  4. html字符串使用xpath,使用XPath和regex在HTML注释中提取文本
  5. linux 磁盘过滤驱动_磁盘阵列_磁盘阵列品牌报价及型号大全-北京新维迅科技有限公司....
  6. 讨论过后而引发对EF 6.x和EF Core查询缓存的思考
  7. .h .dll .lib
  8. lcc-win32使用指南
  9. vue-cli3出现Invalid Host header的解决方案
  10. Apache的下载安装(主要说的 64位)及问题
  11. POJ 1127_Jack Straws
  12. python 爬虫库 u_9个用来爬取网络站点的 Python 库
  13. 3d效果图制作傻瓜软件_推荐两个傻瓜式3d家装设计软件,适合设计爱好者
  14. 【String-easy】551. Student Attendance Record I 学生迟到和旷课
  15. 如何进行数据可视化制图
  16. @Aspect注解使用场景
  17. 抗混叠滤波器 - ADC前端放大器和RC滤波器设计实现步骤
  18. Eclipse 删除找回(SVN)
  19. Java基础以及变量和运算符、包机制、javadoc生成
  20. 数字图像处理吴娱课后答案_何东健数字图像处理课后答案

热门文章

  1. 【C/C++学院】0805-语音识别控制QQ/语音控制游戏
  2. ios app 提交评审注意事项
  3. 空间数据库学习笔记(四):空间引用标识符(SRID)
  4. 腾讯这几年成果还真不少!抢了不少群众资源。。。
  5. jmeter内存溢出解决办法
  6. python自动化测试学习笔记-4内置函数,处理json
  7. python里的正则表达式
  8. 【万里征程——Windows App开发】如何使用粘贴板
  9. Android中缓存记忆
  10. python SQLite 初识