关于电脑硬件与棋软K值的关系研究
(原创,棋中论坛首发)
缘起:看到本论坛一网友“棋中事实”所发《十六核心32线程运行棋软引擎效果测试》一帖(http://www.qz777.com/read-htm-tid-15124.html)颇有感触,因本人工作关系,有机会接触各式电脑,包括双路工作站、4路及8路服务器,闲暇之时经常运行棋软(主要是旋风6.2)测试把玩,决定将我对电脑硬件(主要是指CPU核心数、线程和主频)与棋软(引擎)K值的关系的研究发表如下。加之几大象棋论坛鲜有涉及此问题,并且误区颇多,感觉还是有一定意义,特别是对棋友有个参考,以免在投资购买电脑上出现失误。我尽量用通俗的语言来试着揭开电脑硬件与棋软K值的关系,水平有限,不当之处还请指教。
一、现阶段运行棋软为什么一定要关闭超线程?
超线程的实现是将处理器增加约5%的裸晶面积(逻辑计算实体),然后利用特殊的硬件指令,把两个逻辑内核模拟成两个物理芯片,让单个处理器都能使用线程级并行计算,以期换来15%-30%的效能提升。注意,有很多人说超线程是完全软件虚拟的,这是不对的,它毕竟是建立在实体基础上(尽管只是5%的增加),这个误区要更正。5%的实体增加,如何实现15-30%的效能提升呢?实际是没办法实现的!5%的芯片面积增加理论只能增加5%的运算速度!这个就像能量守恒,神仙也没办法突破。但为什么实际可以做到15%-30%的效能提升?原来,那个真正的核心CPU的执行单元很多情况下一开始就没有被充分使用(这一点后续还会谈到)!有点明白了吧?原来这个5%是帮助那个95%“少犯错误”,这样换来15%-30%的效能提升!就像我们有时赢棋,不是因为我们水平高,而是比对方犯错误少。再举个例子,我大人要卸下一车子砖头要10个小时,但我带一个小孩帮我一起干,小孩不让他来做体力活,只是给我端茶送饭递烟什么的,这样省我很多事,那我可能只要7小时就可以卸完!这就是超线程的原理。
问题也来了。给我打下手的小孩不是很听话(程序没有写好),我想喝茶时他给我递烟,我想吃饭时他给我喝茶,我想抽烟时他说饭还没做好,这样我不得不停下来等他,因为当初已经把这些工作交给他处理了,这样不但不能帮到我,反而拖累我了,这样我可能需要12个小时来完成任务。
很不幸,今天几乎所有中国象棋引擎都是这样,都不允许我带一个小孩工作,虽然小孩一直在我身边。那只有让小孩回去睡觉吧。具体体现在开超线程运行棋软,K值会增加20%以上,很多人可能会窃喜,看,K值增加了,超线程有用啊!但别高兴太早,你再看看上层速度,上层速度会慢30%以上呢!为什么K值大了上层反而慢了呢?很正常啊,因为里面在“内耗”呢,我需要的哈希值它在找或重新算,我不需要的它反复给我送来。所以,里面有很多是无效计算。本来,K值是反映引擎计算速度的指标,就是因为这个超线程,让这个指标虚高!
果断让小孩回家睡觉吧,果断关闭你的超线程吧,不要犹豫。当然,如果你说你想输棋,那就另当别论了。
二、CPU核心数翻倍,K值会翻倍吗?
比如,有一个4核心(指物理核心,下同)的3.0GHz的CPU,当运行在2核心时,K值是1000,那么运行在4核心时,K值会不会是2000?很多人毫不犹豫回答,当然!其实,不会翻倍,会比2倍略少。认识这一点很重要,甚至是理解下文的基础。这里主要有以下几个原因:
(1) Intel的睿频技术。比如i7 2600K主频3.4G,睿频3.8G,这个睿频3.8G是指系统指派一个核心运行时,它可瞬间运行到3.8G的频率,当系统指派2个核心时,它可运行在3.53G的频率,当全核心(4核心)运行时,对不起,它只能运行在3.4G的频率。这一点,对超频电脑不做考虑。
(2)别忽略了CPU缓存的作用。CPU缓存是位于CPU与内存之间的临时存储器,它的容量比内存小的多但是交换速度却比内存要快得多。内存与CPU交换数据,要耗费大约几百个CPU的时钟周期,而CPU与它的缓存交换数据只要几个CPU的时钟周期,大大节省等待时间。所以,越大的缓存越好。8M的缓存供2个核心使用当然比供4个使用效率要高!当然缓存是分级的,这个复杂点,不过多深入。
(3)引擎的问题。同一架构的引擎,永远不可能做到线程加倍运算速度翻倍。能做到增加97%就很不错了。
综上,随着核心数的增加,无论从硬件上还是从软件上,他的效能都在下降,2者叠加下降的更厉害。
三、超频的作用很明显,但适超“有益身心、强身健体”,大超、蛮超“阳痿早泄、未老先衰”
原来在3.0GHz下,K值是3000,那么主频超到4.0GHz,K值会到多少?理论上,预期上,是4000,没错,超到4.0GHz,计算速度理论上比3.0GHz快33%,(4.0G-3.0G)/3.0G=33.3%,那么,实际上呢?不用说,看了上面第二条,你应该知道比33%会少,少多少呢?
结合具体的例子来谈吧。3960X在6核心原频3.3G下运行旋风6.2,开局平均K值是5830,
同一系统下,超到4.0G,运行旋风6.2开局平均K值是6880,频率提升了21%,K值提升了约18%;超到4.5G,运行旋风6.2开局平均K值是7580,比3.3G频率提升了36%,K值提升了约30%,看到吧,两者几乎保持同步增加(18:21约等于30:36)!
故事还在延续。再把3960X超到5.0G!运行旋风6.2开局平均K值是8220!对比3.3G的原频,频率提升了51%,K值只提升了40%!K值并不能与频率按同步比例提升(40:51远小于18:21)!
为什么先期超频,K值几乎同步提升,到后期K值提升率却在下降呢?或者说后期超频的收益在为什么在下降?这个还得从CPU说起。还记得第二点谈到的CPU缓存吗?你还要把Intel当“奸商”来理解就好了。每个CPU,对大多数应用而言,它的频率与它的缓存是配套的,Intel不可能为他的CPU在缓存上做“冗余”,这不是载人航天,做大量冗余,甚至做几倍的冗余。也就是说,在大多数情况下,CPU的缓存刚好配套它的主频。你把主频超的太多,CPU需要的缓存数据超出原有大小,那他就要到内存里找了,那就耗费时间了。这就像给你一颗泰森的“强心”,而你的血管还是原来的,这颗“强心”必然提前衰竭。
另一方面,超的太多,CPU寿命绝对减少!电子产品最大杀手是热量。当然好的散热器可以减轻这个问题,但不幸的是,CPU主要成分是硅,就是石头,它是热的不良导体,里面产生热量大于对外传导的速度,越聚越多,纵使外面是液氮,又能如何呢?温度过高,里面的材质的电气特性随之改变,二极管也不二级了,“阳痿早泄、未老先衰”是一定的。
四、那超多少合适呢?
五、如何预言各种CPU的K值?
(未完,待续)
29楼的问题很好,我本来想谈的,有普遍意义:
想请教一个问题:电脑默认是开了超线程的,如果不到BIOS关闭超线程,按照四核心八线程的电脑只设置成四线程运行棋软(只用真实的物理核心),但不故意去关闭超线程,这样的话CPU算不算带了那个不听话的小孩?会不会受到拖累影响效率?

但这样一来,虽然设置了四核心,任务管理器上CPU占用率是50%,关闭了超线程,则100%占用率。只针对棋软来说有没有影响?因为50%运行棋软,但K值仍然正常,是否说明只要用真实核心数,不用超线程就行了,而不是必须到BIOS去关闭超线程才行。
回答:很好的问题。你不关超线程,系统随机指派,也就是说,有可能指派真正的4个物理核心,有可能不是,哪个空闲就是哪个。对系统而言,8个核心(其实是4核8线程)是一样的,或者说谁是真正物理核心、谁是超线程,对系统是不可见的(这也是为什么一定要在BIOS里而不可以在系统里关超线程的道理)。但不用担心,WIN 8 已经解决了此问题,优先指派物理核心,当物理核心“不堪重负”时,再找小孩帮忙。