2009-10-29 16 views
5

Tôi đang gặp sự cố với mã dựa trên CPUID của tôi trên các máy dựa trên i7 mới hơn. Nó phát hiện CPU là có một lõi đơn với 8 HT đơn vị thay vì 4 lõi mỗi với 2 HT đơn vị.CPUID trên bộ vi xử lý Intel i7

Tôi phải hiểu sai kết quả của thông tin CPUID sắp trở lại từ CPU, nhưng tôi không thể thấy cách thực hiện.

Về cơ bản, tôi lặp qua từng bộ xử lý hiển thị với Windows, đặt ái lực luồng cho chuỗi đó và sau đó tạo chuỗi các cuộc gọi CPUID.

args = new CPUID_Args(); 
args.eax = 1; 
executeHandler(ref args); 
if (0 != (args.edx & (0x1 << 28))) 
{ 
    //If the 28th bit in EDX is flagged, this processor supports multiple logical processors per physical package 
    // in this case bits 23:16 of EBX should give the count. 
//** EBX here is 0x2100800 
    logicalProcessorCount = (args.ebx & 0x00FF0000) >> 16; 
//** this tells me there are 16 logical processors (wrong) 
} 
else 
{ logicalProcessorCount = 1; } 
apic = unchecked((byte)((0xFF000000 & args.ebx) >> 24)); 

if (maximumSupportedCPUID >= 4) 
{ 
    args = new CPUID_Args(); 
    args.eax = 4; 
    executeHandler(ref args); 
//EAX now contains 0x1C004121 
    coreCount = 1 + ((args.eax & 0xFC000000) >> 26); 
//This calculates coreCount as 8 
} 
else 
{ coreCount = 1; } 

Chuỗi này lặp lại cho phần còn lại của CPU trong hệ thống.

Có ai phải đối mặt với điều này trước đây không?

+0

Hey StarPacker, mặc dù tôi sợ rằng tôi sẽ không thể giúp bạn về vấn đề cụ thể này Tôi có một câu hỏi liên quan: http://stackoverflow.com/questions/1666093/cpuid-implementations-in-c Tôi đã tự hỏi nếu bạn có thể đặt tôi trên con đường chính xác với một số mã ví dụ hay cái gì đó ... Tôi thực sự muốn có hỗ trợ X86/X64 cho CPUID trong ứng dụng của tôi để lấy lại thông tin bộ xử lý/tính năng trong báo cáo sự cố cho ứng dụng tôi đang phát triển và sẽ được các nhà nghiên cứu đồng nghiệp sử dụng (ho sẽ chạy mã của tôi trên máy tôi sẽ không thể truy cập trực tiếp). Chúc mừng, Kris – Kris

Trả lời

5

Câu hỏi thú vị - rất tiếc là tôi không có i7 để chơi, vì vậy tôi chỉ có thể đoán ở đây.

Có thể hữu ích khi xem this article - trong khi về nguyên tắc, cách tiếp cận của bạn có vẻ chính xác, họ nêu ra một vài thông báo. Có thể có một đọc và xem liệu ở bất kỳ giai đoạn bất kỳ giả định của bạn có thể sai. Về cơ bản, chúng sử dụng CPUID.1.EBX [23:16] (bộ xử lý đăng nhập tối đa # trong gói vật lý), CPUID.4.EAX [31:26] +1 (số lõi tối đa trong một gói vật lý) và CPUID.4 .EAX [25:14] +1 (tối đa # bộ xử lý nhật ký trong gói vật lý chia sẻ bộ nhớ cache mức mục tiêu) để suy ra cấu trúc liên kết của bộ vi xử lý - dọc theo dòng của những gì bạn đang làm.

Thứ hai, thay vào đó, trên CPU hỗ trợ chức năng CPUID EAX = 0Bh (xem Intel's docs here), bạn có thể sử dụng hàm này để thay thế các thông số bạn muốn. Có lẽ so sánh kết quả của hai cách tiếp cận có thể được chiếu sáng?

--Chỉnh sửa-- This là một bài viết rất hữu ích bao gồm cả hai phương pháp trên. Về cơ bản, tôi thu thập rằng trên một i7, CPUID.0B là biến thể ưa thích.

+0

Cảm ơn bạn đã trả lời câu hỏi này. Đáng tiếc là nó không được chấp nhận vì nó trả lời câu hỏi này một cách hoàn hảo. – ttvd

+0

Tôi đang gặp vấn đề này trên i5-560m, trong đó CPUID.1.EBX [23:16] đang báo cáo 16 bộ xử lý logic thay vì 4. Tôi không biết tại sao nó trả lại kết quả không chính xác. Trong khi bài viết đầu tiên mà PhiS liên kết đến có thể chứa câu trả lời thì nó đã bị gỡ xuống. Các liên kết khác không thực sự cung cấp câu trả lời. Ngay cả khi một phương pháp thay thế hoạt động, vẫn không có vẻ là bất kỳ vần điệu hay lý do nào tại sao phương pháp đầu tiên lại không. : -/ –

+0

Ah - bài viết thứ hai trên thực tế nói tại sao CPUID.1.EBX [23:16] không hoạt động: Trái ngược với những gì AP-485 ngụ ý, nó không thực sự trả về số lượng thực sự của các bộ xử lý logic: "CPUID.1: EBX [23:16] đại diện cho số lượng ID địa chỉ tối đa (ID APIC ban đầu) có thể được gán cho bộ xử lý logic trong gói vật lý. Giá trị có thể không giống với số lượng bộ xử lý logic có mặt trong phần cứng của một gói vật lý. " Argh, công cụ đơn giản nhất được chôn sâu như vậy ... như thể các nhà phát triển ứng dụng quan tâm nhiều hơn về lý thuyết tối đa so với số lượng chủ đề thực tế. –