算法吐出来的候选网络里,必定会存在大把跑得飞快,但逻辑其实是错误的垃圾结构。这一层不看任何性能指标,只看正确性,把那些伪劣产品全部当场枪毙,一个不漏。”
“至于第三层,也就是代价评估引擎。”江临的语速放缓,加重了语气,“它的任务是给那些存活下来的正确的候选网络打分,判断哪一个在实际运行中会更快。”
“而这一层,是整个框架中,唯一与具体的底层物理硬件产生绑定的部分。”
江临转过头,看着三人说。
“最关键的是,它是热插拔的。”
听到热插拔三个字,陈启明的呼吸频率,肉眼可见地变得重了一分。
“插拔,这怎么理解?”乔越的工程经验尚浅,大脑的运转速度没太跟上这跳跃的架构设计。
“意思是,如果我们的目标环境换了一台不同微架构的机器,我们只需要把这块后端的代价评估板子单独拆下来换掉。”
江临耐心地解释道。
“如果我们喂给评估引擎的是英特尔某代架构的延迟表和端口竞争模型,它就按英特尔的脾气打分。如果我们换成AR构的模型,它就按AR吞吐上限去评估。而前面两层的搜索和验证逻辑,哪怕是一个标点符号的代码,都不需要修改。”
实验室里的空气仿佛被瞬间抽干。
直到裴砺走过来。
“架构切开不难,难的是切开之后别漏血。”
他走到屏幕前,指着第二层验证器。
“你的零一验证器证明的是pare-exchange网络。可我的超优化器吐出来的东西,不一定老老实实长成比较器。它可能是cv,可能是blend,可能是pnsd,也可能靠某种未定义行为省一条指令。”
“你怎么证明这些脏东西,真的等价于你抽象层里的pare-exchange?”
“所以零一验证器只是第一道门。”
江临拿起马克笔在一旁的白板上写下五行字。
抽象网络。
原语语义。
源码实现。
二进制等价。
微架构代价。
“你卡了三年的,不是一块铁板,而是五层东西混在一起,我们得先把它拆开。”
乔越在一旁张大了嘴巴,目光在裴砺和江临之间来回游移。
直到这一刻,他才具象地意识到,眼前这个总是带着平静神情的少年,绝对不仅仅是数学非常厉害那么简单。
他还拥有着对复杂工程进行降维解构的恐怖直觉。
“陈老师,在开始实际搜索之前,我必须先向您确认一个工程上的约束条件。”江临却没有沉浸在旁人的惊叹中,而是迅速将话题拉回了最硬核的实操层面,“您团队需求的这个sort5,它的核心诉求是单发延迟敏感,还是批量吞吐敏感?”
陈启明闻言,微微一怔。
乔越几乎是下意识地接话道:“快不就是快吗,时间短了自然就快了,这还分……”
话刚说了一半,乔越自己就卡壳了,他隐约察觉到自己可能暴露出了底层的认知盲区。
“这两者在现代微架构上,截然不同。”
替乔越把话补全的,是裴砺,语气中带着复杂的感慨。
“如果你一次只排一组五个数字,要求这组数据从输入到输出的时间最短,那么你追求的是最低的延迟。但如果你面对的是海量数据,比如一天要排上亿组,你的目标是单位时间内能处理多少组数据。在现代 cpU 那些复杂的乱序执行和超标量流水线上,这两个目标往往是互斥的。”
裴砺深深地看了江临一眼。
这个问题,即使是在他们这个专门搞系统底层的课题组里,也鲜少有人在写代码前正经八百地提出来讨论过。
所有人在面对优化这个词时,都默认了单一维度的快。
然后下意识去死抠比较器的绝对数量,去计较少写了一条汇编指令。
然而,在拥有多个ALU 端口、复杂分支预测和重排序缓冲区的现代处理器上,最少的指令条数,并不意味着最高的吞吐量。
“我们要跑在批处理的场景里,看重的是极限吞吐。”陈启明没有任何犹豫,直接给出了定调。
“那就好办了。”
江临点了点头,将代价评估后端的配置文件打开,挂上了陈启明之前提供的机器A的硬件端口争用模型数据。
“我把搜索目标明确设定为最大化吞吐量,然后,在这个特定模型下跑一个受限空间内的定向搜索。”
江临并没有启动全量搜索。
全量搜索整个指令状态空间,在没有算力集群支撑的情况下,是一个需要在算力废土里用几十年的时间去慢慢熬的浩大工程。
他仅仅是在一个被严密数学剪枝后的极窄范围内,让这套三层架构运转了不到五分钟。
工作站的散热风扇发出一阵短暂而急促的轰鸣后,屏幕上吐出了一排排新鲜出炉的候选结果。
“陈老师,您看一下。”
江临调出内置的对比工具,将两段代码并排展示。
“这里头排在第一梯队的,有一个排序网络,它的拓扑结构跟您团队耗费数月手工调优出来的那一版,几乎完全吻合。这个结果首先印证了一点,您团队在底层优化的手艺没有任何毛病。在人类能够凭借直觉和经验触及的边界内,你们确实已经摸到了比较器数量最优的那一档基准线。”
听到这番话,陈启明紧绷的脸色终于舒缓了许多。
“但是,请看这一个。”江临的鼠标向下滑动,点开了另一个评分稍高的候选方案,“这套方案的比较器数量同样是九个,一个都不比你们的多,也没有减少。可是它将这九个比较器的指令排布顺序,进行了一种看似反直觉的错位编排。这种错位,恰好避开了机器A在特定周期内的ALU端口资源拥堵。”
“在机器A上,并且仅仅是在机器A的微架构下,它的极限吞吐量,比你们手工调优的那一版,快了不到百分之三。”
百分之三。
在日常应用的软件开发中,这是一个小到几乎不值一提,很容易就会被环境噪声轻易淹没的数字。
然而裴砺一言不发,在一旁的副屏上调出自己的终端环境,将江临搜索出的那段甚至没有加任何注释的候选代码拷贝了进去。
他亲自动手挂上编译器,开启最高级别的优化选项,连接上Linux内置的perf性能分析工具,屏息凝神地连跑了三遍基准测试。
然后锁cpU affinity,关掉睿频波动,把governor固定到perfornce,预热缓存,perf stat-r50连跑五十组。
他盯着cycles、instructions、uops issued、branch-sses几列数字看了很久。
三十组之后,趋势还在。
五十组之后,置信区间没有压回原版。
那不到百分之三的差距,终于从噪声里站了出来。
“五分钟?”裴砺指着桌上的设备,声音有些发涩,“这就只是在普通的机器上跑了五分钟的结果?”
“嗯,五分钟不到,因为设定了严苛的剪枝条件。”江临平静地回答。
陈启明长长地叹息了一声:“一个仅仅跑了五分钟的自动化受限搜索,就凭借着针对性的硬件模型,在一个被我们翻来覆去研究过的用例上,硬生生地压过了我们整个团队手工雕琢了大半年的版本。”
一旁的乔越,此时已经完全失去了语言组织能力。
但裴砺毕竟是经历过无数次架构失败的老兵。
短暂的震撼过后,他的眼神闪动了一下,似乎从这近乎神迹的展示中,敏锐地捕捉到了某个隐秘的破绽。
“等等,sort5终究还是太小了。五个元素的排列组合毕竟有限,靠着精妙的受限搜索,你确实可以在短时间内糊弄过去。”
裴砺紧紧盯着江临的眼睛,语速加快。
“可是,陈导真正想要铺开的,是把这套排序逻辑集成到我们整套底层数据处理内核里。我们需要一次性排八个数,十六个数,甚至更长。你比我清楚,一旦元素数量上升,底层网络的状态空间是呈指数级爆炸的。受限搜索的算力一旦撞上那面指数级的高墙,根本就顶不住。”
这是裴砺在系统架构层面,在这套优美框架上面所能想到的,可能面临的最后一次崩塌危机。
然而,江临没有显露出任何被拆穿的窘迫。
他反而十分赞同地点了点头,仿佛这一切早就在他的推演沙盘之中。
“你说得很准,所以刚才演示的这百分之三的性能提升,是机器A独占的。如果把同样的底层代码扔到微架构不同的机器b或机器c上,这个优势大概率会荡然无存,甚至可能出现负优化。”
江临顺着裴砺的话接了下去。
“这套三层架构真正的价值,并不在于此刻生成了某一段神奇的代码,而是在于那块随时可以重定向的代价评估后端。”
江临面对着两位资深的系统研究者,语气依旧没有太多的起伏。
“此外,刚才裴师兄用perf实测出来的数字,在真实复杂的操作系统环境中,本身就是带有大量环境噪声的。缓存命中率波动,操作系统调度中断,都会导致同段代码一次跑得快,一次跑得慢。在未来的全量搜索中,代价模型必须进行反复的模拟与抽样,取最稳健的统计学中位数,否则算法搜出来的最快,只是一座建立在沙滩上的堡垒。”
“当然,还有你刚才提到的一点,当 N 的规模变大时,状态空间的指数爆炸问题。”
江临看着裴砺,毫不避
“至于第三层,也就是代价评估引擎。”江临的语速放缓,加重了语气,“它的任务是给那些存活下来的正确的候选网络打分,判断哪一个在实际运行中会更快。”
“而这一层,是整个框架中,唯一与具体的底层物理硬件产生绑定的部分。”
江临转过头,看着三人说。
“最关键的是,它是热插拔的。”
听到热插拔三个字,陈启明的呼吸频率,肉眼可见地变得重了一分。
“插拔,这怎么理解?”乔越的工程经验尚浅,大脑的运转速度没太跟上这跳跃的架构设计。
“意思是,如果我们的目标环境换了一台不同微架构的机器,我们只需要把这块后端的代价评估板子单独拆下来换掉。”
江临耐心地解释道。
“如果我们喂给评估引擎的是英特尔某代架构的延迟表和端口竞争模型,它就按英特尔的脾气打分。如果我们换成AR构的模型,它就按AR吞吐上限去评估。而前面两层的搜索和验证逻辑,哪怕是一个标点符号的代码,都不需要修改。”
实验室里的空气仿佛被瞬间抽干。
直到裴砺走过来。
“架构切开不难,难的是切开之后别漏血。”
他走到屏幕前,指着第二层验证器。
“你的零一验证器证明的是pare-exchange网络。可我的超优化器吐出来的东西,不一定老老实实长成比较器。它可能是cv,可能是blend,可能是pnsd,也可能靠某种未定义行为省一条指令。”
“你怎么证明这些脏东西,真的等价于你抽象层里的pare-exchange?”
“所以零一验证器只是第一道门。”
江临拿起马克笔在一旁的白板上写下五行字。
抽象网络。
原语语义。
源码实现。
二进制等价。
微架构代价。
“你卡了三年的,不是一块铁板,而是五层东西混在一起,我们得先把它拆开。”
乔越在一旁张大了嘴巴,目光在裴砺和江临之间来回游移。
直到这一刻,他才具象地意识到,眼前这个总是带着平静神情的少年,绝对不仅仅是数学非常厉害那么简单。
他还拥有着对复杂工程进行降维解构的恐怖直觉。
“陈老师,在开始实际搜索之前,我必须先向您确认一个工程上的约束条件。”江临却没有沉浸在旁人的惊叹中,而是迅速将话题拉回了最硬核的实操层面,“您团队需求的这个sort5,它的核心诉求是单发延迟敏感,还是批量吞吐敏感?”
陈启明闻言,微微一怔。
乔越几乎是下意识地接话道:“快不就是快吗,时间短了自然就快了,这还分……”
话刚说了一半,乔越自己就卡壳了,他隐约察觉到自己可能暴露出了底层的认知盲区。
“这两者在现代微架构上,截然不同。”
替乔越把话补全的,是裴砺,语气中带着复杂的感慨。
“如果你一次只排一组五个数字,要求这组数据从输入到输出的时间最短,那么你追求的是最低的延迟。但如果你面对的是海量数据,比如一天要排上亿组,你的目标是单位时间内能处理多少组数据。在现代 cpU 那些复杂的乱序执行和超标量流水线上,这两个目标往往是互斥的。”
裴砺深深地看了江临一眼。
这个问题,即使是在他们这个专门搞系统底层的课题组里,也鲜少有人在写代码前正经八百地提出来讨论过。
所有人在面对优化这个词时,都默认了单一维度的快。
然后下意识去死抠比较器的绝对数量,去计较少写了一条汇编指令。
然而,在拥有多个ALU 端口、复杂分支预测和重排序缓冲区的现代处理器上,最少的指令条数,并不意味着最高的吞吐量。
“我们要跑在批处理的场景里,看重的是极限吞吐。”陈启明没有任何犹豫,直接给出了定调。
“那就好办了。”
江临点了点头,将代价评估后端的配置文件打开,挂上了陈启明之前提供的机器A的硬件端口争用模型数据。
“我把搜索目标明确设定为最大化吞吐量,然后,在这个特定模型下跑一个受限空间内的定向搜索。”
江临并没有启动全量搜索。
全量搜索整个指令状态空间,在没有算力集群支撑的情况下,是一个需要在算力废土里用几十年的时间去慢慢熬的浩大工程。
他仅仅是在一个被严密数学剪枝后的极窄范围内,让这套三层架构运转了不到五分钟。
工作站的散热风扇发出一阵短暂而急促的轰鸣后,屏幕上吐出了一排排新鲜出炉的候选结果。
“陈老师,您看一下。”
江临调出内置的对比工具,将两段代码并排展示。
“这里头排在第一梯队的,有一个排序网络,它的拓扑结构跟您团队耗费数月手工调优出来的那一版,几乎完全吻合。这个结果首先印证了一点,您团队在底层优化的手艺没有任何毛病。在人类能够凭借直觉和经验触及的边界内,你们确实已经摸到了比较器数量最优的那一档基准线。”
听到这番话,陈启明紧绷的脸色终于舒缓了许多。
“但是,请看这一个。”江临的鼠标向下滑动,点开了另一个评分稍高的候选方案,“这套方案的比较器数量同样是九个,一个都不比你们的多,也没有减少。可是它将这九个比较器的指令排布顺序,进行了一种看似反直觉的错位编排。这种错位,恰好避开了机器A在特定周期内的ALU端口资源拥堵。”
“在机器A上,并且仅仅是在机器A的微架构下,它的极限吞吐量,比你们手工调优的那一版,快了不到百分之三。”
百分之三。
在日常应用的软件开发中,这是一个小到几乎不值一提,很容易就会被环境噪声轻易淹没的数字。
然而裴砺一言不发,在一旁的副屏上调出自己的终端环境,将江临搜索出的那段甚至没有加任何注释的候选代码拷贝了进去。
他亲自动手挂上编译器,开启最高级别的优化选项,连接上Linux内置的perf性能分析工具,屏息凝神地连跑了三遍基准测试。
然后锁cpU affinity,关掉睿频波动,把governor固定到perfornce,预热缓存,perf stat-r50连跑五十组。
他盯着cycles、instructions、uops issued、branch-sses几列数字看了很久。
三十组之后,趋势还在。
五十组之后,置信区间没有压回原版。
那不到百分之三的差距,终于从噪声里站了出来。
“五分钟?”裴砺指着桌上的设备,声音有些发涩,“这就只是在普通的机器上跑了五分钟的结果?”
“嗯,五分钟不到,因为设定了严苛的剪枝条件。”江临平静地回答。
陈启明长长地叹息了一声:“一个仅仅跑了五分钟的自动化受限搜索,就凭借着针对性的硬件模型,在一个被我们翻来覆去研究过的用例上,硬生生地压过了我们整个团队手工雕琢了大半年的版本。”
一旁的乔越,此时已经完全失去了语言组织能力。
但裴砺毕竟是经历过无数次架构失败的老兵。
短暂的震撼过后,他的眼神闪动了一下,似乎从这近乎神迹的展示中,敏锐地捕捉到了某个隐秘的破绽。
“等等,sort5终究还是太小了。五个元素的排列组合毕竟有限,靠着精妙的受限搜索,你确实可以在短时间内糊弄过去。”
裴砺紧紧盯着江临的眼睛,语速加快。
“可是,陈导真正想要铺开的,是把这套排序逻辑集成到我们整套底层数据处理内核里。我们需要一次性排八个数,十六个数,甚至更长。你比我清楚,一旦元素数量上升,底层网络的状态空间是呈指数级爆炸的。受限搜索的算力一旦撞上那面指数级的高墙,根本就顶不住。”
这是裴砺在系统架构层面,在这套优美框架上面所能想到的,可能面临的最后一次崩塌危机。
然而,江临没有显露出任何被拆穿的窘迫。
他反而十分赞同地点了点头,仿佛这一切早就在他的推演沙盘之中。
“你说得很准,所以刚才演示的这百分之三的性能提升,是机器A独占的。如果把同样的底层代码扔到微架构不同的机器b或机器c上,这个优势大概率会荡然无存,甚至可能出现负优化。”
江临顺着裴砺的话接了下去。
“这套三层架构真正的价值,并不在于此刻生成了某一段神奇的代码,而是在于那块随时可以重定向的代价评估后端。”
江临面对着两位资深的系统研究者,语气依旧没有太多的起伏。
“此外,刚才裴师兄用perf实测出来的数字,在真实复杂的操作系统环境中,本身就是带有大量环境噪声的。缓存命中率波动,操作系统调度中断,都会导致同段代码一次跑得快,一次跑得慢。在未来的全量搜索中,代价模型必须进行反复的模拟与抽样,取最稳健的统计学中位数,否则算法搜出来的最快,只是一座建立在沙滩上的堡垒。”
“当然,还有你刚才提到的一点,当 N 的规模变大时,状态空间的指数爆炸问题。”
江临看着裴砺,毫不避