【问题标题】:How to Disable Dynamic Frequency Scaling?如何禁用动态频率缩放?
【发布时间】:2011-04-27 21:28:38
【问题描述】:

我想做一些微基准测试,并尝试把它们做对。不幸的是,动态频率缩放使基准测试非常不可靠。

有没有办法以编程方式(C++、Windows)查明是否启用了动态频率缩放?如果,可以在程序中禁用它吗?

我尝试在实际基准测试发生之前仅使用一个使用 100% CPU 的预热阶段,但结果证明这也不可靠。

更新:即使我在 BIOS 中禁用 SpeedStep,cpu-z 仍显示频率在 1995 和 2826 GHz 之间变化

【问题讨论】:

    标签: c++ windows benchmarking cpu-speed


    【解决方案1】:

    一般情况下,您需要执行以下步骤:

    • 调用CallNtPowerInformation()并将SystemPowerCapabilities传递给InformationLevel参数,设置lpInputBuffernInputBufferSizeNULL,然后将 lpOutputBuffer 设置为 SYSTEM_POWER_CAPABILITIES 结构,并将 nOutputBufferSize 设置为结构的大小。在第一次调用之后,SYSTEM_POWER_CAPABILITIES 结构包含当前系统电源功能。要检查系统是否支持处理器节流,请读取 ProcessorThrottle 的值。

    • 还有另外两个我们感兴趣的成员,它们是,ProcessorMinThrottleProcessorMaxThrottle;它们代表支持的系统处理器限制的最低和最高级别,以百分比表示。如果两个成员的值都已为 100%,这意味着 CPU 限制当前已禁用,因此您无需重新配置。

    • 要禁用 CPU 限制,您需要将 ProcessorMinThrottleProcessorMaxThrottle 设置为 100%。为此,再次调用CallNtPowerInformation() 并将SystemPowerCapabilities 传递给InformationLevel 参数;但现在,将 lpInputBuffer 设置为 SYSTEM_POWER_CAPABILITIES 结构,其中两个成员已设置为 100%。我相信你知道下一步该做什么。

    以非编程方式,您还可以使用 Windows 内置命令行工具,即PowerCfg,获取/设置 Windows 电源选项

    进一步阅读

    【讨论】:

    • 谢谢。这很有用。一个问题,不过。这是永久的还是仅在应用程序运行时?
    • 来自 MSDN:SystemPowerCapabilities 4 - lpInBuffer 参数必须为 NULL,否则,函数返回 ERROR_INVALID_PARAMETER。有人真的验证过这行得通吗?
    • ProcessorThrottle 对我来说一直是 FALSE 并且油门百分比一直是 0,尽管我确信我的笔记本电脑会进行频率缩放。 CallNtPowerInformation 返回ERROR_SUCCESS。我不确定发生了什么。
    【解决方案2】:

    到目前为止,以上CallNtPowerInformation 选项都不适合我。 SYSTEM_POWER_CAPABILITIES 的相关 ProcessorThrottle 字段是 FALSE 并且更改了一些 SYSTEM_POWER_POLICYs 无效。

    不过,https://www.geeks3d.com/20170213/how-to-disable-intel-turbo-boost-technology-on-a-notebook/#_24 概述了一种在电源管理设置中提供选项的方法。

    使用 ProcMon,我能够将其追溯到以下注册表操作:

    1. 读取HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\User\PowerSchemes下的ActivePowerSchemeSZ值以获取有功功率计划
    2. Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\User\PowerSchemes\<above active power plan GUID>\54533251-82be-4824-96c1-47b60b740d00\be337238-0d82-4146-a960-4f3749d470c7 下的ACSettingIndex 和/或DCSettingIndex DWORD 从2(高)设置为0(禁用,或任何您选择)

    不幸的是,相关密钥归系统所有,这意味着您必须提示用户(必须具有管理员访问权限)更改密钥的权限,或者您必须使用powercfg 来操作设置.后者是可取的,并且实际上似乎可以工作,即使没有管理员访问权限(https://docs.microsoft.com/en-us/windows-server/administration/performance-tuning/hardware/power/power-performance-tuning#processor-performance-boost-mode 提供):

    powercfg -setacvalueindex scheme_current sub_processor PERFBOOSTMODE 0
    powercfg -setdcvalueindex scheme_current sub_processor PERFBOOSTMODE 0
    powercfg -setactive scheme_current
    

    【讨论】:

    • 您使用的是 Skylake 还是更高版本的 CPU? Skylake 引入了操作系统将 P 状态(频率缩放)的控制完全移交给硬件的能力。在较旧的 CPU 中,这仅适用于 Turbo 频率(高于“额定”频率,硬件需要能够自行回退)。但是在 Skylake 中,Turbo 并不那么“特殊”,而且我认为操作系统禁用它的方式在硬件 P 状态模式下是不同的。无论如何,这可以解释为什么其他答案不再起作用。 (我不使用 Windows,所以 IDK 详细信息。)
    • 谢谢!这确实可以解释为什么它“不再起作用”了。
    【解决方案3】:

    在 Windows XP 和更高版本中,CPU 速度由电源策略管理。如果在 Windows 电源管理对话框中设置“最大性能”模式,它不会关闭缩放吗?

    还有一些第三方工具 - 例如SpeedSwitchXP

    我想这可以通过编程方式完成,使用 CallNtPowerInformation 函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-27
      • 1970-01-01
      • 2020-09-09
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 2013-10-17
      相关资源
      最近更新 更多