C++ 如何禁用动态频率缩放?
我想做一些微基准测试,并试着把它们做好。不幸的是,动态频率缩放使得基准测试非常不可靠 是否有一种方法可以通过编程(C++,Windows)确定是否启用了动态频率缩放?如果,可以在程序中禁用此功能吗 我试着在实际的基准测试发生之前使用一个预热阶段,使用100%的CPU一秒钟,但结果证明这也不可靠C++ 如何禁用动态频率缩放?,c++,windows,benchmarking,cpu-speed,C++,Windows,Benchmarking,Cpu Speed,我想做一些微基准测试,并试着把它们做好。不幸的是,动态频率缩放使得基准测试非常不可靠 是否有一种方法可以通过编程(C++,Windows)确定是否启用了动态频率缩放?如果,可以在程序中禁用此功能吗 我试着在实际的基准测试发生之前使用一个预热阶段,使用100%的CPU一秒钟,但结果证明这也不可靠 更新:即使我在BIOS中禁用SpeedStep,cpu-z也会显示Windows XP中的频率在1995和2826 GHz之间变化,更高版本的cpu速度由电源策略管理。如果在Windows电源管理对话框中
更新:即使我在BIOS中禁用SpeedStep,cpu-z也会显示Windows XP中的频率在1995和2826 GHz之间变化,更高版本的cpu速度由电源策略管理。如果在Windows电源管理对话框中设置“最大性能”模式,它不会关闭缩放功能吗 还有一些第三方工具,例如
我想,这可以通过编程方式使用函数来完成。通常,您需要执行以下步骤:
- 调用
并将SystemPowerCapabilities传递给InformationLevel参数,将lpInputBuffer和nInputBufferSize设置为CallNtPowerInformation()
,然后将lpOutputBuffer设置为structure,并将nOutputBufferSize设置为结构的大小。在第一次调用之后,NULL
包含当前系统电源功能的结构。要检查系统是否支持处理器节流,请读取processor Rottle的值SYSTEM\u POWER\u CAPABILITIES
- 还有另外两个我们感兴趣的成员,他们是ProcessorMinThrottle和ProcessorMaxhrottle;它们表示支持的系统处理器节流的最小和最大级别,以百分比表示。如果两个成员的值都已为100%,这意味着当前已禁用CPU限制,因此无需重新配置
- 要禁用CPU节流,需要将ProcessorMinThrottle和ProcessorMaxThrottle设置为
。为此,再次调用100%
,并将SystemPowerCapabilities传递给InformationLevel参数;但是现在,将lpInputBuffer设置为SYSTEM\u POWER\u CAPABILITIES结构,其中两个成员已设置为CallNtPowerInformation()
。我相信你知道下一步该做什么100%
CallNtPowerInformation
选项对我都不起作用。SYSTEM\u POWER\u CAPABILITIES
的相关processorRottle
字段为FALSE
,更改一些SYSTEM\u POWER\u策略
无效
但是,概述了使选项在电源管理设置中可用的方法
使用ProcMon,我可以将其追溯到以下注册表操作:
HKEY\U LOCAL\U MACHINE\SYSTEM\CurrentControlSet\Control\Power\User\PowerSchemes
下的ActivePowerScheme
SZ
值,以获取有功功率计划Computer\HKEY\u LOCAL\u MACHINE\SYSTEM\CurrentControlSet\Control\Power\User\PowerSchemes\下设置ACSettingIndex
和/或DCSettingIndex
DWORD
:
谢谢你。这是有用的。但有一个问题。这是永久性的还是仅适用于应用程序运行的时间?从MSDN:SystemPowerCapabilities 4-lpInBuffer参数必须为NULL,否则,函数返回ERROR\u INVALID\u参数。有人真的验证了这一点吗?processorRottle
对我来说一直是FALSE
,油门百分比一直是0,尽管我确信我的笔记本电脑会进行频率缩放CallNtPowerInformation
返回ERROR\u SUCCESS
。我不知道发生了什么事。你是在Skylake还是更高版本的CPU上?Skylake引入了操作系统将P状态控制(频率缩放)完全移交给硬件的能力。在较旧的CPU中,这仅适用于Turbo频率(高于“额定”频率,其中硬件需要能够自行后退)。但在Skylake中,Turbo并没有那么“特别”,我认为操作系统禁用它的方式在硬件P状态模式下是不同的。无论如何,这也许可以解释为什么其他答案不再有效。(我不使用Windows,所以我知道详细信息。)谢谢!这或许可以解释为什么它不再“起作用”。
powercfg -setacvalueindex scheme_current sub_processor PERFBOOSTMODE 0
powercfg -setdcvalueindex scheme_current sub_processor PERFBOOSTMODE 0
powercfg -setactive scheme_current