第109章 小程序咬住大机房(2/2)
滚动排名。
窗口內前k个极值。
对於一家运作著千亿资金的量化私募而言,他们每天需要把成千上万只股票、期货合约,在过去好几年时间跨度里的分钟级甚至是tick级的切片数据全部铺开。
然后,系统必须像一个不知疲倦的机械齿轮,在这些天文数字般的数据序列上,挨个去计算过去七个时间切片內的中位数是多少,在当前这个滑动窗口里该標的排在第几名,这个时间段里成交量最大的几个切片是哪几个……
这是一种在逻辑上简单到不能再简单,甚至连大一新生都能用几行代码写出基本逻辑的窗口算子。
然而,在宏大的金融数据流面前,这种微小的算子,一个夜晚內,它们会被调用到十11甚至十12级別。
江临看著这份昂贵的火焰图,脑海中浮现出的,却是几个小时前在计算机学院陈启明办公室里,那张同样淌著性能鲜血的测试数据表。
陈启明表单里的dian7_fast与3_dow,与此刻这份价值百万级优化的私募机房瓶颈,在物理意义和数学本质上,根本就是同一种东西。
一边是被困在象牙塔內,大学实验室的离线测试机里,学者们为了几条微內核指令爭论不休。
另一边,是在寸土寸金的金融核心区,私募机构嗡嗡作响的庞大机房里,成群的伺服器因为算力枯竭而发出不堪重负的哀鸣。
两个在现实维度上隔著十万八千里,看似毫无交集的世界,在最深邃的计算底层,竟然被同一类微不足道的小程序,死死地咬住了命运的咽喉。
江临回想起了那个被盲目调用了七千八百多万次的旧因子库,想起了那个让程序去寻找程序的疯狂构想。
在那个时候,这条通往极致优化的道路,在他的视野里还仅仅是一道透著微光的门缝。
从旧因子库里那七千八百万次小排序开始,到江氏砖验证过程中被反覆打磨的ps状態枚举与死路剪枝,再到今天陈启明办公室里的三层可重定向超优化框架……
这道门缝,正在被他用无可辩驳的工程实力,一寸一寸地地撑开,直至变成一条康庄大道。
他双手放上键盘,给沈承业回了一封简短有力的邮件。
【任务我接了,二十万的基础审计费按你说的走流程。
但在开始干活之前,有三点必须写进协议。
第一,我只接触脱敏后的性能审计包和远程沙箱,不接触真实策略、不接触交易信號、不接触客户持仓和资金参数。
第二,对方必须把缺失值、停牌哨兵、nan、tie-breakg和復权异常的处理规则写成接口文档。
第三,我用来优化底层算子的工具链属於我个人,不隨项目交付转移。】
邮件的最后,他略作思索,又加上了一段务实的声明。
【另外,鑑於这套微架构优化的复杂性,目前的性能优化只能先给他们提供一版打底的解决方案。像他们这种量级的工业级应用,真正巨大的性能红利,必须得用更深维度的算法搜索去挖掘,那个工具我目前还在开发中。至於这第一版打底方案究竟能帮他们压榨出多少耗时,等我掛上他们的硬体环境实测出了结果,再报给你。】
发送键按下后不到三分钟。
沈承业就给予了肯定的答覆。
在接下来的几天时间里,江临的生活节奏,就像是处理器內部精密划分的时钟周期一样,被精准地切成了截然不同的两半。
白天的阳光下,他用已经日趋成熟的ps工具链,首先把那家私募机构庞杂而混乱的特徵计算流水线彻头彻尾地摸了一次底。
接著,他將那套原本在陈启明办公室里演示用的,三层可重定向框架的代价后端进行了修改,掛接到私募机构伺服器群所使用的特定微架构的perf性能模型上。
藉助於强大的算力推演,他跑出了一版用於打底的优化代码。
那段原本採用传统排序算法、在分支预测上损耗极大的rollg_dian7代码,被无情地连根拔起。
取而代之的,是一段经过零一原理严密证明其绝对正確,並且在指令层面对那家私募机构的硬体流水线脾气尤为契合的全新实现。
如果单独拿出来看一次函数调用的微观耗时,这段新代码依然只比原版快了那么几纳秒,似乎微不足道。
可是,当这个微小的优化,被乘上一个夜晚內高达几万亿次的恐怖调用基数时,量变终於引发了质变。
几天后,私募机构那边传回了实测的振奋消息。
整条特徵回测流水线的总耗时,被硬生生地向下压去了一大截。
以往需要跑到第二天清晨六点才能勉强出结果的任务,在凌晨三点半就已全部跑完。
dian7不是唯一被替换的函数。
江临一共替掉了三处热路径。
rollg_dian7,固定窗口k_dow,以及局部rank里一个反覆构造临时数组的小排序。
单次调用的收益都只有纳秒级,但三处合起来吃掉了原流水线接近六成cpu时间。
机房里,有一批原本被高温和满负荷榨乾的伺服器,在当晚就提前熄灭了高负载的指示灯,安静地空閒了出来。