¿Cuánta aceleración da un hiperproceso? (En teoria)

38

Me pregunto cuál es la aceleración teórica de las CPU hiperprocesadas. Suponiendo una paralelización del 100% y comunicación 0, dos CPU darían una aceleración de 2. ¿Qué pasa con la CPU hiperprocesada?

Mikhail
fuente

Respuestas:

59

Como han dicho otros, esto depende completamente de la tarea.

Para ilustrar esto, veamos un punto de referencia real:

ingrese la descripción de la imagen aquí

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.

Konrad Rudolph
fuente
Mejor respuesta :-)
Sklivvz 05 de
1
¿Cuáles son las velocidades reales de los algoritmos, trazados contra el número de núcleos? Es decir, ¿cuál es la ganancia de velocidad para el algoritmo más rápido en estas pruebas? Sólo me preguntaba :).
crazy2be
@ crazy2be Para la línea azul ( algoritmo de Horspool ), el tiempo de ejecución va de 4,16 segundos a 0,35 segundos con 16 hilos. Entonces la aceleración es 11.74. Sin embargo, eso es con hyper-threading. Cuando se traza contra el número de núcleos, la aceleración de este algoritmo es 7.17 en 8 núcleos.
Konrad Rudolph
55
El único problema con esta respuesta es que solo puedo votarlo una vez. Es una respuesta asombrosamente objetiva para una pregunta subjetiva;)
Journeyman Geek
20

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.

geoffc
fuente
2
Aunque estaba buscando algo como "1.7 aceleración de tiempo", esta respuesta es muy buena ya que no da una mirada en blanco y negro a este problema.
Mikhail
@Mikhail: El punto es que no hay un factor simple: depende, como a menudo en la vida :-).
sleske
44
La esencia es correcta. Sin embargo, una objeción es que no existe una razón a priori por la cual un solo núcleo debería beneficiarse más del hipertronchado que múltiples núcleos. Para la tarea equivocada, ni lucro. Para la tarea correcta, ambos se benefician por el mismo factor.
Konrad Rudolph
@ Konrad: Creo que el punto al que llegaba es que la diferencia entre un núcleo y dos núcleos podría ser más valiosa que la diferencia entre 4 y 8 o 2 y 4. Es decir, tener un segundo núcleo, para una aplicación mal enhebrada, podría ayudar un poco más.
geoffc
“Para una aplicación mal enhebrada”, esa es la parte importante. Pero de manera realista, el soporte de subprocesos de la mayoría de las aplicaciones es pobre, por lo que tiene un punto.
Konrad Rudolph
5

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.

Mokubai
fuente
1
Bueno, un punto claro: depende de la aplicación. Estoy seguro de que la informática de alta comunicación podría acelerarse ya que el núcleo 0 y el núcleo 0-h se comunicarían a través de la misma caché, sin usar RAM lenta.
Mikhail
1
@Mikhail, entonces el problema es que si ambos hilos requieren una gran cantidad de poder de procesamiento, ambos estarán compitiendo por los mismos recursos y sería mucho mejor comunicarse a través de la memoria caché L3 compartida por las CPU (el i7 tiene caché L1 y L2 por núcleo y un caché L3 compartido) o incluso memoria del sistema y haciendo sus tareas por separado. Todo es un ejercicio masivo de columpios y rotondas ...
Mokubai
3

Depende mucho de la CPU y la carga de trabajo, como han dicho otros.

Intel dice :

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.

Stephen Darlington
fuente
1
El sistema operativo debe asegurarse de que los hilos no se bloqueen entre sí :)
Mikhail