关灯
护眼
字体:大 中 小
上一页
目录
下一页
在他那几台具体的服务器上,跑得最快。
数量最少和跑得最快在真实的物理世界里,根本不是一回事。
江临想起陈启明在报告厅留下的最后一句话。
他的搜索空间里,充满了正确的低效垃圾。
此刻他更深一层地明白了。
九个比较器,是按数量排的。
但在一颗真实的CPU里,决定一段代码快慢的,从来就不只是指令的数量。
而是这九个比较器之间的数据依赖链:哪些必须排队等前一个算完,哪些可以并排着同时算。
是它们落在乱序执行引擎的哪几个埠上,会不会挤在一起抢资源。
是每条n、x、条件传送指令的延迟和吞吐。
是寄存器够不够用,会不会被逼着往内存里倒腾。
同样九个比较器,排成一条又细又长的依赖链,和排成五层能并行的浅塔,在流水在线的表现,可能差出一大截。
比较器数量少,和比较器深度浅,是两个不同的目标。
陈启明真正想要的目标,那个在型号A的服务器上榨干最后一滴性能,把延迟压到最低的最优解,藏在极深极脏的硬件底层里。
和微架构死死绑在一起。
换一颗不同代际的CPU,哪怕只是从Intel的Skylake换到Zen 3架构,缓存延迟和指令埠的微小变化,都会导致那个最优解瞬间跌落神坛,变成次优。
江临盯着那张三台机器的perf表,一下子意识到,要找到那个真正适应物理世界的最优解,单靠数学证明是不够的。
他必须在他的MPS框架里,接入一个代价模型。
在海量正确的候选网络里,不仅看数量,还要看深度,看并行度。
甚至到最后,他需要写一个自动化脚本,把筛选出来的,看起来很有希望的几百个变种网络,一个一个编译成机器码,扔进真实的物理服务器里去实测,打分,筛选。
每一次实测都伴随着作业系统调度的噪声、缓存预热的波动。
他得每个候选跑上一百万次,取中位数,取99分位延迟,做枯燥的统计学对抗。
根本不是一个晚上,甚至不是现实里的一年半载能够跑完的事。
意识到纯算法在底层硬件面前的局限性后,江临的脑子反而冷静了下来。
顺手点开rank5,这个逻辑能不能也用现有的框架碾压过去。
题面:给五个数,不要求全部排好,只问输入窗口中心位置的那个数,在这五个数里到底排第几。
几乎是出于惯性,本能地就想把刚写好的零一原理验证脚本套上去。
不过还好下一刻,他就及时把自己摁住了。
零一原理管的是排好没有,是全局的单调性。
可rank5要的根本不是把所有数都乖乖排好,而是要给每个数,或者特定的某个数,粘贴一个精确的名次标签。
如此,它的正确性判据不再是问最终的输出串行有没有单调递增,而是变成了问:那个原本在输入中心位置的数,它头上顶着的名次,到底是不是正确的名次?
如果强行把输入全换成0和1会发生什么?
比如原始输入是【10, 50, 30, 20, 40】,中间那个数是30,它排第三名。
如果粗暴地二值化为0-1串行,可能会变成【0, 1, 1, 0, 1】。
在这个二值串行里,有三个1,两个0。
原本该区分开的绝对名次情形,因为数值维度的坍缩,直接撞成了一团烂泥,根本分不开谁是真正的第三。
零一原理在这里,不直接成立。
或者说,它失效了。
验证rank5,必须回到相对大小关系(如置换群)的层面,而非单纯的0-1输入空间。
它的底层结构更接近一张由偏序关系构成的,动态更新的两两比较矩阵。
这又是一个新坑。
从八个数里,挑出前三大。
这个问题同样暗藏杀机。
对比较网络形式的top-k选择,类似的零一检验可以使用。
但前提是,你必须先和出题人把正确的语义定义好。
什么叫挑出前三?
口径A:只要最大的三个数,落进了输出数组的前三个坑位就行,这三个数内部是乱序也无所谓?
口径B:还是说,不仅最大的三个数要进前三,而且这三个数之间,也必须严格按照从大到小排好?
如果口径没有定死,那么MPS框架搜索出来的就是空中楼阁。
标准宽泛一分,搜索空间就呈指数级缩小。
标准严格一分,依赖链就不可避免地加长。
三个题,三套
本章未完,请点击下一页继续阅读>>『加入书签,方便阅读』
上一页
目录
下一页