2012-06-07 19 views
7

Ho notato che molti dei miei calcoli multi-thread sono più veloci se disattivo l'hyper-threading nel BIOS.Disabilitare l'hyperthreading e cambiare ProcessorAffinity?

Ho anche imparato che posso programmazione disabilitare la CPU (logico): s modificando l'affinità del processore per il processo corrente, per esempio come questo in C#:

// using System.Diagnostics; 
var current = Process.GetCurrentProcess(); 
var affinity = current.ProcessorAffinity.ToInt32(); 
current.ProcessorAffinity = new IntPtr(affinity & 0x5555); 

Almeno dal punto prestazione di visualizzazione, disabilitando ogni seconda CPU (logica) modificando l'affinità del processore si ottiene lo stesso effetto di disabilitare completamente l'hyperthreading?

+1

Hmm, il problema chiave è: hai intenzione di spedire la tua macchina dev con il tuo software? –

+2

Un'altra considerazione potrebbe essere i processi del sistema operativo. Se si disabilita l'hyperthreading nel BIOS e il software tenta di utilizzare tutti i core, quando un processo del sistema operativo (o altro processo in background) tenta di essere eseguito, sarà in concorrenza con il software per l'accesso al processore. La cosa migliore potrebbe essere semplicemente provare e confrontare entrambe le opzioni e vedere quali differenze si trovano nei tempi del processo; la differenza potrebbe essere irrilevante per consentire la facilità di non disabilitare l'hyperthreading. NOTA: se non si dispone del controllo hardware, controllare i processori AMD che dispongono di core dedicati senza hyperthreading. –

+0

Grazie, Chris, una risposta molto utile. Farò qualche altro benchmarking per vedere se una qualsiasi delle opzioni farà la differenza in un normale ambiente utente. –

risposta

2

Puoi provare a utilizzare le API NUMA o scoprire manualmente la topologia della CPU con l'istruzione CPUID ... Ma IMHO la soluzione migliore sta facendo alcune impostazioni predefinite corrette e consente all'utente finale di modificare le impostazioni di threading. A meno che tu non abbia un obiettivo hardware specifico, c'è una buona parte dei possibili scenari da gestire: i core logici e quelli fisici, iper-threading o no, i sistemi a singolo o multi-socket, la cache e la topologia della memoria.

+0

Grazie, snemarch. Interessante da sapere su [NUMA] (http://en.wikipedia.org/wiki/Non-Uniform_Memory_Access), questo era nuovo per me. Hai sicuramente ragione, probabilmente è meglio fornire una soluzione generale e lasciare le prestazioni modificate all'utente finale. Da un punto di vista principale, diresti che non esiste una risposta "sì o no" alla mia domanda iniziale? –

+0

Dipende dalla natura del tuo codice e dall'hardware su cui gira :) - se il tuo codice combatte per unità di esecuzione, allora non girare su core HT (che * necessariamente * non devono essere ogni 2) può aiutare . Ma c'è una certa differenza tra P4, Core2 e ciò che AMD sta facendo. – snemarch