Respuestas:
Como han dicho otros, esto depende completamente de la tarea.
Para ilustrar esto, veamos un punto de referencia real:
Esto fue tomado de mi tesis de maestría (actualmente no disponible en línea).
Esto muestra la aceleración relativa 1 de los algoritmos de coincidencia de cadenas (cada color es un algoritmo diferente). Los algoritmos se ejecutaron en dos procesadores Intel Xeon X5550 de cuatro núcleos con hyperthreading. En otras palabras: había un total de 8 núcleos, cada uno de los cuales puede ejecutar dos hilos de hardware (= "hyperthreads"). Por lo tanto, el punto de referencia prueba la aceleración con hasta 16 subprocesos (que es el número máximo de subprocesos concurrentes que esta configuración puede ejecutar).
Dos de los cuatro algoritmos (azul y gris) escalan más o menos linealmente en todo el rango. Es decir, se beneficia de hyperthreading.
Otros dos algoritmos (en rojo y verde; elección desafortunada para las personas daltónicas) escalan linealmente hasta 8 hilos. Después de eso, se estancan. Esto indica claramente que estos algoritmos no se benefician de hyperthreading.
¿La razón? En este caso particular es la carga de memoria; Los dos primeros algoritmos necesitan más memoria para el cálculo y están limitados por el rendimiento del bus de memoria principal. Esto significa que mientras un hilo de hardware está esperando memoria, el otro puede continuar la ejecución; Un excelente caso de uso para hilos de hardware.
Los otros algoritmos requieren menos memoria y no necesitan esperar al bus. Están vinculados casi por completo al cálculo y solo usan aritmética de enteros (operaciones de bits, de hecho). Por lo tanto, no hay potencial para la ejecución paralela y ningún beneficio de las tuberías de instrucciones paralelas.
1 Es decir, un factor de aceleración de 4 significa que el algoritmo se ejecuta cuatro veces más rápido que si se ejecutara con un solo hilo. Por definición, entonces, cada algoritmo ejecutado en un hilo tiene un factor de aceleración relativo de 1.
El problema es que depende de la tarea.
La noción detrás de hyperthreading es básicamente que todas las CPU modernas tienen más de un problema de ejecución. Por lo general, más cerca de una docena más o menos ahora. Dividido entre entero, coma flotante, SSE / MMX / Streaming (como se llame hoy).
Además, cada unidad tiene diferentes velocidades. Es decir, puede tomar un ciclo entero de la unidad matemática 3 procesar algo, pero una división de coma flotante de 64 bits puede tomar 7 ciclos. (Estos son números míticos no basados en nada).
La ejecución fuera de orden ayuda mucho a mantener las diversas unidades lo más llenas posible.
Sin embargo, una sola tarea no utilizará todas las unidades de ejecución en cada momento. Ni siquiera dividir hilos puede ayudar por completo.
Por lo tanto, la teoría se hace al pretender que hay una segunda CPU, otro subproceso podría ejecutarse en ella, usando las unidades de ejecución disponibles que no están en uso, por ejemplo, su transcodificación de audio, que es 98% SSE / MMX, y las unidades int y float son totalmente inactivo excepto por algunas cosas.
Para mí, esto tiene más sentido en un solo mundo de CPU, falsificar una segunda CPU permite que los subprocesos crucen más fácilmente ese umbral con poca (si alguna) codificación adicional para manejar esta segunda CPU falsa.
En el mundo central 3/4/6/8, que tiene CPUs 6/8/12/16, ¿ayuda? No sé. ¿Como mucho? Depende de las tareas a mano.
Entonces, para responder realmente a sus preguntas, dependería de las tareas en su proceso, qué unidades de ejecución está utilizando y en su CPU, qué unidades de ejecución están inactivas / infrautilizadas y disponibles para esa segunda CPU falsa.
Se dice que algunas 'clases' de material computacional se benefician (vagamente genéricamente). Pero no existe una regla estricta y rápida, y para algunas clases, ralentiza las cosas.
Tengo algunas pruebas anecdóticas para agregar a la respuesta de geoffc, ya que en realidad tengo una CPU Core i7 (4 núcleos) con hyperthreading y he jugado un poco con la transcodificación de video, que es una tarea que requiere una gran cantidad de comunicación y sincronización, pero tiene suficiente paralelismo de que efectivamente puede cargar completamente un sistema.
Mi experiencia al jugar con la cantidad de CPU asignadas a la tarea generalmente usando los 4 núcleos "extra" hiperprocesados equivalentes a un equivalente de aproximadamente 1 CPU extra de potencia de procesamiento. Los 4 núcleos "hiperprocesados" adicionales agregaron aproximadamente la misma cantidad de potencia de procesamiento utilizable que pasar de 3 a 4 núcleos "reales".
De acuerdo, esto no es estrictamente una prueba justa, ya que todos los hilos de codificación probablemente competirían por los mismos recursos en las CPU, pero para mí mostró al menos un pequeño impulso en la potencia de procesamiento general.
La única forma real de mostrar si realmente ayuda o no sería ejecutar algunas pruebas de tipo entero / punto flotante / SSE diferentes al mismo tiempo en un sistema con hyperthreading habilitado y deshabilitado y ver cuánta potencia de procesamiento está disponible en un sistema controlado medio ambiente.
Depende mucho de la CPU y la carga de trabajo, como han dicho otros.
El rendimiento medido en el procesador Intel® Xeon® MP con tecnología Hyper-Threading muestra ganancias de rendimiento de hasta un 30% en los puntos de referencia de aplicaciones de servidor comunes para esta tecnología
(Esto me parece un poco conservador).
Y hay otro artículo más largo (que aún no he leído) con más números aquí . Una conclusión interesante de ese documento es que el hyperthreading puede hacer que las cosas sean más lentas para algunas tareas.
La arquitectura Bulldozer de AMD podría ser interesante . Describen cada núcleo como efectivamente 1.5 núcleos. Es una especie de hyperthreading extremo o multi-core subestándar dependiendo de qué tan seguro esté de su probable rendimiento. Los números en esa pieza sugieren una aceleración de comentarios de entre 0.5x y 1.5x.
Finalmente, el rendimiento también depende del sistema operativo. Con suerte, el sistema operativo enviará procesos a CPU reales con preferencia a los hyperthreads que simplemente se hacen pasar por CPU. De lo contrario, en un sistema de doble núcleo, puede tener una CPU inactiva y un núcleo muy ocupado con dos subprocesos. Creo recordar que esto sucedió con Windows 2000, aunque, por supuesto, todos los sistemas operativos modernos tienen la capacidad adecuada.