这个学霸疑似巨额知识来源不明 - 第118章 大杀器

上一章 目录 下一章
    第二张图,是mps-kernelv0.2的工具链图。
    关於软体与底层微內核的博弈,是从废土第五年正式打响的。
    江临没有再碰sort5。
    那个问题已经在陈启明的办公室里演示过。
    办公室那半个小时的惊艷,解决的仅仅是学术界最基础的问题:“这条路在理论上能不能走通?”
    第九次废土要解决的,是:“这套系统,到底能不能放大?”
    现实总是毫不留情。
    第一版试图规模化的搜索器,在第六年迎来了轰轰烈烈的全面崩溃。
    系统崩溃的原因,並非零一验证器证明速度太慢,也不是他建立的硬体代价模型不够精確。
    而是候选指令还没有来得及排队进入验证器,前端的生成器就已经因为组合爆炸,將状態空间膨胀到了一个工作站內存根本无法承受的黑洞级別。
    sort8还能靠著压榨交换文件的i/o勉强跑完。
    可一旦触及median9,状態树就开始扭曲变形。
    等他试著展开一个哪怕附加了限制条件的top-k小內核时,生成器吐出的垃圾候选代码在几个小时內把几块tb级企业硬碟彻底写满,交换分区被打穿,日誌系统开始报错,最终进程被oom killer杀掉,工作站在持续i/o雪崩中卡死。
    这次失败,不仅没有让江临沮丧,反而让他感到兴奋。
    裴礪的判断是精准的。
    真正挡在mps-kernel前面的,不是某一段晦涩难懂的代码,而是不可阻挡的数学规律。
    状態空间爆炸。
    第八年,江临果断在代码库中按下刪除键,將枚举指令序列这条传统的暴力穷举旧路线抹除。
    搜索的核心对象,被他从具体的代码改成了抽象的语义等价类。
    不再让生成器像个傻子一样去枚举每一种可能的寄存器分配或指令顺序。
    而是引入等价图,也就是e-graph式的表示方法,再叠加规范化哈希、对称归约和支配关係剪枝。
    在同一组数学输入输出语义下,那些能够被证明只差在寄存器命名、无依赖指令重排、冗余中间量或局部等价重写上的候选序列,会被摺叠到同一个状態节点里。
    生成器吐出的不再是一行行c代码或汇编。
    而是一张巨大的状態图。
    每一个节点,不再代表一段具体代码,而代表一组输入输出语义相同、並且已经被规范化的中间状態。
    每一条边,才真正对应著一次实质性的,可落地的底层原语变换或机器指令变换。
    搜索空间,在废土的第八年,第一次被从物理意义上狠狠压了下来。
    第十一年,为了进一步对抗时间的消耗,江临在系统底层加入了证据缓存机制。
    过去,每一次搜索遇到相似的结构,系统都要重新调用z3求解器去证明一次。
    现在,所有被验证过的等价状態,其证明过程会被序列化后永久存储。
    局部原语的证明可以像搭积木一样被復用。
    底层子网络的正確性证明,可以直接作为更大规模网络组成部分的前置证据。
    mps-kernel开始发生蜕变。
    它不再像一个每次都从头推到尾的笨拙搜索器,开始像一台拥有记忆,会自动积累中间定理的智能证明机器。
    第十三年,江临將庞大而混沌的证明系统挥刀斩断,清晰地拆分成三层。
    第一层,抽象原语层。
    排序、选择、求秩、中位数、top-k等微內核,首先在纯粹的数学语义上被定义得滴水不漏。
    输入的数据分布是什么?
    输出的排序稳定性要求是什么?
    是否允许数组中存在重复值?
    算法边界是否存在哨兵机制?
    最重要的是,整数比较、浮点运算中的非数字以及带符號零的特殊值处理,必须在这一层就明確分流。
    第二层,源码与中间表示层。
    到了这一层,无论是c代码、llvm ir,还是手工编写的intrinsic內联函数,都绝对不允许用一句轻飘飘的它看起来等价糊弄过去。
    c语言標准中恶名昭彰的未定义行为、有符號整数溢出的未定义行为、无符號整数的模迴绕语义、不同宽度整数转换时的截断规则、浮点比较中的nan传播、正负零排序、捨入模式、异常標誌,以及不同平台对denormal数的处理,全都要在这一层被数学逻辑无情地拆开揉碎,確保ir在被声明的语义子集內,与上层抽象语义保持一致。
    第三层,机器码层。
    这是最贴近金属的领域。
    最终生成的二进位指令序列,必须能够逆向回连到上层语义。
    无论是高效率的条件传送cmov、向量混合blend,还是用於打包求最小值的pminsd,甚至是几条为了避开流水线冒险而看似绕远路的逻辑指令组合,都必须由系统自动给出严格的逻辑等价证明。
    裴礪在办公室里那个关於规模化的刁钻问题,直到这一年,才在废土的黄沙中,得到了江临用代码堆砌出的工程回答。
    零一验证器从来都不是终点,它不过是一条通向微內核工业化的坚固证明链的第一环。
    第十九年,江临迎来了另一个巨大的挑战。
    代价评估后端重写。
    旧版本的代价模型天真得可笑,它只会根据静態的指令周期给出一个冰冷的排名。
    第一名,理论上看起来最快。
    第二名,看起来慢一点。
    但在真实的冯·诺依曼架构机器上,硅片不是乾净的数学纸面,它充满了物理世界的狂躁与不確定。
    l1/l2缓存命中率会隨著上下文波动。
    作业系统的线程调度会隨时引发中断。
    cpu的睿频机制会因为热量的累积而动態改变工作频率。
    不同的处理批量大小会彻底改变流水线的吞吐瓶颈。
    同样一段看似完美的指令,在机器a上巧妙地避开了执行埠的拥堵,到了机器b上,可能正好一头撞进分支预测器失误的惩罚陷阱中。
    所以,江临彻底推翻了旧后端。
    新后端不再输出苍白无力的单点分数。
    对於每一个候选的微內核,它输出的是三组立体的评估。
    理论代价: 基於微架构模型的纯静態计算。
    实测分布: 候选微內核必须在多种缓存冷热状態、多种批量长度、多种代码预热方式、甚至多种强制锁频条件下,进行数万次的重复测试,绘製出执行时间的概率密度分布图。
    鲁棒性评分: 衡量代码在恶劣硬体噪声下的抗干扰能力。
    最终被mps-kernel保留下来的,绝对不是某一次特定benchmark跑分中侥倖跑出的冠军。
    而是在排除了所有硬体环境噪声窗口之后,其性能底线依然能够稳定领先其他方案的铁血候选者。
    第二十四年,工作站风扇发出一阵持续的嘶吼,mps-kernel终於生成了第一批真正意义上的证据卡。
    每一张证据卡,都对应著一个经过千锤百炼的微內核包。
    这不再是一段冷冰冰的代码,而是一段代码无可辩驳的履歷档案。
    【kernel_id: median9_zen3_opt】
    【abstract_semantics: strict weak ordering,nan统一下沉,+0/-0按声明规则归一】
    【source_ir_proof: 无ub溢出,ir同构验证通过】
    【binary_equivalence: 在声明语义域內,smt反例搜索unsat】
    【isa: x86-64, avx2扩展】
    【microarchitecture_assumption: l1d热缓存路径;另附冷缓存降级曲线】
    【cost_model: 埠竞爭延时分析报告】
    【benchmark_distribution: 延迟分布、p50/p95/p99与长尾样本图】
    【robustness_score: 99.9%样本窗口內性能下界稳定性】
    【fallback_path: 当avx失效时的標量降级回退路径】
    第三十一年,江临將整个庞大的工具链推进到了v0.2版本。
    它已经能够极其稳定地处理一批远远跨越了sort5边界的小內核:sort8、rank8、median9,以及在特定內存对齐受限场景下的top-k问题。
    这些东西在动輒数百万行的现代软体工程中依然不算庞大,但它们足够跨越办公室那场演示的边界。
    它向世界证明了,mps-kernel绝不是只能在sort5这种玩具问题上展示漂亮数学结构的盆景。
    它已经具备了沿著语义等价类搜索,三层逻辑证明链和多维度鲁棒性代价模型,向著真正自动化生產工业级微內核工具进军的潜力。
    废土第三十五年,江临画下了第二张图的定稿。
    標题:【mps-kernel v0.2:语义等价类搜索—证明携带链—鲁棒代价后端】
    这將会是一个大杀器。

添加书签

搜索的提交是按输入法界面上的确定/提交/前进键的
上一章 目录 下一章