2010-04-04 32 views
6

Tôi cần một cách đáng tin cậy để phát hiện số lõi CPU trên máy tính. Tôi đang tạo một ứng dụng C# mô phỏng số lượng dữ dội và muốn tạo số lượng chủ đề chạy tối đa làm lõi. Tôi đã thử nhiều phương pháp được đề xuất trên Internet như Environment.ProcessorCount, sử dụng WMI, mã này: http://blogs.adamsoftware.net/Engine/DeterminingthenumberofphysicalCPUsonWindows.aspx Không ai trong số họ có vẻ nghĩ rằng AMD X2 có hai lõi. Ý tưởng nào?Có cách nào để phát hiện đáng tin cậy tổng số lõi CPU không?

Chỉnh sửa: có vẻ như Environment.ProcessorCount đang trả về đúng số. Đó là trên một CPU intel với hyperthreading đó là trả về số sai. Một lõi signle với siêu phân luồng đang trở về 2, khi nó chỉ nên là 1.

+0

Liên kết của bạn không hoạt động ... – ChristopheD

+0

Bạn có thấy bao nhiêu bộ xử lý trong Taskmgr.exe, tab Hiệu suất? –

+0

Liên kết đang hoạt động vào một ngày khác. –

Trả lời

6

Từ những gì tôi có thể biết, Environment.ProcessorCount có thể trả về giá trị không đúng khi chạy dưới WOW64 (như một quá trình 32 bit trên hệ điều hành 64 bit) vì chữ ký P/Invoke, nó dựa trên việc sử dụng GetSystemInfo thay vì GetNativeSystemInfo. Điều này có vẻ giống như một sự cố rõ ràng , vì vậy tôi không chắc chắn tại sao nó sẽ không được giải quyết trước thời điểm này.

Hãy thử điều này và xem nếu nó giải quyết vấn đề này:

private static class NativeMethods 
{ 
    [StructLayout(LayoutKind.Sequential)] 
    internal struct SYSTEM_INFO 
    { 
     public ushort wProcessorArchitecture; 
     public ushort wReserved; 
     public uint dwPageSize; 
     public IntPtr lpMinimumApplicationAddress; 
     public IntPtr lpMaximumApplicationAddress; 
     public UIntPtr dwActiveProcessorMask; 
     public uint dwNumberOfProcessors; 
     public uint dwProcessorType; 
     public uint dwAllocationGranularity; 
     public ushort wProcessorLevel; 
     public ushort wProcessorRevision; 
    } 

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] 
    internal static extern void GetNativeSystemInfo(ref SYSTEM_INFO lpSystemInfo); 
} 

public static int ProcessorCount 
{ 
    get 
    { 
     NativeMethods.SYSTEM_INFO lpSystemInfo = new NativeMethods.SYSTEM_INFO(); 
     NativeMethods.GetNativeSystemInfo(ref lpSystemInfo); 
     return (int)lpSystemInfo.dwNumberOfProcessors; 
    } 
} 
-1

Bạn đã kiểm tra các biến môi trường NUMBER_OF_PROCESSORS?

+0

Điều này cho thấy 8 trên i7 của tôi, vì vậy lõi siêu phân luồng được tính ở đó –

2

Bạn đang nhận được số lượng bộ xử lý chính xác, AMD X2 là một bộ xử lý đa lõi thực sự. Một lõi hyperthreaded Intel được xử lý bởi Windows như một CPU muti-core. Bạn có thể tìm hiểu có hay không siêu phân luồng được sử dụng với WMI, Win32_Processor, NumberOfCores và NumberOfLogicalProcessors.

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