Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何禁用动态频率缩放?_C++_Windows_Benchmarking_Cpu Speed - Fatal编程技术网

C++ 如何禁用动态频率缩放?

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电源管理对话框中

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

是否有一种方法可以通过编程(C++,Windows)确定是否启用了动态频率缩放?如果,可以在程序中禁用此功能吗

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


更新:即使我在BIOS中禁用SpeedStep,cpu-z也会显示Windows XP中的频率在1995和2826 GHz之间变化,更高版本的cpu速度由电源策略管理。如果在Windows电源管理对话框中设置“最大性能”模式,它不会关闭缩放功能吗

还有一些第三方工具,例如


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

通常,您需要执行以下步骤:

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

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

  • 要禁用CPU节流,需要将ProcessorMinThrottle和ProcessorMaxThrottle设置为
    100%
    。为此,再次调用
    CallNtPowerInformation()
    ,并将SystemPowerCapabilities传递给InformationLevel参数;但是现在,将lpInputBuffer设置为SYSTEM\u POWER\u CAPABILITIES结构,其中两个成员已设置为
    100%
    。我相信你知道下一步该做什么

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

进一步阅读

到目前为止,上述
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