如何禁用动态频率调整?

mar*_*nus 3 c++ windows benchmarking cpu-speed

我想做一些微基准测试,并尝试做正确的.不幸的是,动态频率调整使得基准测试非常不可靠.

有没有办法以编程方式(C++,Windows)找出是否启用了动态频率调整?如果,这可以在程序中禁用吗?

香港专业教育学院曾试图在实际基准测试发生前使用100%CPU的预热阶段,但事实证明这也是不可靠的.

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

Van*_*mex 8

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

  • 调用SystemPowerCapabilitiesCallNtPowerInformation()并将其传递给InformationLevel参数,设定lpInputBuffernInputBufferSizeNULL,则设置lpOutputBufferSYSTEM_POWER_CAPABILITIES结构,并设置nOutputBufferSize到所述结构的尺寸.在第一次调用之后,SYSTEM_POWER_CAPABILITIES结构包含当前系统的电源功能.要检查系统是否支持处理器限制,请读取ProcessorThrottle的值.

  • 还有其他两个我们感兴趣的成员,他们是ProcessorMinThrottleProcessorMaxThrottle ; 它们表示支持的系统处理器限制的最小和最大级别,以百分比表示.如果两个成员的值都已达到100%,则表示当前禁用CPU限制,因此您无需重新配置它.

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

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

进一步阅读

  • 从MSDN:SystemPowerCapabilities 4 - lpInBuffer参数必须为NULL,否则,该函数返回ERROR_INVALID_PARAMETER.有人确实验证了这个有效吗? (2认同)