multi-CPU, multi-core e hiperproceso

80

¿Alguien podría recomendarme algunos documentos para ilustrar las diferencias entre multi-CPU, multi-core e hyper-thread? Siempre estoy confundido acerca de estas diferencias y sobre los pros / contras de cada arquitectura en diferentes escenarios.

EDITAR: aquí está mi comprensión actual después de aprender en línea y aprender de los comentarios de otros; ¿Alguien podría revisar el comentario por favor?

  1. Creo que el hiperproceso es la tecnología más inferior entre ellos, pero barata. Su idea principal es duplicar registros para ahorrar tiempo de cambio de contexto;
  2. El multiprocesador es mejor que el hiperproceso, pero dado que diferentes CPU están en diferentes chips, la comunicación entre diferentes CPU tiene una latencia más larga que la de múltiples núcleos, y al usar múltiples chips, hay más gastos y más consumo de energía que con múltiples núcleos ;
  3. multi-core integra todas las CPU en un solo chip, por lo que la latencia de comunicación entre diferentes CPU se reduce considerablemente en comparación con el multiprocesador. Dado que utiliza un solo chip para contener todas las CPU, consume menos energía y es menos costoso que un sistema multiprocesador.

gracias de antemano, George

George2
fuente
Hyperthreading no es inferior. Es bastante útil, especialmente para servidores. Hay rendimientos decrecientes de ILP (mantener ocupado al procesador reordenando instrucciones secuenciales). Hyperthreading es una alternativa para impulsar el paralelismo: varios subprocesos de hardware se ejecutan sin mucha sobrecarga.
amit
¿Qué hay de mis otros puntos sobre multi-core y multiprocesador? ¿Crees que mis puntos son correctos? ¿Nada malo?
George2
1
@ George2 - Tu edición es muy cierta. Esa es la idea completa. :) Lo mejor que puede obtener en un servidor es probablemente una CPU de varios núcleos, pero para el uso habitual, ¡la mejor opción es el de varios núcleos!
Bogdan Constantinescu
Gracias Bogdan, con tu confirmación, ¡tengo más confianza! :-)
George2
Esa es una descripción terrible de hyperthreading. El punto principal es renunciar al rendimiento por subproceso para obtener un rendimiento total más alto, con solo un poco de hardware adicional en el front-end de un núcleo fuera de orden. Vea esta pregunta y respuesta preguntando sobre un párrafo similar en la respuesta aceptada (antes de mi edición que lo solucionó).
Peter Cordes

Respuestas:

86

Multi-CPU fue la primera versión: tendrías una o más placas base con uno o más chips de CPU. El principal problema aquí era que las CPU tendrían que exponer algunos de sus datos internos a la otra CPU para que no se interpusieran en su camino.

El siguiente paso fue Hyper-Threading. Un chip en la placa base pero tenía algunas partes dos veces internamente para poder ejecutar dos instrucciones al mismo tiempo.

El desarrollo actual es de múltiples núcleos. Es básicamente la idea original (varias CPU completas) pero en un solo chip. La ventaja: los diseñadores de chips pueden colocar fácilmente los cables adicionales para las señales de sincronización en el chip (en lugar de tener que enrutarlos en un pin, luego sobre la placa base abarrotada y hacia un segundo chip).

Las supercomputadoras de hoy son multi-CPU, multi-core: tienen muchas placas base con generalmente 2-4 CPU en ellas, cada CPU es multi-core y cada una tiene su propia RAM.

[EDITAR] Tienes bastante razón. Solo algunos puntos menores:

  • Hyper-threading realiza un seguimiento de dos contextos a la vez en un solo núcleo, exponiendo más paralelismo al núcleo de la CPU desordenado. Esto mantiene a las unidades de ejecución alimentadas con trabajo, incluso cuando un subproceso se detiene debido a un error de caché, una predicción errónea de rama o esperando resultados de instrucciones de alta latencia. Es una forma de obtener más rendimiento total sin replicar mucho hardware, pero en todo caso, ralentiza cada hilo de forma individual. Consulte estas preguntas y respuestas para obtener más detalles y una explicación de lo que estaba mal con la redacción anterior de este párrafo.

  • El principal problema con las múltiples CPU es que el código que se ejecuta en ellas eventualmente accederá a la RAM. Hay N CPU, pero solo un bus para acceder a la RAM. Por lo tanto, debe tener algún hardware que se asegure de que a) cada CPU obtenga una buena cantidad de acceso a la RAM, b) que el acceso a la misma parte de la RAM no cause problemas yc) lo más importante, que la CPU 2 sea notificada cuando la CPU 1 escribe en alguna dirección de memoria que la CPU 2 tiene en su caché interna. Si eso no sucede, la CPU 2 usará felizmente el valor en caché, ajeno al hecho de que está desactualizado

    Imagínese que tiene tareas en una lista y desea distribuirlas a todas las CPU disponibles. Entonces, la CPU 1 buscará el primer elemento de la lista y actualizará los punteros. La CPU 2 hará lo mismo. Por razones de eficiencia, ambas CPU no solo copiarán los pocos bytes en la caché, sino una "línea de caché" completa (cualquiera que sea). La suposición es que, cuando lea el byte X, pronto leerá X + 1 también.

    Ahora ambas CPU tienen una copia de la memoria en su caché. La CPU 1 buscará el siguiente elemento de la lista. Sin la sincronización de caché, no se habrá dado cuenta de que la CPU 2 también ha cambiado la lista, y comenzará a trabajar en el mismo elemento que la CPU 2.

    Esto es lo que efectivamente hace que las CPU múltiples sean tan complicadas. Los efectos secundarios de esto pueden conducir a un rendimiento peor que el que obtendría si todo el código se ejecutara solo en una sola CPU. La solución era de varios núcleos: puede agregar fácilmente tantos cables como necesite para sincronizar los cachés; incluso podría copiar datos de una caché a otra (actualizar partes de una línea de caché sin tener que vaciarla y recargarla), etc. O la lógica de la caché podría asegurarse de que todas las CPU obtengan la misma línea de caché cuando acceden a la misma parte de RAM real, simplemente bloqueando la CPU 2 durante unos nanosegundos hasta que la CPU 1 haya realizado sus cambios.

