2010-04-04 12 views
6

Ho bisogno di un modo affidabile per rilevare quanti core CPU ci sono su un computer. Sto creando un'applicazione di simulazione numerica numericamente intensa e voglio creare il numero massimo di thread in esecuzione come core. Ho provato molti dei metodi suggeriti su Internet come Environment.ProcessorCount, usando WMI, questo codice: http://blogs.adamsoftware.net/Engine/DeterminingthenumberofphysicalCPUsonWindows.aspx Nessuno di loro sembra pensare che un AMD X2 abbia due core. Qualche idea?C'è un modo per rilevare in modo affidabile il numero totale di core della CPU?

Modifica: sembra che Environment.ProcessorCount restituisca il numero corretto. È su una CPU Intel con hyperthreading che restituisce il numero sbagliato. Un core signle con hyperthreading restituisce 2, quando dovrebbe essere 1.

+0

Il tuo collegamento non funziona atm ... – ChristopheD

+0

Quanti processori vedi in Taskmgr.exe, scheda Prestazioni? –

+0

Il collegamento funzionava l'altro giorno. –

risposta

6

Da quello che posso dire, Environment.ProcessorCount potrebbe restituire un valore errato durante l'esecuzione in WOW64 (come un processo a 32 bit su un sistema operativo a 64 bit) perché la firma P/Invoke si basa su utilizza GetSystemInfo anziché GetNativeSystemInfo. Sembra un problema ovvio , quindi non sono sicuro del motivo per cui non sarebbe stato risolto da questo punto.

Provate questo e vedere se si risolve il problema:

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

Avete controllato la variabile d'ambiente NUMBER_OF_PROCESSORS?

+0

Questo mostra 8 sul mio i7, quindi vengono contati i core iperthreading –

2

Si ottiene il numero di processori corretto, AMD X2 è un vero processore multi-core. Un core Intel hyperthreaded è gestito da Windows come una CPU muti-core. È possibile scoprire se viene utilizzato o meno hyperthreading con WMI, Win32_Processor, NumberOfCores vs NumberOfLogicalProcessors.

Problemi correlati