2012-03-15 41 views
7

Tôi cần ngăn bộ xử lý vào trạng thái không hoạt động (trạng thái không C0 C). Phải thừa nhận rằng tôi không biết nhiều về bộ vi xử lý C và P bang nên chịu với tôi. Chúng tôi sử dụng máy ảnh từ nhà cung cấp bên thứ ba, thỉnh thoảng cung cấp khung bị hỏng. Nhà cung cấp đã xác định rằng khi CPU đi vào trạng thái không hoạt động, nó can thiệp vào việc truyền khung hình qua firewire. Để xác nhận điều này, tôi đã sử dụng mã sau trên máy tính Windows 7 và thực sự, vô hiệu hóa trạng thái không hoạt động đã giải quyết được sự cố.Cố gắng vô hiệu hóa Trạng thái không hoạt động của bộ xử lý (trạng thái C) trên Windows 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); 

Nếu tôi chạy ứng dụng của tôi và mở Windows permon và thêm% C1 Time,% C2 Thời gian và thời gian% C3 Tôi thấy rằng họ là tất cả không khi tôi vô hiệu hóa những tình trạng này, khi tôi cho phép chúng tôi thấy khá một chút thời gian ở trạng thái C3 (đây là trên một máy tính lõi tứ Dell Precision T3500).

Tôi cũng cần thực hiện điều này trên XP tuy nhiên các cuộc gọi này không khả dụng trên XP. Vì vậy, tôi đã cố gắng làm như sau để vô hiệu hóa các trạng thái nhàn rỗi

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"); 
      } 
     } 

    } 

Tuy nhiên khi tôi chạy ứng dụng của tôi, tôi vẫn thấy rằng bộ vi xử lý được dành nhiều thời gian ở trong trạng thái C1 (bằng cách nhìn vào các quầy cùng trong perfmon). Và tôi vẫn nhận được vấn đề hình ảnh bị hỏng của tôi. Máy tính XP là một máy tính đơn lõi Dell Optiplex.

Có ai biết cách tôi có thể ngăn truy cập vào bất kỳ trạng thái C1-C3 nào trên XP không? Như tôi đã nói có vẻ như tôi đã thực hiện nó trên Windows 7.

+3

Ồ, nghe có vẻ đau đớn. Tôi cho rằng nhà cung cấp chỉ cần cung cấp một trình điều khiển mà * hoạt động * là ra khỏi câu hỏi? – jalf

+0

Bạn không chắc chắn nếu điều này là hoàn toàn có liên quan, nhưng sẽ không thiết lập 'Policy.ProcessorPolicyAc.DynamicThrottle' để' PO_THROTTLE_NONE' có thể giúp đỡ? – Hasturkun

+0

Ha ... có vẻ như bây giờ là jalf. Chúng tôi đang làm việc để thay đổi nhà cung cấp nhưng hiện tại tôi đang bị kẹt. Thực sự đau đớn. – mash

Trả lời

2

Bạn có thể sử dụng chức năng SetThreadExecutionState cho phép ứng dụng thông báo cho hệ thống đang sử dụng.

EDIT: Sau một ít nghiên cứu và thử nghiệm, tôi đã đến một giải pháp hoặc tôi nghĩ rằng tôi đã làm. Bạn đang đi đúng hướng cho Windows XP. Nếu bạn đọc tài liệu cho cấu trúc PROCESSOR_POWER_POLICY, bạn sẽ nhận thấy bạn có thể vô hiệu hóa mỗi C-bang mà xúc phạm bạn:

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 


Trong Vista và Windows7 bạn không thể sử dụng giao diện này thay vào đó bạn đã làm điều này:

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


tôi đã không tìm thấy một cách để vô hiệu hóa cá nhân C tiểu bang o n Vista và Windows 7. Nếu bạn cần một số mã mẫu, vui lòng gửi email cho tôi Tôi có thể giúp bạn.

+0

Tôi đã thử điều này, tôi nghĩ rằng điều này sẽ ngăn chặn máy tính đi ngủ nhưng không có ảnh hưởng đến các trạng thái C của CPU cá nhân? Tôi không chắc ... nhưng CPU của tôi vẫn vào trạng thái C1.Thanks – mash

+0

Đã cập nhật. Hãy cho tôi biết cách nó hoạt động. –

+0

Hey Dylan, tôi thực sự có cùng mã trong bài đăng gốc. Đối với một số lý do mã XP dường như không hoạt động. Tôi vẫn thấy CPU của tôi vào trạng thái C1. Trên Win7 tôi không thấy CPU vào trạng thái C1. – mash

2

Điều này dường như được làm việc cho tôi:

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); 
    } 
} 
+0

Cảm ơn bạn đã thử cách này. Khi tôi chạy nó, tôi thấy rằng CPU sẽ không nhập C2 hoặc trạng thái C3 nhưng nó sẽ vào trạng thái C1. Tôi đã thử điều này trên nhiều hệ thống XP (lõi đơn và đa lõi) và tôi nhận được kết quả tương tự. Có vẻ như tôi không thể ngăn hệ thống xâm nhập tất cả các trạng thái C trên XP. Trên Win7 có vẻ như tôi có thể. – mash

+0

Tôi đã gửi email cho bạn. Dường như tất cả các trạng thái C không thể bị vô hiệu hóa trên XP như chúng có thể trên Windows 7. Tôi đã thử chơi xung quanh với các thiết lập AllowDemotion nhưng điều đó dường như không có hiệu lực. – mash

2

Chắc chắn một TSR chạy một tính toán mỗi 5 phút sẽ ngăn chặn một trạng thái nhàn rỗi? Hoặc bạn có thể mua bộ mô phỏng chuột phần cứng hoặc phần mềm giá rẻ gửi tín hiệu di chuyển chuột tại các khoảng thời gian xác định.

+1

Loại điều này có thể đảm bảo rằng bản thân máy tính sẽ không đi ngủ, nhưng nó sẽ không ngăn máy tính quyết định rằng nó không cần tất cả bốn lõi CPU đang chạy và đặt một hoặc nhiều CPU để ngủ. –

Các vấn đề liên quan