大家已经知道超线程的优点在于可以最大程度地利用cpu的剩余资源,但缺点就是减慢单线程性能。不止如此,当一个多线程优化的程序,其线程不小心分布在同一个核心的超线程上时,性能会有较大下降,可以多达30%(你可以想象好不容易超频到5Ghz的cpu一下子变成两个3.5Ghz的cpu有多么让人恼火)。
有人说windows很聪明,会把程序的线程分到不同的核心上,实际上系统并没有这么聪明,你经常可以看到超线程框框不断上下,就是windows在不断犯错然后改错的过程,这样又造成了损失。对于amd yes来说,可能系统已经能够很好的区分ccx,并让线程尽可能呆在一个ccx内,但win10对于超线程的态度就是能用就用,比win7激进地多。那么我们既想利用cpu的边角料做一点力所能及的事,又不想影响到重负载线程,怎么办呢?
之前我有一个帖子教大家怎么伪装自己的cpu为大小核架构,刚好能够用来实现我们的目的。基本思想是这样的:对于比较细碎的任务,应该尽可能的利用超线程,所以不对其线程亲和性作改变,而对于重负载线程,我们不希望两个重负载线程放到同一个核心上,因此重负载线程应该放到不同核心上。
启用大小核调度逻辑后,系统会特别关注每一个线程的某些属性。比如是否前台或后台、优先级是高还是低、上次运行时间是长还是短,以此来决定这些线程是否重要。我们刚好利用这一点,把重负载线程标为重要线程,然后调度到我们定义的“大核”上,大核就定义为0246或1357核心,以此类推。这样系统就会自动把重负载线程调度到不同核心上了。
有人可能提出怀疑,说为什么不直接改进程的亲和性呢?因为每个进程有很多线程,里面有轻载也有重载,直接改亲和性区分不开来,不能做到有的放矢。
总之直接上图看效果,下图是chess benchmark从2线程到10线程的cpu利用率情况,你们自己看看效果
下面给出方法:
打开注册表编辑器regedit,定位到
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\kernel
然后添加如下dword键值
DefaultDynamicHeteroCpuPolicy=0
DynamicCpuPolicyExpectedRuntime=4000(十进制)
DynamicHeteroCpuPolicyImportant=2
DynamicHeteroCpuPolicyImportantShort=0
DynamicHeteroCpuPolicyMask
然后在kernel下新建项
KGroups
在其下继续新建项
00
然后添加dword键值
SmallProcessorMask
根据你的cpu,比如你是8核16线程,那么就修改为十六进制的5555,如果是6核12线程就修改为555,4核8线程就修改为55。大功告成!
有人说windows很聪明,会把程序的线程分到不同的核心上,实际上系统并没有这么聪明,你经常可以看到超线程框框不断上下,就是windows在不断犯错然后改错的过程,这样又造成了损失。对于amd yes来说,可能系统已经能够很好的区分ccx,并让线程尽可能呆在一个ccx内,但win10对于超线程的态度就是能用就用,比win7激进地多。那么我们既想利用cpu的边角料做一点力所能及的事,又不想影响到重负载线程,怎么办呢?
之前我有一个帖子教大家怎么伪装自己的cpu为大小核架构,刚好能够用来实现我们的目的。基本思想是这样的:对于比较细碎的任务,应该尽可能的利用超线程,所以不对其线程亲和性作改变,而对于重负载线程,我们不希望两个重负载线程放到同一个核心上,因此重负载线程应该放到不同核心上。
启用大小核调度逻辑后,系统会特别关注每一个线程的某些属性。比如是否前台或后台、优先级是高还是低、上次运行时间是长还是短,以此来决定这些线程是否重要。我们刚好利用这一点,把重负载线程标为重要线程,然后调度到我们定义的“大核”上,大核就定义为0246或1357核心,以此类推。这样系统就会自动把重负载线程调度到不同核心上了。
有人可能提出怀疑,说为什么不直接改进程的亲和性呢?因为每个进程有很多线程,里面有轻载也有重载,直接改亲和性区分不开来,不能做到有的放矢。
总之直接上图看效果,下图是chess benchmark从2线程到10线程的cpu利用率情况,你们自己看看效果
下面给出方法:
打开注册表编辑器regedit,定位到
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\kernel
然后添加如下dword键值
DefaultDynamicHeteroCpuPolicy=0
DynamicCpuPolicyExpectedRuntime=4000(十进制)
DynamicHeteroCpuPolicyImportant=2
DynamicHeteroCpuPolicyImportantShort=0
DynamicHeteroCpuPolicyMask
然后在kernel下新建项
KGroups
在其下继续新建项
00
然后添加dword键值
SmallProcessorMask
根据你的cpu,比如你是8核16线程,那么就修改为十六进制的5555,如果是6核12线程就修改为555,4核8线程就修改为55。大功告成!