正在尝试禁用Windows PC上的处理器空闲状态(C状态)
Trying to disable Processor idle states (C states) on Windows PC
我需要防止处理器进入空闲状态(非C0 C状态)。诚然,我对处理器C和P状态了解不多,所以请耐心等待。我们使用第三方供应商的相机,该供应商偶尔会提供损坏的相框。供应商已经确定,当CPU进入空闲状态时,它会干扰火线上的帧传输。为了确认这一点,我在Windows7 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 succeedn");
if(SetActivePwrScheme(ActPwrSch,0,0))
{
printf("SetActivePwrScheme succeed!!n");
}
}
}
然而,当我运行应用程序时,我仍然会看到处理器在C1状态下花费时间(通过查看perfmon中的相同计数器)。我仍然有损坏的图像问题。XP PC是单核Dell optiplex PC。
有人知道我如何在XP上防止进入任何C1-C3状态吗?正如我所说的,我似乎是在Windows7上完成的。
您可以使用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和Windows7上禁用个别C状态的方法。如果你需要一些示例代码,请给我发电子邮件,我可以帮你。
这似乎对我有效:
void PowerState(bool bEnable)
{
// CPU idle state
unsigned int ActPwrSch;
MACHINE_PROCESSOR_POWER_POLICY Policy;
if (GetActivePwrScheme(&ActPwrSch))
{
if (ReadProcessorPwrScheme(ActPwrSch, &Policy))
{
Policy.ProcessorPolicyAc.Policy[0].AllowPromotion = bEnable ? 1: 0; // C1
Policy.ProcessorPolicyAc.Policy[1].AllowPromotion = bEnable ? 1: 0; // C2
Policy.ProcessorPolicyAc.Policy[2].AllowPromotion = bEnable ? 1: 0; // C3
if (WriteProcessorPwrScheme(ActPwrSch, &Policy))
SetActivePwrScheme(ActPwrSch, 0, 0);
}
}
OSVERSIONINFO osvi;
memset(&osvi, 0, sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&osvi);
// For Vista and above
if (osvi.dwMajorVersion >= 6)
{
static const GUID processor_idle_disable_guid = {0x5d76a2ca, 0xe8c0, 0x402f, 0xa1, 0x33, 0x21, 0x58, 0x49, 0x2d, 0x58, 0xad};
GUID *scheme;
PowerGetActiveScheme(NULL, &scheme);
PowerWriteACValueIndex(NULL, scheme, &GUID_PROCESSOR_SETTINGS_SUBGROUP, &processor_idle_disable_guid, bEnable ? 0 : 1);
PowerSetActiveScheme(NULL, scheme);
}
}
TSR每5分钟运行一次数学计算肯定会防止空闲状态吗?或者,你可以购买一个便宜的硬件或软件鼠标模拟器,它可以按规定的时间间隔发送鼠标移动信号。
- #定义c-预处理器常量..我做错了什么
- 预处理器:插入结构名称中的前一个行号
- 如何在c++中实现处理器调度模拟器
- C/C++预处理器是否可以检测一些编译器选项
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 在clang++预处理器中确定gcc工具链版本
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- OSX MetalKit CVMetalTextureCacheCreateTextureFromImage失败,状态:
- 不同/较旧的处理器运行c++代码的方式是否不同
- 用于交叉编译和CMake的预处理器宏的单元测试
- std::future_error:无关联状态
- 有没有办法在从编译器获取参数时避免预处理器宏?
- 如何避免LED在循环状态变化中闪烁?
- 如何比较两个同名的预处理器宏?
- boost 是否有按特殊类型值编码状态"compact optional"?
- 从预处理器获取 Windows 版本(C++ Win32)
- Win32逻辑块预处理器显示为非活动状态
- 正在尝试禁用Windows PC上的处理器空闲状态(C状态)
- 最小(最大)处理器状态API, c++