2012-06-07 7 views
7

Me he dado cuenta de que varios de mis cálculos de subprocesos múltiples se ejecutan más rápido si desactivo el subprocesamiento en el BIOS.¿Deshabilitar hyperthreading vs. cambiar ProcessorAffinity?

También he aprendido que mediante programación puedo desactivar la CPU (lógico): s mediante la modificación de la afinidad del procesador para el proceso actual, por ejemplo como este en C#:

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

al menos desde un punto de rendimiento de vista, deshabilitar cada segundo (lógico) CPU al cambiar la afinidad del procesador tiene el mismo efecto que deshabilitar hyperthreading por completo?

+1

Hmm, la cuestión clave es: ¿vas a enviar tu máquina de desarrollo junto con tu software? –

+2

Otra consideración podrían ser los procesos del sistema operativo. Si desactiva hyperthreading en el BIOS y su software intenta utilizar todos los núcleos, cuando un sistema operativo (u otro proceso de fondo) intente ejecutarlo, competirá con su software para acceder al procesador. La mejor opción puede ser simplemente probar y comparar ambas opciones y ver qué diferencias encuentras en los tiempos del proceso; la diferencia puede ser intrascendente para permitir la facilidad de no deshabilitar hyperthreading. NOTA: Si no tiene control de hardware, verifique si hay procesadores AMD que tengan núcleos dedicados sin hyperthreading. –

+0

Gracias, Chris, una respuesta muy útil. Haré más benchmarking para ver si alguna de las opciones marcará una verdadera diferencia en un entorno de usuario normal. –

Respuesta

2

Usted puede intentar utilizar las API NUMA, o manualmente descubrir la topología de la CPU con la instrucción CPUID ... Pero IMHOthe mejor solución es hacer algunas configuraciones normales, y dejar que el usuario final ajustar la configuración de roscado. A menos que tenga un objetivo de hardware específico, hay una buena cantidad de escenarios posibles para manejar: núcleos lógicos contra físicos, hiperhilo o no, sistemas de uno o varios sockets, caché y topología de memoria.

+0

Gracias, snemarch. Interesante para aprender sobre [NUMA] (http://en.wikipedia.org/wiki/Non-Uniform_Memory_Access), esto era nuevo para mí. Sin dudas tiene usted razón, probablemente sea mejor proporcionar una solución general y dejar el ajuste del rendimiento al usuario final. Sin embargo, desde un punto de vista principal, ¿diría usted que no hay respuesta "sí o no" a mi pregunta original? –

+0

Depende de la naturaleza de su código y del hardware en el que se ejecuta :): si su código lucha por unidades de ejecución, entonces no se ejecuta en núcleos HT (que * no necesariamente * tiene que ser cada 2º) puede ayudar . Pero hay bastante diferencia entre P4, Core2 y lo que AMD está haciendo. – snemarch

Cuestiones relacionadas