第108章 降维解构
计算机学院。
陈启明的办公室在四楼,门虚掩著。
江临敲门进去时,这位髮际线后撤的系统工程师正盯著两块屏幕。
屋里除了他,还坐著两个学生。
靠窗那个二十出头,长著一张带著几分学生气的圆脸,原本正百无聊赖地转著手里的碳素笔。
听见推门声,他下意识地转过头。
在看清江临模样的一瞬间,他手里的笔啪地一声掉在桌面上,整个人腾地从椅子上弹了起来。
因为起得太猛,转椅向后滑出半米,重重磕在后方的铁皮文件柜上,发出一声闷响。
圆脸男生张大了嘴,喉结剧烈地滚动了一下,硬生生把一声即將脱口而出的臥槽咽回了肚子里。
这张脸,就在过去的半个月里,几乎席捲了全网各大论坛的学术版块,甚至跨界引起了广泛的社会关注。
办公室的角落里,另一个学生则显得沉静多了。
二十六七岁,瘦高个,抱著胳膊靠在机柜边,看到江临进来,淡淡点了下头,算是打过招呼。
倒是陈启明,反应非常迅速,也很是热情。
“来了来了,快坐!”
说著,他把椅子上一摞列印纸搬到地上,又指了指屋內的两个年轻人。
“这是我带的两个学生,乔越,研一,刚进组,跟我做程序综合。那个是裴礪,老博士了,在自己啃超优化。”
老博士这三个字一出口,江临的心里就犹如明镜一般,读懂了角落里那道不动声色的审视目光究竟来源於何处。
在计算机系统工程的行当里,一个老博士往往意味著无数个熬夜排查內存泄漏的通宵,意味著在汇编指令的汪洋与微架构特性的迷宫中摸爬滚打出了厚重的茧子。
你一个搞密铺搞纯数的,跨界跑到系统组来谈论底层性能优化的活计,这在任何一个实干派的工程师看来,都透著荒谬。
所以裴礪保持著一个资深系统工程师的严谨与警惕。
而他的姿態也已经明確表达了他的潜台词。
江氏砖的数学构造確实华丽无双,但这跟底层硬体优化,根本就是两码事。
理论的锋刃再利,也未必斩得断工程上盘根错节的乱麻。
“你这一趟过来,那是不是rank5、sort5,都看过了?”
陈启明搓著手,问得满脸期待之余,又有些担心江临直接拋出一句那是个毫无意义的外行问题,来终结这次跨界合作的可能。
“看了。”
江临没有多余的客套,找陈启明要来一部专门用来离线测试的那台机器。
“陈老师,我们先说结论。这条路径在理论和工程上都能走得通。但具体的走法,可能跟您一开始设想的不太一样。”
他握住滑鼠,点开u盘根目录,在一排规整的目录树中,双击打开了第一个文件夹。
verify_sort5_zero_one。
江临转过身,迎著陈启明的目光,问道:“陈老师,我想先確认一个基础问题。您团队现在跑的这版 sort5 代码,它的正確性是如何被確认的?你们怎么保证它在任何极端情况下都不会出错?”
陈启明微微一愣,似乎没料到江临切入问题的角度会如此基础。
推了推鼻樑上的眼镜,如实答道:“主要靠高强度压测。不是简单测五个互异整数排列,而是把真实管线里抽出来的五元组形態都灌进去。重复值,缺失哨兵,復权尺度异常,低流动性標的的零成交窗口,极端涨跌幅边界,还有溢出附近的整数值。流水线跑了几十亿组,没抓到错误。”
江临点头:“这些压测能覆盖大量工程脏样本,但它仍然是抽样。它能证明这几十亿次没错,不能证明排序网络拓扑本身没有错。”
陈启明脸上的笑微微一滯。
作为一个常年在系统底层游走的架构师,一个绝不敢把带有哪怕万分之一隱患的代码合进主干框架的严谨学者,江临的这句话,切中了他內心深处最敏感也是最无奈的那根神经。
工程上的穷举往往是不可能的,他们只能依靠庞大的概率来安慰自己。
“我换一种验证的做法。”
江临重新將视线投向屏幕,指尖在键盘上敲下回车键。
黑色终端窗口弹出,一段简短的脚本程序在光標的闪烁中开始运行。
“在排序网络理论里,有一个並不新鲜,但很少被系统工程师真正拿来当工程门卫用的结论——零一原理。”
“我们现在面对的是五个位置的排序问题。根据零一原理,每个位置只有两种可能:非0即1。”
“2的5次方,满打满算,一共也就三十二个状態。”
终端屏幕上,进度条几乎是在江临话音落下的同一瞬间便已跑满。
一个鲜艷的绿色提示符跃然屏上。
proved。
“陈老师,只要这三十二个边缘状態全部通过测试,您这段sort5的正確性,就不再是依靠测了几十亿次没翻车所建立起来的概率学底气。”
江临指著屏幕上那个绿色的字符,说。
“而是被严密的数学定理盖章认证了,它不仅过去没有错,而且被证明了永远不会翻车。”
“因为几十亿次的资源消耗与漫长等待,被降维压缩成了仅仅三十二次。而且这三十二次,提供的是一份不留任何死角的证明。”
办公室里的空气仿佛在这一瞬间凝滯了。
“这就三十二组了?”乔越从侧面凑近屏幕,声音因为难以置信而有些变调,“把几十亿组的测试规模直接压成三十二组,居然还能在逻辑上升格为证明?”
“这是底层定理赋予的保证,在抽象排序网络这一层,它不仅过去没错,而且可以证明不会因为输入组合翻车。当然,前提是比较器语义没有变形,输入域满足全序,后面的源码、编译器、机器码层面还要另验。”
江临解释说。
“只要0和1的输入序列全排对,那么对於任何满足全序关係的输入,这个排序网络拓扑都必定排对。但浮点里的nan、signed zero,或者比较器本身带副作用,就不在这条定理直接保护的范围內。”
陈启明注视著屏幕上那个绿色的proved,喉结不由自主地滚动了一下。
他做了一辈子的底层系统,在寄存器和指令集的泥潭里挣扎了无数个日夜,他比任何人都清楚,高置信度的测试与被数学证明的正確之间,究竟横亘著一条多么深邃的鸿沟。
隨机测试赋予工程师的是將代码推向生產环境的底气。
而眼前这看似轻描淡写的东西赋予的,是不可推翻的判决。
角落里的裴礪,一直抱著的胳膊,不知什么时候慢慢放了下来。
江临那句抽样不是证明,刺痛的並不仅仅是陈启明。
裴礪在这三年里,日復一日地构建著自己的超优化器。
他试图用算法在海量的指令组合中寻找最优解。
但那些由算法搜出来的、性能卓越的机器码,他十有八九是不敢直接上线部署的。
原因无他。
他无法从数学上证明那些千奇百怪的指令组合在逻辑上是绝对等价且正確的。
能用,是机器夜以继日跑测试跑出来的。
对不对,他的心里却始终悬著一根尖锐的刺,时刻担忧著在某一个罕见的微架构状態下,程序会全盘崩溃。
而此刻,眼前屏幕上那个静静发光的绿色proved,恰好就是拔出他心中那根刺的唯一解药。
办公室里陷入了长达十几秒的安静。
“你这个验证夹具是对任何一段不同结构的sort5代码,都能做到这样一锤定音的评判吗?”
陈启明再次开口时,声音变得有些发紧。
“任何一段由compare-exchange原语表达出来的sort5排序网络,都可以。”
江临的回答没有丝毫犹豫。
“但它证明的是抽象网络层的正確性,不是证明任意c代码、任意编译器、任意机器码都安全。输入域必须满足全序,比较器必须严格等价於 、clang、simd 指令、整数溢出、nan和未定义行为,那是下一层验证要处理的东西。”
江临没有在这个绿色的胜利上过多停留,他熟练地操作滑鼠,退回上一级目录,切到了第二个文件夹。
“正確性这块基石既然已经焊死,接下来,才是您在工程落地时真正觉得头疼的那一半,如何做到极致的快。”
陈启明的注意力一下子被吸引了过去。
屏幕上展现出来的,不再是简单的测试脚本,而是一套由江临亲手搭建的框架骨架。
对於普通人而言,那可能只是一堆枯燥的英文目录和层级结构。
但对於陈启明这种浸淫系统架构数十年的老手来说,仅仅是扫了一眼整个工程的目录依赖关係,他的瞳孔就不由自主地收缩了一下。
因为这套旨在寻找最优指令排列的超优化框架,被乾乾净净地切分成了三个相互独立却又严密咬合的层次。
“第一层,我称之为候选生成器。”
江临的滑鼠指针在一个名为generator的模块上悬停。
“它的唯一职责,就是根据规则不断向外吐出各种可能的排序网络拓扑结构。它负责添加比较器、执行初步的冗余剪枝、进行等价状態排重。这一层完全运作在抽象的数学空间里,跟代码最终要跑在什么机器上,没有半点关係。”
“第二层,就是我们刚才演示过的那个零一验证器,在这个系统里扮演著绝对冷酷的门卫角色。底层搜索算法吐出来的候选网络里,必定会存在大把跑得飞快,但逻辑其实是错误的垃圾结构。这一层不看任何性能指標,只看正確性,把那些偽劣產品全部当场枪毙,一个不漏。”
“至於第三层,也就是代价评估引擎。”江临的语速放缓,加重了语气,“它的任务是给那些存活下来的正確的候选网络打分,判断哪一个在实际运行中会更快。”
“而这一层,是整个框架中,唯一与具体的底层物理硬体產生绑定的部分。”
江临转过头,看著三人说。
“最关键的是,它是热插拔的。”
听到热插拔三个字,陈启明的呼吸频率,肉眼可见地变得重了一分。
“插拔,这怎么理解?”乔越的工程经验尚浅,大脑的运转速度没太跟上这跳跃的架构设计。
“意思是,如果我们的目標环境换了一台不同微架构的机器,我们只需要把这块后端的代价评估板子单独拆下来换掉。”
江临耐心地解释道。
“如果我们餵给评估引擎的是英特尔某代架构的延迟表和埠竞爭模型,它就按英特尔的脾气打分。如果我们换成arm架构的模型,它就按arm的吞吐上限去评估。而前面两层的搜索和验证逻辑,哪怕是一个標点符號的代码,都不需要修改。”
实验室里的空气仿佛被瞬间抽乾。
直到裴礪走过来。
“架构切开不难,难的是切开之后別漏血。”
他走到屏幕前,指著第二层验证器。
“你的零一验证器证明的是compare-exchange网络。可我的超优化器吐出来的东西,不一定老老实实长成比较器。它可能是cmov,可能是blend,可能是pminsd,也可能靠某种未定义行为省一条指令。”
“你怎么证明这些脏东西,真的等价於你抽象层里的compare-exchange?”
“所以零一验证器只是第一道门。”
江临拿起马克笔在一旁的白板上写下五行字。
抽象网络。
原语语义。
源码实现。
二进位等价。
微架构代价。
“你卡了三年的,不是一块铁板,而是五层东西混在一起,我们得先把它拆开。”
乔越在一旁张大了嘴巴,目光在裴礪和江临之间来回游移。
直到这一刻,他才具象地意识到,眼前这个总是带著平静神情的少年,绝对不仅仅是数学非常厉害那么简单。
他还拥有著对复杂工程进行降维解构的恐怖直觉。
“陈老师,在开始实际搜索之前,我必须先向您確认一个工程上的约束条件。”江临却没有沉浸在旁人的惊嘆中,而是迅速將话题拉回了最硬核的实操层面,“您团队需求的这个sort5,它的核心诉求是单发延迟敏感,还是批量吞吐敏感?”
陈启明闻言,微微一怔。
乔越几乎是下意识地接话道:“快不就是快吗,时间短了自然就快了,这还分……”
话刚说了一半,乔越自己就卡壳了,他隱约察觉到自己可能暴露出了底层的认知盲区。
“这两者在现代微架构上,截然不同。”
替乔越把话补全的,是裴礪,语气中带著复杂的感慨。
“如果你一次只排一组五个数字,要求这组数据从输入到输出的时间最短,那么你追求的是最低的延迟。但如果你面对的是海量数据,比如一天要排上亿组,你的目標是单位时间內能处理多少组数据。在现代 cpu 那些复杂的乱序执行和超標量流水线上,这两个目標往往是互斥的。”
裴礪深深地看了江临一眼。
这个问题,即使是在他们这个专门搞系统底层的课题组里,也鲜少有人在写代码前正经八百地提出来討论过。
所有人在面对优化这个词时,都默认了单一维度的快。
然后下意识去死抠比较器的绝对数量,去计较少写了一条汇编指令。
然而,在拥有多个alu 埠、复杂分支预测和重排序缓衝区的现代处理器上,最少的指令条数,並不意味著最高的吞吐量。
“我们要跑在批处理的场景里,看重的是极限吞吐。”陈启明没有任何犹豫,直接给出了定调。
“那就好办了。”
江临点了点头,將代价评估后端的配置文件打开,掛上了陈启明之前提供的机器a的硬体埠爭用模型数据。
“我把搜索目標明確设定为最大化吞吐量,然后,在这个特定模型下跑一个受限空间內的定向搜索。”
江临並没有启动全量搜索。
全量搜索整个指令状態空间,在没有算力集群支撑的情况下,是一个需要在算力废土里用几十年的时间去慢慢熬的浩大工程。
他仅仅是在一个被严密数学剪枝后的极窄范围內,让这套三层架构运转了不到五分钟。
工作站的散热风扇发出一阵短暂而急促的轰鸣后,屏幕上吐出了一排排新鲜出炉的候选结果。
“陈老师,您看一下。”
江临调出內置的对比工具,將两段代码並排展示。
“这里头排在第一梯队的,有一个排序网络,它的拓扑结构跟您团队耗费数月手工调优出来的那一版,几乎完全吻合。这个结果首先印证了一点,您团队在底层优化的手艺没有任何毛病。在人类能够凭藉直觉和经验触及的边界內,你们確实已经摸到了比较器数量最优的那一档基准线。”
听到这番话,陈启明紧绷的脸色终於舒缓了许多。
“但是,请看这一个。”江临的滑鼠向下滑动,点开了另一个评分稍高的候选方案,“这套方案的比较器数量同样是九个,一个都不比你们的多,也没有减少。可是它將这九个比较器的指令排布顺序,进行了一种看似反直觉的错位编排。这种错位,恰好避开了机器a在特定周期內的alu埠资源拥堵。”
“在机器a上,並且仅仅是在机器a的微架构下,它的极限吞吐量,比你们手工调优的那一版,快了不到百分之三。”
百分之三。
在日常应用的软体开发中,这是一个小到几乎不值一提,很容易就会被环境噪声轻易淹没的数字。
然而裴礪一言不发,在一旁的副屏上调出自己的终端环境,將江临搜索出的那段甚至没有加任何注释的候选代码拷贝了进去。
他亲自动手掛上编译器,开启最高级別的优化选项,连接上linux內置的perf性能分析工具,屏息凝神地连跑了三遍基准测试。
然后锁cpu affinity,关掉睿频波动,把governor固定到performance,预热缓存,perf stat-r50连跑五十组。
他盯著cycles、instructions、uops issued、branch-misses几列数字看了很久。
三十组之后,趋势还在。
五十组之后,置信区间没有压回原版。
那不到百分之三的差距,终於从噪声里站了出来。
“五分钟?”裴礪指著桌上的设备,声音有些发涩,“这就只是在普通的机器上跑了五分钟的结果?”
“嗯,五分钟不到,因为设定了严苛的剪枝条件。”江临平静地回答。
陈启明长长地嘆息了一声:“一个仅仅跑了五分钟的自动化受限搜索,就凭藉著针对性的硬体模型,在一个被我们翻来覆去研究过的用例上,硬生生地压过了我们整个团队手工雕琢了大半年的版本。”
一旁的乔越,此时已经完全失去了语言组织能力。
但裴礪毕竟是经歷过无数次架构失败的老兵。
短暂的震撼过后,他的眼神闪动了一下,似乎从这近乎神跡的展示中,敏锐地捕捉到了某个隱秘的破绽。
“等等,sort5终究还是太小了。五个元素的排列组合毕竟有限,靠著精妙的受限搜索,你確实可以在短时间內糊弄过去。”
裴礪紧紧盯著江临的眼睛,语速加快。
“可是,陈导真正想要铺开的,是把这套排序逻辑集成到我们整套底层数据处理內核里。我们需要一次性排八个数,十六个数,甚至更长。你比我清楚,一旦元素数量上升,底层网络的状態空间是呈指数级爆炸的。受限搜索的算力一旦撞上那面指数级的高墙,根本就顶不住。”
这是裴礪在系统架构层面,在这套优美框架上面所能想到的,可能面临的最后一次崩塌危机。
然而,江临没有显露出任何被拆穿的窘迫。
他反而十分赞同地点了点头,仿佛这一切早就在他的推演沙盘之中。
“你说得很准,所以刚才演示的这百分之三的性能提升,是机器a独占的。如果把同样的底层代码扔到微架构不同的机器b或机器c上,这个优势大概率会荡然无存,甚至可能出现负优化。”
江临顺著裴礪的话接了下去。
“这套三层架构真正的价值,並不在於此刻生成了某一段神奇的代码,而是在於那块隨时可以重定向的代价评估后端。”
江临面对著两位资深的系统研究者,语气依旧没有太多的起伏。
“此外,刚才裴师兄用perf实测出来的数字,在真实复杂的作业系统环境中,本身就是带有大量环境噪声的。缓存命中率波动,作业系统调度中断,都会导致同段代码一次跑得快,一次跑得慢。在未来的全量搜索中,代价模型必须进行反覆的模擬与抽样,取最稳健的统计学中位数,否则算法搜出来的最快,只是一座建立在沙滩上的堡垒。”
“当然,还有你刚才提到的一点,当 n 的规模变大时,状態空间的指数爆炸问题。”
江临看著裴礪,毫不避讳这个技术盲点。
“受限搜索和零一原理確实能轻鬆处理sort5,但绝对应付不了sort16这种量级的怪兽。要想让这套框架在你们庞大的全套微內核上跑出具有系统性顛覆的成果,我们需要更激进的剪枝算法,更贴近硅片物理特性的代价模型,以及前所未有的启发式搜索策略。从前端到后端,每一块板子,都得重新打磨。”
“这部分是块难啃的硬骨头,不可能一蹴而就,我需要一点时间去构建新的数学工具。”
江临用陈述客观事实的语气,为这场展示画上了句號。
裴礪微微张了张嘴,喉咙里发出低微的气音。
他原本准备好的,试图挽回底层工程师顏面的那一记杀招,原来早就在对方的预料之中。
物理边界的限制,性能测试的隨机噪声,以及那座似乎高不可攀的指数级运算大山。
江临一条都没有遗漏,坦诚得令人嘆服。
陈启明定定地看著站在办公桌前的江临。
这个仅仅十八岁的少年,在刚刚过去的半个小时里,用一个不容置疑的绿 proved和一段压榨出百分之三性能的机器码,差点让他这个干了大半辈子底层架构的老兵,对自己团队长久以来的手艺和信念產生动摇。
然而,在取得如此压倒性优势的时刻,对方非但没有趁势將话语权全部揽走,更没有大包大揽地吹嘘未来的前景。
相反,他一条一条如履薄冰般地將这套工具现存的边界,硬体底层的客观噪声,以及那座还未翻越的数学大山,冷静地向他们剖析得一清二楚。
在这个浮躁的学术圈里,懂得炫技的人如过江之鯽。
但懂得在光芒最盛的时刻,在最该收敛的地方稳稳收住锋芒的人,凤毛麟角。
“我明白了。”
陈启明重重地点了点头,脸上的神情前所未有地郑重与肃穆。
“这件事情的意义太大,不能只靠我们俩在这个闭塞的办公室里私下拍板。关於后续的署名权,专利归属,以及联合研发的流程,我们必须走最正规最严谨的合作通道。”
“嗯。”江临表示赞同,“陈老师这边可以主导走计算机学院的行政流程。我目前的临时访问人员身份掛靠在物理学院,归陆老师负责。该向院系报备的报备,该签的保密与合作协议,我们一步一步签清楚。”
他稍微停顿了一下,补充道:“我可以先把零一验证夹具的源码授权给您做內部科研验证。它只包含五输入排序网络的0-1 测试、日誌输出和接口模板,不包含候选生成器,也不包含完整mps搜索框架。授权范围,是否开源,是否用於论文和后续商业项目,我们写进协议。”
“至於那座由指数爆炸堆砌起来的大山?”
江临隨手关掉了工作站上的测试屏幕,拔下那个黑色的u盘,语气平静如水。
“给我一点时间。”
一直在旁边插不上话,憋得满脸通红的乔越,直到这一刻才像是大梦初醒般回过神来。
他急吼吼地往前猛凑了两步,掏出手机:“江师兄,咱们能加个微信吗,以后在框架编译上有不懂的地方,我能隨时请教您吗?”
裴礪在旁边看著自己师弟这副模样,忍不住轻嗤了一声。
隨后,他又默默转回身,將终端上那段由江临用五分钟搜出来的候选代码,再一次翻出来,盯著那几条打破常规的比较汇编指令,看第三遍。
陈启明的办公室在四楼,门虚掩著。
江临敲门进去时,这位髮际线后撤的系统工程师正盯著两块屏幕。
屋里除了他,还坐著两个学生。
靠窗那个二十出头,长著一张带著几分学生气的圆脸,原本正百无聊赖地转著手里的碳素笔。
听见推门声,他下意识地转过头。
在看清江临模样的一瞬间,他手里的笔啪地一声掉在桌面上,整个人腾地从椅子上弹了起来。
因为起得太猛,转椅向后滑出半米,重重磕在后方的铁皮文件柜上,发出一声闷响。
圆脸男生张大了嘴,喉结剧烈地滚动了一下,硬生生把一声即將脱口而出的臥槽咽回了肚子里。
这张脸,就在过去的半个月里,几乎席捲了全网各大论坛的学术版块,甚至跨界引起了广泛的社会关注。
办公室的角落里,另一个学生则显得沉静多了。
二十六七岁,瘦高个,抱著胳膊靠在机柜边,看到江临进来,淡淡点了下头,算是打过招呼。
倒是陈启明,反应非常迅速,也很是热情。
“来了来了,快坐!”
说著,他把椅子上一摞列印纸搬到地上,又指了指屋內的两个年轻人。
“这是我带的两个学生,乔越,研一,刚进组,跟我做程序综合。那个是裴礪,老博士了,在自己啃超优化。”
老博士这三个字一出口,江临的心里就犹如明镜一般,读懂了角落里那道不动声色的审视目光究竟来源於何处。
在计算机系统工程的行当里,一个老博士往往意味著无数个熬夜排查內存泄漏的通宵,意味著在汇编指令的汪洋与微架构特性的迷宫中摸爬滚打出了厚重的茧子。
你一个搞密铺搞纯数的,跨界跑到系统组来谈论底层性能优化的活计,这在任何一个实干派的工程师看来,都透著荒谬。
所以裴礪保持著一个资深系统工程师的严谨与警惕。
而他的姿態也已经明確表达了他的潜台词。
江氏砖的数学构造確实华丽无双,但这跟底层硬体优化,根本就是两码事。
理论的锋刃再利,也未必斩得断工程上盘根错节的乱麻。
“你这一趟过来,那是不是rank5、sort5,都看过了?”
陈启明搓著手,问得满脸期待之余,又有些担心江临直接拋出一句那是个毫无意义的外行问题,来终结这次跨界合作的可能。
“看了。”
江临没有多余的客套,找陈启明要来一部专门用来离线测试的那台机器。
“陈老师,我们先说结论。这条路径在理论和工程上都能走得通。但具体的走法,可能跟您一开始设想的不太一样。”
他握住滑鼠,点开u盘根目录,在一排规整的目录树中,双击打开了第一个文件夹。
verify_sort5_zero_one。
江临转过身,迎著陈启明的目光,问道:“陈老师,我想先確认一个基础问题。您团队现在跑的这版 sort5 代码,它的正確性是如何被確认的?你们怎么保证它在任何极端情况下都不会出错?”
陈启明微微一愣,似乎没料到江临切入问题的角度会如此基础。
推了推鼻樑上的眼镜,如实答道:“主要靠高强度压测。不是简单测五个互异整数排列,而是把真实管线里抽出来的五元组形態都灌进去。重复值,缺失哨兵,復权尺度异常,低流动性標的的零成交窗口,极端涨跌幅边界,还有溢出附近的整数值。流水线跑了几十亿组,没抓到错误。”
江临点头:“这些压测能覆盖大量工程脏样本,但它仍然是抽样。它能证明这几十亿次没错,不能证明排序网络拓扑本身没有错。”
陈启明脸上的笑微微一滯。
作为一个常年在系统底层游走的架构师,一个绝不敢把带有哪怕万分之一隱患的代码合进主干框架的严谨学者,江临的这句话,切中了他內心深处最敏感也是最无奈的那根神经。
工程上的穷举往往是不可能的,他们只能依靠庞大的概率来安慰自己。
“我换一种验证的做法。”
江临重新將视线投向屏幕,指尖在键盘上敲下回车键。
黑色终端窗口弹出,一段简短的脚本程序在光標的闪烁中开始运行。
“在排序网络理论里,有一个並不新鲜,但很少被系统工程师真正拿来当工程门卫用的结论——零一原理。”
“我们现在面对的是五个位置的排序问题。根据零一原理,每个位置只有两种可能:非0即1。”
“2的5次方,满打满算,一共也就三十二个状態。”
终端屏幕上,进度条几乎是在江临话音落下的同一瞬间便已跑满。
一个鲜艷的绿色提示符跃然屏上。
proved。
“陈老师,只要这三十二个边缘状態全部通过测试,您这段sort5的正確性,就不再是依靠测了几十亿次没翻车所建立起来的概率学底气。”
江临指著屏幕上那个绿色的字符,说。
“而是被严密的数学定理盖章认证了,它不仅过去没有错,而且被证明了永远不会翻车。”
“因为几十亿次的资源消耗与漫长等待,被降维压缩成了仅仅三十二次。而且这三十二次,提供的是一份不留任何死角的证明。”
办公室里的空气仿佛在这一瞬间凝滯了。
“这就三十二组了?”乔越从侧面凑近屏幕,声音因为难以置信而有些变调,“把几十亿组的测试规模直接压成三十二组,居然还能在逻辑上升格为证明?”
“这是底层定理赋予的保证,在抽象排序网络这一层,它不仅过去没错,而且可以证明不会因为输入组合翻车。当然,前提是比较器语义没有变形,输入域满足全序,后面的源码、编译器、机器码层面还要另验。”
江临解释说。
“只要0和1的输入序列全排对,那么对於任何满足全序关係的输入,这个排序网络拓扑都必定排对。但浮点里的nan、signed zero,或者比较器本身带副作用,就不在这条定理直接保护的范围內。”
陈启明注视著屏幕上那个绿色的proved,喉结不由自主地滚动了一下。
他做了一辈子的底层系统,在寄存器和指令集的泥潭里挣扎了无数个日夜,他比任何人都清楚,高置信度的测试与被数学证明的正確之间,究竟横亘著一条多么深邃的鸿沟。
隨机测试赋予工程师的是將代码推向生產环境的底气。
而眼前这看似轻描淡写的东西赋予的,是不可推翻的判决。
角落里的裴礪,一直抱著的胳膊,不知什么时候慢慢放了下来。
江临那句抽样不是证明,刺痛的並不仅仅是陈启明。
裴礪在这三年里,日復一日地构建著自己的超优化器。
他试图用算法在海量的指令组合中寻找最优解。
但那些由算法搜出来的、性能卓越的机器码,他十有八九是不敢直接上线部署的。
原因无他。
他无法从数学上证明那些千奇百怪的指令组合在逻辑上是绝对等价且正確的。
能用,是机器夜以继日跑测试跑出来的。
对不对,他的心里却始终悬著一根尖锐的刺,时刻担忧著在某一个罕见的微架构状態下,程序会全盘崩溃。
而此刻,眼前屏幕上那个静静发光的绿色proved,恰好就是拔出他心中那根刺的唯一解药。
办公室里陷入了长达十几秒的安静。
“你这个验证夹具是对任何一段不同结构的sort5代码,都能做到这样一锤定音的评判吗?”
陈启明再次开口时,声音变得有些发紧。
“任何一段由compare-exchange原语表达出来的sort5排序网络,都可以。”
江临的回答没有丝毫犹豫。
“但它证明的是抽象网络层的正確性,不是证明任意c代码、任意编译器、任意机器码都安全。输入域必须满足全序,比较器必须严格等价於 、clang、simd 指令、整数溢出、nan和未定义行为,那是下一层验证要处理的东西。”
江临没有在这个绿色的胜利上过多停留,他熟练地操作滑鼠,退回上一级目录,切到了第二个文件夹。
“正確性这块基石既然已经焊死,接下来,才是您在工程落地时真正觉得头疼的那一半,如何做到极致的快。”
陈启明的注意力一下子被吸引了过去。
屏幕上展现出来的,不再是简单的测试脚本,而是一套由江临亲手搭建的框架骨架。
对於普通人而言,那可能只是一堆枯燥的英文目录和层级结构。
但对於陈启明这种浸淫系统架构数十年的老手来说,仅仅是扫了一眼整个工程的目录依赖关係,他的瞳孔就不由自主地收缩了一下。
因为这套旨在寻找最优指令排列的超优化框架,被乾乾净净地切分成了三个相互独立却又严密咬合的层次。
“第一层,我称之为候选生成器。”
江临的滑鼠指针在一个名为generator的模块上悬停。
“它的唯一职责,就是根据规则不断向外吐出各种可能的排序网络拓扑结构。它负责添加比较器、执行初步的冗余剪枝、进行等价状態排重。这一层完全运作在抽象的数学空间里,跟代码最终要跑在什么机器上,没有半点关係。”
“第二层,就是我们刚才演示过的那个零一验证器,在这个系统里扮演著绝对冷酷的门卫角色。底层搜索算法吐出来的候选网络里,必定会存在大把跑得飞快,但逻辑其实是错误的垃圾结构。这一层不看任何性能指標,只看正確性,把那些偽劣產品全部当场枪毙,一个不漏。”
“至於第三层,也就是代价评估引擎。”江临的语速放缓,加重了语气,“它的任务是给那些存活下来的正確的候选网络打分,判断哪一个在实际运行中会更快。”
“而这一层,是整个框架中,唯一与具体的底层物理硬体產生绑定的部分。”
江临转过头,看著三人说。
“最关键的是,它是热插拔的。”
听到热插拔三个字,陈启明的呼吸频率,肉眼可见地变得重了一分。
“插拔,这怎么理解?”乔越的工程经验尚浅,大脑的运转速度没太跟上这跳跃的架构设计。
“意思是,如果我们的目標环境换了一台不同微架构的机器,我们只需要把这块后端的代价评估板子单独拆下来换掉。”
江临耐心地解释道。
“如果我们餵给评估引擎的是英特尔某代架构的延迟表和埠竞爭模型,它就按英特尔的脾气打分。如果我们换成arm架构的模型,它就按arm的吞吐上限去评估。而前面两层的搜索和验证逻辑,哪怕是一个標点符號的代码,都不需要修改。”
实验室里的空气仿佛被瞬间抽乾。
直到裴礪走过来。
“架构切开不难,难的是切开之后別漏血。”
他走到屏幕前,指著第二层验证器。
“你的零一验证器证明的是compare-exchange网络。可我的超优化器吐出来的东西,不一定老老实实长成比较器。它可能是cmov,可能是blend,可能是pminsd,也可能靠某种未定义行为省一条指令。”
“你怎么证明这些脏东西,真的等价於你抽象层里的compare-exchange?”
“所以零一验证器只是第一道门。”
江临拿起马克笔在一旁的白板上写下五行字。
抽象网络。
原语语义。
源码实现。
二进位等价。
微架构代价。
“你卡了三年的,不是一块铁板,而是五层东西混在一起,我们得先把它拆开。”
乔越在一旁张大了嘴巴,目光在裴礪和江临之间来回游移。
直到这一刻,他才具象地意识到,眼前这个总是带著平静神情的少年,绝对不仅仅是数学非常厉害那么简单。
他还拥有著对复杂工程进行降维解构的恐怖直觉。
“陈老师,在开始实际搜索之前,我必须先向您確认一个工程上的约束条件。”江临却没有沉浸在旁人的惊嘆中,而是迅速將话题拉回了最硬核的实操层面,“您团队需求的这个sort5,它的核心诉求是单发延迟敏感,还是批量吞吐敏感?”
陈启明闻言,微微一怔。
乔越几乎是下意识地接话道:“快不就是快吗,时间短了自然就快了,这还分……”
话刚说了一半,乔越自己就卡壳了,他隱约察觉到自己可能暴露出了底层的认知盲区。
“这两者在现代微架构上,截然不同。”
替乔越把话补全的,是裴礪,语气中带著复杂的感慨。
“如果你一次只排一组五个数字,要求这组数据从输入到输出的时间最短,那么你追求的是最低的延迟。但如果你面对的是海量数据,比如一天要排上亿组,你的目標是单位时间內能处理多少组数据。在现代 cpu 那些复杂的乱序执行和超標量流水线上,这两个目標往往是互斥的。”
裴礪深深地看了江临一眼。
这个问题,即使是在他们这个专门搞系统底层的课题组里,也鲜少有人在写代码前正经八百地提出来討论过。
所有人在面对优化这个词时,都默认了单一维度的快。
然后下意识去死抠比较器的绝对数量,去计较少写了一条汇编指令。
然而,在拥有多个alu 埠、复杂分支预测和重排序缓衝区的现代处理器上,最少的指令条数,並不意味著最高的吞吐量。
“我们要跑在批处理的场景里,看重的是极限吞吐。”陈启明没有任何犹豫,直接给出了定调。
“那就好办了。”
江临点了点头,將代价评估后端的配置文件打开,掛上了陈启明之前提供的机器a的硬体埠爭用模型数据。
“我把搜索目標明確设定为最大化吞吐量,然后,在这个特定模型下跑一个受限空间內的定向搜索。”
江临並没有启动全量搜索。
全量搜索整个指令状態空间,在没有算力集群支撑的情况下,是一个需要在算力废土里用几十年的时间去慢慢熬的浩大工程。
他仅仅是在一个被严密数学剪枝后的极窄范围內,让这套三层架构运转了不到五分钟。
工作站的散热风扇发出一阵短暂而急促的轰鸣后,屏幕上吐出了一排排新鲜出炉的候选结果。
“陈老师,您看一下。”
江临调出內置的对比工具,將两段代码並排展示。
“这里头排在第一梯队的,有一个排序网络,它的拓扑结构跟您团队耗费数月手工调优出来的那一版,几乎完全吻合。这个结果首先印证了一点,您团队在底层优化的手艺没有任何毛病。在人类能够凭藉直觉和经验触及的边界內,你们確实已经摸到了比较器数量最优的那一档基准线。”
听到这番话,陈启明紧绷的脸色终於舒缓了许多。
“但是,请看这一个。”江临的滑鼠向下滑动,点开了另一个评分稍高的候选方案,“这套方案的比较器数量同样是九个,一个都不比你们的多,也没有减少。可是它將这九个比较器的指令排布顺序,进行了一种看似反直觉的错位编排。这种错位,恰好避开了机器a在特定周期內的alu埠资源拥堵。”
“在机器a上,並且仅仅是在机器a的微架构下,它的极限吞吐量,比你们手工调优的那一版,快了不到百分之三。”
百分之三。
在日常应用的软体开发中,这是一个小到几乎不值一提,很容易就会被环境噪声轻易淹没的数字。
然而裴礪一言不发,在一旁的副屏上调出自己的终端环境,將江临搜索出的那段甚至没有加任何注释的候选代码拷贝了进去。
他亲自动手掛上编译器,开启最高级別的优化选项,连接上linux內置的perf性能分析工具,屏息凝神地连跑了三遍基准测试。
然后锁cpu affinity,关掉睿频波动,把governor固定到performance,预热缓存,perf stat-r50连跑五十组。
他盯著cycles、instructions、uops issued、branch-misses几列数字看了很久。
三十组之后,趋势还在。
五十组之后,置信区间没有压回原版。
那不到百分之三的差距,终於从噪声里站了出来。
“五分钟?”裴礪指著桌上的设备,声音有些发涩,“这就只是在普通的机器上跑了五分钟的结果?”
“嗯,五分钟不到,因为设定了严苛的剪枝条件。”江临平静地回答。
陈启明长长地嘆息了一声:“一个仅仅跑了五分钟的自动化受限搜索,就凭藉著针对性的硬体模型,在一个被我们翻来覆去研究过的用例上,硬生生地压过了我们整个团队手工雕琢了大半年的版本。”
一旁的乔越,此时已经完全失去了语言组织能力。
但裴礪毕竟是经歷过无数次架构失败的老兵。
短暂的震撼过后,他的眼神闪动了一下,似乎从这近乎神跡的展示中,敏锐地捕捉到了某个隱秘的破绽。
“等等,sort5终究还是太小了。五个元素的排列组合毕竟有限,靠著精妙的受限搜索,你確实可以在短时间內糊弄过去。”
裴礪紧紧盯著江临的眼睛,语速加快。
“可是,陈导真正想要铺开的,是把这套排序逻辑集成到我们整套底层数据处理內核里。我们需要一次性排八个数,十六个数,甚至更长。你比我清楚,一旦元素数量上升,底层网络的状態空间是呈指数级爆炸的。受限搜索的算力一旦撞上那面指数级的高墙,根本就顶不住。”
这是裴礪在系统架构层面,在这套优美框架上面所能想到的,可能面临的最后一次崩塌危机。
然而,江临没有显露出任何被拆穿的窘迫。
他反而十分赞同地点了点头,仿佛这一切早就在他的推演沙盘之中。
“你说得很准,所以刚才演示的这百分之三的性能提升,是机器a独占的。如果把同样的底层代码扔到微架构不同的机器b或机器c上,这个优势大概率会荡然无存,甚至可能出现负优化。”
江临顺著裴礪的话接了下去。
“这套三层架构真正的价值,並不在於此刻生成了某一段神奇的代码,而是在於那块隨时可以重定向的代价评估后端。”
江临面对著两位资深的系统研究者,语气依旧没有太多的起伏。
“此外,刚才裴师兄用perf实测出来的数字,在真实复杂的作业系统环境中,本身就是带有大量环境噪声的。缓存命中率波动,作业系统调度中断,都会导致同段代码一次跑得快,一次跑得慢。在未来的全量搜索中,代价模型必须进行反覆的模擬与抽样,取最稳健的统计学中位数,否则算法搜出来的最快,只是一座建立在沙滩上的堡垒。”
“当然,还有你刚才提到的一点,当 n 的规模变大时,状態空间的指数爆炸问题。”
江临看著裴礪,毫不避讳这个技术盲点。
“受限搜索和零一原理確实能轻鬆处理sort5,但绝对应付不了sort16这种量级的怪兽。要想让这套框架在你们庞大的全套微內核上跑出具有系统性顛覆的成果,我们需要更激进的剪枝算法,更贴近硅片物理特性的代价模型,以及前所未有的启发式搜索策略。从前端到后端,每一块板子,都得重新打磨。”
“这部分是块难啃的硬骨头,不可能一蹴而就,我需要一点时间去构建新的数学工具。”
江临用陈述客观事实的语气,为这场展示画上了句號。
裴礪微微张了张嘴,喉咙里发出低微的气音。
他原本准备好的,试图挽回底层工程师顏面的那一记杀招,原来早就在对方的预料之中。
物理边界的限制,性能测试的隨机噪声,以及那座似乎高不可攀的指数级运算大山。
江临一条都没有遗漏,坦诚得令人嘆服。
陈启明定定地看著站在办公桌前的江临。
这个仅仅十八岁的少年,在刚刚过去的半个小时里,用一个不容置疑的绿 proved和一段压榨出百分之三性能的机器码,差点让他这个干了大半辈子底层架构的老兵,对自己团队长久以来的手艺和信念產生动摇。
然而,在取得如此压倒性优势的时刻,对方非但没有趁势將话语权全部揽走,更没有大包大揽地吹嘘未来的前景。
相反,他一条一条如履薄冰般地將这套工具现存的边界,硬体底层的客观噪声,以及那座还未翻越的数学大山,冷静地向他们剖析得一清二楚。
在这个浮躁的学术圈里,懂得炫技的人如过江之鯽。
但懂得在光芒最盛的时刻,在最该收敛的地方稳稳收住锋芒的人,凤毛麟角。
“我明白了。”
陈启明重重地点了点头,脸上的神情前所未有地郑重与肃穆。
“这件事情的意义太大,不能只靠我们俩在这个闭塞的办公室里私下拍板。关於后续的署名权,专利归属,以及联合研发的流程,我们必须走最正规最严谨的合作通道。”
“嗯。”江临表示赞同,“陈老师这边可以主导走计算机学院的行政流程。我目前的临时访问人员身份掛靠在物理学院,归陆老师负责。该向院系报备的报备,该签的保密与合作协议,我们一步一步签清楚。”
他稍微停顿了一下,补充道:“我可以先把零一验证夹具的源码授权给您做內部科研验证。它只包含五输入排序网络的0-1 测试、日誌输出和接口模板,不包含候选生成器,也不包含完整mps搜索框架。授权范围,是否开源,是否用於论文和后续商业项目,我们写进协议。”
“至於那座由指数爆炸堆砌起来的大山?”
江临隨手关掉了工作站上的测试屏幕,拔下那个黑色的u盘,语气平静如水。
“给我一点时间。”
一直在旁边插不上话,憋得满脸通红的乔越,直到这一刻才像是大梦初醒般回过神来。
他急吼吼地往前猛凑了两步,掏出手机:“江师兄,咱们能加个微信吗,以后在框架编译上有不懂的地方,我能隨时请教您吗?”
裴礪在旁边看著自己师弟这副模样,忍不住轻嗤了一声。
隨后,他又默默转回身,將终端上那段由江临用五分钟搜出来的候选代码,再一次翻出来,盯著那几条打破常规的比较汇编指令,看第三遍。