返回第一百一十八章 大杀器  这个学霸疑似巨额知识来源不明首页

关灯 护眼     字体:

上一章 目录 下一页

    第二张图,是MPS-Kernelv0.2的工具链图。

    关于软件与底层微内核的博弈,是从废土第五年正式打响的。

    江临没有再碰sort5。

    那个问题已经在陈启明的办公室里演示过。

    办公室那半个小时的惊艳,解决的仅仅是学术界最基础的问题:“这条路在理论上能不能走通?”

    第九次废土要解决的,是:“这套系统,到底能不能放大?”

    现实总是毫不留情。

    第一版试图规模化的搜索器,在第六年迎来了轰轰烈烈的全面崩溃。

    系统崩溃的原因,并非零一验证器证明速度太慢,也不是他创建的硬件代价模型不够精确。

    而是候选指令还没有来得及排队进入验证器,前端的生成器就已经因为组合爆炸,将状态空间膨胀到了一个工作站内存根本无法承受的黑洞级别。

    可一旦触及dian9,状态树就开始扭曲变形。

    等他试着展开一个哪怕附加了限制条件的top-k小内核时,生成器吐出的垃圾候选代码在几个小时内把几块TB级企业硬盘彻底写满,交换分区被打穿,日志系统开始报错,最终进程被

    这次失败,不仅没有让江临沮丧,反而让他感到兴奋。

    裴砺的判断是精准的。

    真正挡在MPS-Kernel前面的,不是某一段晦涩难懂的代码,而是不可阻挡的数学规律。

    状态空间爆炸。

    第八年,江临果断在代码库中按下删除键,将枚举指令串行这条传统的暴力穷举旧路线抹除。

    搜索的内核对象,被他从具体的代码改成了抽象的语义等价类。

    不再让生成器象个傻子一样去枚举每一种可能的寄存器分配或指令顺序。

    而是引入等价图,也就是e-graph式的表示方法,再叠加规范化哈希、对称归约和支配关系剪枝。

    在同一组数学输入输出语义下,那些能够被证明只差在寄存器命名、无依赖指令重排、冗馀中间量或局部等价重写上的候选串行,会被折叠到同一个状态节点里。

    生成器吐出的不再是一行行C代码或汇编。

    而是一张巨大的状态图。

    每一个节点,不再代表一段具体代码,而代表一组输入输出语义相同、并且已经被规范化的中间状态。

    每一条边,才真正映射着一次实质性的,可落地的底层原语变换或机器指令变换。

    搜索空间,在废土的第八年,第一次被从物理意义上狠狠压了下来。

    第十一年,为了进一步对抗时间的消耗,江临在系统底层添加了证据缓存机制。

    过去,每一次搜索遇到相似的结构,系统都要重新调用Z3求解器去证明一次。

    现在,所有被验证过的等价状态,其证明过程会被串行化后永久存储。

    局部原语的证明可以象搭积木一样被复用。

    底层子网络的正确性证明,可以直接作为更大规模网络组成部分的前置证据。

    MPS-Kernel开始发生蜕变。

    它不再象一个每次都从头推到尾的笨拙搜索器,开始象一台拥有记忆,会自动积累中间定理的智能证明机器。

    第十三年,江临将庞大而混沌的证明系统挥刀斩断,清淅地拆分成三层。

    第一层,抽象原语层。

    排序、选择、求秩、中位数、top-k等微内核,首先在纯粹的数学语义上被定义得滴水不漏。

    输入的数据分布是什么?

    输出的排序稳定性要求是什么?

    是否允许数组中存在重复值?

    算法边界是否存在哨兵机制?

    最重要的是,整数比较、浮点运算中的非数字以及带符号零的特殊值处理,必须在这一层就明确分流。

    第二层,源码与中间表示层。

    到了这一层,无论是C代码、LLVM IR,还是手工编写的Intrinsic内联函数,都绝对不允许用一句轻飘飘的它看起来等价糊弄过去。

    C语言标准中恶名昭彰的未定义行为、有符号整数溢出的未定义行为、无符号整数的模回绕语义、不同宽度整数转换时的截断规则、浮点比较中的NaN传播、正负零排序、舍入模式、异常标志,以及不同平台对denorl数的处理,全都要在这一层被数学逻辑无情地拆开揉碎,确保IR在被声明的语义子集内,与上层抽象语义保持一致。

    第三层,机器码层。

    这是最贴近金属的领域。

    最终生成的二进位指令串行,必须能够逆向回连到上层语义。

    无论是高效率的条件传送cv、矢量
本章未完,请点击下一页继续阅读>>

『加入书签,方便阅读』

上一章 目录 下一页