2010-10-04 28 views
5

Tenemos un MacPro de 12 núcleos para hacer algunos cálculos de Monte Carlo. Sus procesadores Intel Xeon tienen Hyper-Threading (HT) habilitado, por lo que en realidad debería haber 24 procesos en paralelo para que sean totalmente utilizados. Sin embargo, nuestros calcs son más eficientes para ejecutarse en 12x100% que en 24x50%, por lo que tratamos de desactivar Hyper-Threading a través del panel Processor en las preferencias del sistema para obtener un mayor rendimiento. También se puede convertir HT fuera porDesactivando Hyper-Threading en 6-core Intel Xeon

hwprefs -v cpu_ht=false 

Entonces nos encontramos con algunas pruebas y aquí es lo que conseguimos:

  1. 12 tareas paralelas se ejecutan al mismo tiempo w/o W/O HT a nuestra decepción.
  2. 24 tareas paralelas suelta 20% si HT está apagado (no -50%, ya que pensamos)
  3. Cuando HT está en, el cambio de 24 a 12 tareas disminuye la eficiencia al 20% (también sorprendente)
  4. Cuando HT está desactivado, cambiar de 24 a 12 no cambia nada.

Parece que Hyper-Threading solo disminuye el rendimiento para nuestros cálculos y no hay forma de evitarlo. El programa que utilizamos para los calcs está escrito en Fortran y compilado con gfortran. ¿Hay alguna manera de hacerlo más eficiente con esta pieza de hardware?


Actualización: Nuestros cálculos Monte Carlo (MCC) se realiza normalmente en medidas para evitar la pérdida de datos y debido a otras razones (que no siempre es posible evitar este tipo de medidas). En nuestro caso, cada paso consiste en muchas simulaciones con duración variable. Como cada paso se divide entre varias tareas paralelas, también tienen una duración variable. Esencialmente, todas las tareas más rápidas tienen que esperar hasta que se haga lo más lento. Este hecho nos obliga a dar pasos más grandes, que finalizan con una menor desviación en el tiempo debido al promedio, por lo que los procesadores no pierden el tiempo esperando. Esta es nuestra motivación para tener 12 * 2.66 GHz en lugar de 24 * 1.33 GHz. Si fuera posible apagar HT, obtendríamos un rendimiento de + 10% cambiando de 24 tareas con HT a 12 tareas sin HT. Sin embargo, las pruebas muestran que perdemos un 20%. Entonces mi conclusión es que el cálculo es 30% ineficiente.

Para las pruebas utilicé pasos bastante grandes, sin embargo, generalmente los pasos son más cortos, por lo que la eficiencia es aún mayor.

Hay una razón más: algunos de nuestros cálculos requieren 3-5 GB de memoria, por lo que probablemente vea cuán económico sería para nosotros tener 12 tareas rápidas. Estamos trabajando para implementar la memoria compartida, pero va a ser un proyecto a largo plazo. Por lo tanto, necesitamos saber cómo hacer que el hardware/software existente sea lo más rápido posible.

+0

http://forums.macrumors.com/archive/index.php/t-733238.html – rwong

+0

Normalmente esto se puede desactivar en la configuración del BIOS, pero no estoy familiarizado con los Mac, por lo que es posible que no se aplique. –

+2

Hay algo extraño en tu pregunta ... Parece que * ganas * de HyperThreading, sin embargo, ¿lo inhabilitarías? Usted dice que su cálculo es más eficiente con 12 // que 24, pero sus pruebas parecen indicar lo contrario. Entonces, ¿por qué quieres deshabilitar HT? – jv42

Respuesta

7

Esto es más de un comentario extenso que una respuesta:

no encuentro sus observaciones tremendamente sorprendente. Hyper-Threading es un enfoque de paralelismo de un hombre pobre, le permite tener 2 tuberías de instrucciones pendientes en una CPU. Pero no proporciona unidades aritméticas de coma flotante o entero adicionales o más registros; cuando una tubería es incapaz de alimentar a la ALU (o lo que se llame en estos días) la otra tubería se activa dentro de un ciclo de reloj o dos. Esto contrasta con la situación en una CPU sin hyperthreading, donde, cuando la tubería de instrucciones se detiene, debe enjuagarse y rellenarse con las instrucciones de otro proceso antes de que la CPU vuelva a la velocidad.

El Wikipedia article on hyperthreading explica todo esto bastante bien.

Si está ejecutando cargas en las que los puestos de tuberías están perfectamente sincronizados y representan una parte importante del tiempo total de ejecución de su mezcla de programas, entonces puede duplicar la velocidad de un programa al pasar de un procesador sin hibernación a un procesador de hyperthreaded .

SI (eso es un gran si) podrías escribir un programa que nunca se detuvo en la tubería de instrucciones, entonces el hyperthreading no proporcionaría ningún beneficio (en términos de aceleración de ejecución) en absoluto. Lo que ha medido no es una aceleración debido a HT (bueno, es una aceleración debido a HT pero realmente no lo quiere), pero la falla de sus hilos para mantener la tubería en movimiento.

¡Lo que tienes que hacer es en realidad disminuir la aceleración debido al HT! O, más bien, debe aumentar la tasa de ejecución de los 12 procesos (uno por núcleo) manteniendo la tubería llena. Personalmente, desactivaría hyperthreading mientras optimizaba la ejecución del programa en 12 núcleos.

Diviértete.

1

Bueno, eso significa que con HT activado, el cambio de 12 tareas a 24 tareas aumenta la eficiencia en un 20%! Buena evaluación comparativa

Por otro lado, si su programa está escrito para que cada subproceso solo pueda funcionar en una tarea separada (en lugar de poder dividir una sola tarea en trozos más pequeños y proceder concurrentemente), entonces con el fin de reducir la latencia para cada tarea (de principio a fin) simplemente necesita limitar la cantidad de hilos a 12 en el software. El conmutador HT de hardware puede permanecer en cualquier posición.

2

Tengo un poco de dificultad para entender su descripción de los puntos de referencia.

Permite definir el 100% de la cantidad de trabajo que logras hacer con 12 tareas y ht apagado. Y si pudieras hacer el doble en el mismo período de tiempo, lo llamaríamos 200%. Entonces, ¿cuáles son los números que pondría en las otras tres cajas?

Editar: Actualizado con sus números.

   without HT  with HT 
12 tasks  100%   100% 
24 tasks  100%   125% 

lo tanto, mi opinión es que con discapacitados HT, hay lagunas de tiempo, mientras que los hilos están en pausa básicamente (como cuando están a la espera de datos de la memoria o de disco), por lo que en realidad no correr a 2,66 GHz, pero un poco menos. Con hyperthreading habilitado, el CUP cambia las tareas en lugar de pausar estas brechas momentáneas, por lo que aumenta la cantidad total de potencia de procesamiento que se utiliza.

+0

su mesa es una gran idea. '12 + HT = 100%', '24 + HT = 125%', '24-HT = 100%'. Esperaba obtener '12-HT = 125-140%' en lugar de 100. Pero esto parece ser imposible. –

0

Ver esta publicación para una aplicación en herramientas de Xcode para habilitar/deshabilitar el hyperthreading (y el número de CPU activas). La configuración NO persiste durante el modo de suspensión o reinicio: http://www.logicprohelp.com/forum/viewtopic.php?f=5&t=88835

(Ejecuta la aplicación Instruments, cancela la pantalla inicial y luego cambia las Preferencias de la CPU).

Cuestiones relacionadas