[EDIT2] La razón principal por la que el multi-core es más simple que el multi-cpu es que en una placa base, simplemente no se pueden ejecutar todos los cables entre los dos chips que necesitaría para que la sincronización sea efectiva. Además, una señal solo viaja 30cm / ns como máximo (velocidad de la luz; en un cable, generalmente tienes mucho menos). Y no olvide que, en una placa base de varias capas, las señales comienzan a influirse entre sí (diafonía). Nos gusta pensar que 0 es 0 V y 1 es 5 V, pero en realidad, "0" es algo entre -0,5 V (sobremarcha cuando se baja una línea de 1-> 0) y 0,5 V y "1" es cualquier valor superior a 0,8 V.

Si tienes todo dentro de un solo chip, las señales corren mucho más rápido y puedes tener tantas como quieras (bueno, casi :). Además, la diafonía de la señal es mucho más fácil de controlar.

Aaron Digulla
fuente
3
Su noción de Hyper-Threading puede ser un poco engañosa, ya que Hyperthreading "solo" simula la ejecución en paralelo de múltiples subprocesos, pero principalmente trata de mejorar el rendimiento de múltiples subprocesos mediante la lógica de CPU incorporada.
JC Inacio
@jcinacio, ¿Hyper-Threading mejora el rendimiento de múltiples procesos? ¿Por qué?
George2
@ Aaron, 1. He editado mis puntos actuales en mi publicación original después de aprender de ti. ¿Podría ayudarme a revisar y comentar por favor? 2. Qué significa "exponer algunos de sus datos internos a la otra CPU para que no se interpongan en su camino". en tu publicación?
George2
@ Aaron, su respuesta es excelente, mi última pregunta, ¿por qué dice que la CPU de múltiples núcleos resuelve el problema de la sincronización del estado de la CPU / esperar problemas de RAM? Creo que si la lógica del código es la misma, el problema de sincronización y espera de RAM todavía existe. ¿Algún comentario?
George2
1
@AmitP, tenga en cuenta que las preguntas demasiado amplias tienden a ser rechazadas y cerradas en los programadores, consulte ¿Qué ocurre con Programmers.SE? Una guía para Stack Overflow
mosquito
4

Puede encontrar algunos artículos interesantes sobre CPU dual, multi-core e Hyper-Threading en el sitio web de Intel o en un artículo corto de la Universidad de Yale .

Espero que encuentre aquí toda la información que necesita.

Bogdan Constantinescu
fuente
Bogdan, he editado mis puntos actuales en mi publicación original. ¿Podría ayudarme a revisar y comentar por favor? Los aprendí después de leer los enlaces recomendados.
George2
@ George2 - Tu edición es muy cierta. Esa es la idea completa. :) Lo mejor que puede obtener en un servidor es probablemente una CPU de varios núcleos y múltiples núcleos
Bogdan Constantinescu
2
Ambos enlaces están rotos :(
rkachach
2

En pocas palabras: el sistema multiprocesador o multiprocesador tiene varios procesadores. Un sistema multinúcleo es un sistema multiprocesador con varios procesadores en el mismo dado. En hyperthreading, se pueden ejecutar varios subprocesos en el mismo procesador (es decir, el tiempo de cambio de contexto entre estos múltiples subprocesos es muy pequeño).

Los multiprocesadores llevan allí 30 años, pero sobre todo en laboratorios. Multi-core es el nuevo multiprocesador popular. Los procesadores de servidor implementan hoy en día hyperthreading junto con multiprocesadores.

Los artículos de Wikipedia sobre estos temas son bastante ilustrativos.

amit
fuente
Amit, 1. He editado mis puntos actuales en mi publicación original después de aprender de ti. ¿Podría ayudarme a revisar y comentar por favor? 2. ¿Qué significa morir y romper en tu publicación?
George2