Windows 下面控制CPU 频率的方法

CPU 的功耗和频率是直接相关的,进入 Windows 后,IntelPPM 会接管频率控制,所以目前我还没有找到能够直接控制的方法,需要和 BIOS 进行配合才能完成。

在KBL-R HDK Windows 10  16299发现下面一个可行的方法:

  1. BIOS中设置 Speed Shift 为Disabled, EIST需要设置为 Enabled;
  2. 在进入Windows之前,设置 MSR 0x1A0 Bit16 为0。这个位置是 EIST 功能的开关,在进入 Windows之前,将这个位置关闭,对BIOS来说,EIST的准备已经完成,对于Windows来说,EIST是关闭的,因此他不会让驱动接管这个功能,这样才能让我们有设定CPU 频率的机会:

  1. 进入系统之后,使用 RW-Everything 修改 MSR , 首先将 MSR 0x1A0 Bit16 设置为 1,重新打开 EIST 功能,然后通过 MSR 0x199 BIT[14:8]来写入 Ratio。比如,写入 8 就是 800Mhz。

写入之后,可以通过 MSR  198h 来读取当前的 Ratio。

上述设置完成之后,你会发现最低频率可以设置为 800Mhz,但是如果直接在BIOS中设定固定的频率,可以低到400Mhz;经过研究最终找到Root Cause: Race to halt 功能,这个功能大概的思想就是让CPU 超频一点点尽快完成操作然后休息节能。关闭这个功能之后可以设置最低到 400Mhz。

使用上述的方法再编写程序直接对 MSR 编程,在 Windows下工作正常。测试 400Mhz时播放视频感觉比较流畅,回想当年还要特意购买硬件解压卡才能在486DX2 66Mhz上观看VCD,CPU 运算能力真是不可同日而语了。

上述方法只在 Kabylake-R U42 Windows  16299 X64 上验证过,可以看出操作和 OS 有一定关系,笔者未能在其他版本上实验,有兴趣的朋友不妨试试然后给我留言交流。

 

《Windows 下面控制CPU 频率的方法》有4个想法

    1. 我当时是BIOS 中写代码的,你也可以使用UEFI Shell 下的工具进行写入,然后进入 Windows 的分区使用 BootX64 来启动 Windows。

  1. 您好,我在研究8250U的speedshift最低频率时遇到了同样的最低只能到800MHz而不是400MHz的问题,请问打开speedshift后关闭RTH也可以做到系统空载时最低400MHz吗?

    第二个问题是,EIST和speedshift这两个变频技术是互斥的吗?从降低延迟并降低总功耗的角度来看是应该只开启speedshift还是两个都开呢?

  2. 第一个问题你可以试试看,我当时实验是可以降低到 400Mhz的;
    第二个问题是这两个不是互斥的,正常使用的时候应该是全开的。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注