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

标签 c++ windows benchmarking cpu-speed

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

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

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

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

最佳答案

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

  • 调用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 内置命令行工具获取/设置 Windows 电源选项,即 PowerCfg .

进一步阅读

关于c++ - 如何禁用动态频率缩放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3975551/

相关文章:

c++ - 跟踪哈希工厂对象

c++ - 控制台应用去向c++

windows - 如何删除 Azure 上托管的 Windows 10N 中的 Hyper-V 角色

c++ - 带有 WS_EX_COMPOSITED 的无闪烁选项卡控件

java - 报告 JMH 基准测试的最大堆大小

c++ - Python ctypes 回调函数到 SWIG

c++ - 使用指针 C++ 创建一个临时数组

java - 数组应该比 ArrayList 快这么多吗?

node.js - 如何在 Windows 上部署具有深度 node_modules 结构的 Node.js 应用程序?

java - 是否有免费工具可以分析 Java 方法的执行时间?