c++ - 尝试在 Windows PC 上禁用处理器空闲状态(C 状态)

标签 c++ windows cpu cpu-usage perfmon

我需要防止处理器进入空闲状态(非 C0 C 状态)。诚然,我对处理器 C 和 P 状态知之甚少,所以请耐心等待。 我们使用来自第三方供应商的相机,偶尔会提供损坏的帧。供应商已确定,当 CPU 进入空闲状态时,它会干扰通过火线传输帧。 为了确认这一点,我在 Windows 7 PC 上使用了以下代码,实际上,禁用空闲状态解决了这个问题。

   //WIN7
const DWORD DISABLED = 1;
const DWORD ENABLED = 0;
GUID *scheme;
PowerGetActiveScheme(NULL, &scheme);
PowerWriteACValueIndex(NULL, scheme, &GUID_PROCESSOR_SETTINGS_SUBGROUP, &GUID_PROCESSOR_IDLE_DISABLE, DISABLED);
PowerSetActiveScheme(NULL, scheme);

如果我运行我的应用程序并打开 Windows permon 并添加 %C1 时间、%C2 时间和 %C3 时间,当我禁用这些状态时我看到它们都为零,当我启用它们时我看到相当多的时间处于 C3 状态(这是在 Dell Precision T3500 四核 PC 上)。

我还需要在 XP 上执行此操作,但这些调用在 XP 上不可用。所以我尝试执行以下操作来禁用空闲状态

  unsigned int ActPwrSch; 
DWORD currPolicy,newPolicy, curr1Policy,curr2Policy, new1Policy, new2Policy;
MACHINE_PROCESSOR_POWER_POLICY Policy; 
if(GetActivePwrScheme(&ActPwrSch)) 
{ 
    if(ReadProcessorPwrScheme(ActPwrSch,&Policy)) 
    { 
        printf("Read Power Scheme:\n"); 
        //if(Policy.ProcessorPolicyAc.DisableCStates!=0) 
        currPolicy = Policy.ProcessorPolicyAc.Policy[0].AllowPromotion;
        curr1Policy = Policy.ProcessorPolicyAc.Policy[1].AllowPromotion;
        curr2Policy = Policy.ProcessorPolicyAc.Policy[2].AllowPromotion;
        Policy.ProcessorPolicyAc.Policy[0].AllowPromotion = 0;
        Policy.ProcessorPolicyAc.Policy[1].AllowPromotion = 0;
        Policy.ProcessorPolicyAc.Policy[2].AllowPromotion = 0;
        newPolicy = Policy.ProcessorPolicyAc.Policy[0].AllowPromotion;

        if(WriteProcessorPwrScheme(ActPwrSch,&Policy)) 
        { 
            printf("WriteProcessorPwrScheme succeed\n"); 
            if(SetActivePwrScheme(ActPwrSch,0,0)) 
            { 
                printf("SetActivePwrScheme succeed!!\n");
            } 
        }

    } 

然而,当我运行我的应用程序时,我仍然看到处理器在 C1 状态下花费时间(通过查看 perfmon 中的相同计数器)。而且我仍然遇到损坏的图像问题。 XP PC 是单核 Dell optiplex PC。

有人知道如何防止在 XP 上进入任何 C1-C3 状态吗?正如我所说,我似乎已经在 Windows 7 上完成了。

最佳答案

您可以使用 SetThreadExecutionState 函数,使应用程序能够通知系统它正在使用中。

编辑:经过一些研究和测试,我找到了一个解决方案,或者我认为我找到了。您在 Windows XP 的正确轨道上。如果您阅读 PROCESSOR_POWER_POLICY 结构的文档,您会注意到您可以禁用每个冒犯您的 C 状态:

Policy[0].AllowPromotion = 0; // Disable's C1 (usually C1 won't cause problems, so you should leave it alone.)
Policy[1].AllowPromotion = 0; // Disable's C2
Policy[2].AllowPromotion = 0; // Disable's C3


在 Vista 和 Windows7 中,您不能使用此界面,而必须这样做:

GUID *scheme;
PowerGetActiveScheme(NULL, &scheme); 
PowerWriteACValueIndex(NULL, scheme, &GUID_PROCESSOR_SETTINGS_SUBGROUP,  &GUID_PROCESSOR_IDLE_DISABLE, 1); 
PowerSetActiveScheme(NULL, scheme);


我还没有找到在 Vista 和 Windows 7 上禁用单个 C 状态的方法。如果您需要一些示例代码,请给我发电子邮件,我可以帮助您。

关于c++ - 尝试在 Windows PC 上禁用处理器空闲状态(C 状态),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9721218/

相关文章:

c++ - int* 到常量数组

c++ - 在 C++11 中保存随机数生成器状态

windows - 自定义 Windows 文件夹图标

memory - 计算处理器的最大内存带宽

c++ unordered_map 与 g++ 的编译问题

c++ - "Universal character name conversion"在 C++ 中是什么意思?

c++ - 当我从剪贴板粘贴到外部程序时,为什么 Qt 程序会处理剪贴板数据?

c# - 自定义 Windows 7 登录

optimization - 会无条件跳转刷新 x86_64 上的管道吗?

c - 用于 CPU 使用的 Linux C API