第107章 三十二个证人(5 / 7)
此刻他更深一层地明白了。
九个比较器,是按数量排的。
但在一颗真实的cpu里,决定一段代码快慢的,从来就不只是指令的数量。
而是这九个比较器之间的数据依赖链:哪些必须排队等前一个算完,哪些可以並排著同时算。
是它们落在乱序执行引擎的哪几个埠上,会不会挤在一起抢资源。
是每条min、max、条件传送指令的延迟和吞吐。
是寄存器够不够用,会不会被逼著往內存里倒腾。
同样九个比较器,排成一条又细又长的依赖链,和排成五层能並行的浅塔,在流水线上的表现,可能差出一大截。
比较器数量少,和比较器深度浅,是两个不同的目標。
陈启明真正想要的目標,那个在型號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】。 ↑返回顶部↑
九个比较器,是按数量排的。
但在一颗真实的cpu里,决定一段代码快慢的,从来就不只是指令的数量。
而是这九个比较器之间的数据依赖链:哪些必须排队等前一个算完,哪些可以並排著同时算。
是它们落在乱序执行引擎的哪几个埠上,会不会挤在一起抢资源。
是每条min、max、条件传送指令的延迟和吞吐。
是寄存器够不够用,会不会被逼著往內存里倒腾。
同样九个比较器,排成一条又细又长的依赖链,和排成五层能並行的浅塔,在流水线上的表现,可能差出一大截。
比较器数量少,和比较器深度浅,是两个不同的目標。
陈启明真正想要的目標,那个在型號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】。 ↑返回顶部↑