¿Qué hace que tener más de 30 núcleos en la CPU de una computadora sea poco práctico?

No hay nada poco práctico en más de 30 núcleos en una computadora. En realidad, ha sido relativamente común tener más de 30 núcleos disponibles en servidores AMD / Intel estándar durante varios años. Para darle una idea, una de las líneas de procesadores Intel de generación actual (E5v4 / Broadwell-EX) es buena para hasta 24 núcleos por zócalo en configuraciones de hasta 4 procesadores. Eso es un total de 96 núcleos físicos por sistema. Se avecinan arquitecturas más grandes, tanto en términos de números de núcleos en el procesador como de números de procesadores en el sistema.

Sin embargo, hay muchos desafíos con este tipo de escala horizontal. Estos son algunos de los más grandes:

1.) Es difícil escribir código que aproveche el procesamiento paralelo. Los programadores y compiladores del sistema operativo continúan mejorando en la distribución de la carga a través de múltiples núcleos, pero en última instancia, existe una gran cantidad de código que no se correlaciona bien para ser paralelo o no se ha escrito adecuadamente para hacerlo. Ciertos tipos de cargas de trabajo tienden a prestarse naturalmente a este tipo de arquitecturas (muchas máquinas virtuales en un host, por ejemplo), mientras que otras tienden a ser bastante difíciles de implementar (tareas intensivas de E / S o muy serializadas). Es instructivo notar que para los principales fabricantes (Intel o AMD, por ejemplo) cada nueva generación incluye SKU que tienen muchos núcleos a una velocidad menor y menos núcleos a una velocidad algo mayor.

2.) Cuantos más núcleos se agreguen, más densa se debe empacar una oblea para que se mantenga dentro de un tamaño particular. Se ha escrito mucho sobre esto, pero es suficiente decir que a medida que los tamaños fabulosos caen, la física se vuelve mucho más difícil (y más costosa). En la operación real, los desafíos en torno a la generación de más y más calor en espacios cada vez más pequeños presentan muchos límites.

3.) La capacidad de procesamiento ha estado superando el rendimiento de los componentes circundantes durante muchos años. Los tipos de cargas de trabajo que realmente pueden ejercer cientos de núcleos tienden a requerir una gran cantidad de RAM y esa RAM tiene que ser extremadamente rápida. Agregue el problema de arbitrar el acceso entre todos estos núcleos diferentes y puede ponerse feo muy rápidamente. El mismo punto se aplica a los subsistemas de almacenamiento y red. En resumen, el sistema en su conjunto solo es tan capaz como su capacidad para mantener todos estos procesadores alimentados.

Entonces, en la práctica, hemos tenido hardware y sistemas operativos que han soportado grandes cantidades de núcleos durante mucho tiempo. Más de 30 núcleos realmente no salen mucho de la categoría de servidor x86 de tamaño mediano y no lo han hecho por un tiempo. Los sistemas operativos Windows y Linux razonablemente modernos pueden manejar cientos de núcleos y terabytes de memoria más o menos listos para usar. Hay una escala móvil multivariante de practicidad que incluye el número de núcleos, la velocidad de esos núcleos, el tamaño y la velocidad de la memoria, los subsistemas de red y almacenamiento, el espacio físico / energía consumida y el precio requerido. Cada año trae mejoras en varias áreas que, a su vez, ejercen presión sobre la otra. Todo eso tiene que equilibrarse con la capacidad del software para aprovechar estos recursos. Ah, y no se olvide de agregar la cuestión de máquinas individuales más grandes frente a grupos distribuidos de máquinas más pequeñas / más baratas (con las complejidades asociadas, por supuesto).

En resumen, encontrar el equilibrio adecuado entre estos factores de manera continua es el verdadero desafío.

Porque a los programadores no les gusta el paralelismo. Les da grandes dolores de cabeza e incluso peores errores. Prefieren 1 núcleo fuerte. A los proveedores de sistemas operativos realmente les gustan al menos 2 núcleos porque pueden usar el segundo núcleo y dejar el primer núcleo a la aplicación principal, también si la aplicación está atascada, el sistema operativo puede usar el segundo núcleo para matar la aplicación.

Además, ya hay un procesador en su computadora con 20–40 núcleos. Es tu GPU. Y estos no son solo núcleos simples, son anchos. Estamos hablando de 16–64 elementos de datos por operación (es por eso que ve más de 3000 núcleos de cuda / procesadores de flujo). Para la paralelización de gráficos es fácil ya que a los programadores de gráficos no les gusta que sus píxeles se comuniquen entre sí.

30 está bien, el procesador SPARC M7 tiene 32 núcleos, cada uno manejando 8 subprocesos a nivel de hardware, por lo que básicamente 256 subprocesos de hardware por CPU.

Sin embargo, se trata realmente del tamaño, cuanto más grande es un procesador, más difícil y costoso es hacer, y cada núcleo hace que el procesador sea más grande. Eso hace que el SPARC M7 sea bastante costoso, y la mayoría de las personas simplemente no necesitan ese tipo de rendimiento.

Cuantos más núcleos tenga, mayor será el tamaño total del circuito, y cuanto más grande sea, más probabilidades tendrá de tener un defecto, lo que significa que tendrá que tirar el procesador.

Los procesadores están hechos en “obleas” y si está haciendo un procesador pequeño, obtendrá (digamos) 50 * procesadores en una oblea, digamos que la oblea tiene un defecto, y terminará con 49 de 50 procesadores, no es gran cosa. Pero supongamos que crea un procesador grande como el M7, es posible que solo obtenga 5 procesadores en una oblea, por lo que una falla significa que obtiene 4 procesadores, no 5, lo que pierde el 20% de sus procesadores, no el 2%.

Significa que fabricar procesadores grandes es desproporcionadamente costoso en comparación con fabricar procesadores pequeños.

Además, el paralelismo suele ser muy difícil y proporciona pocos beneficios. En un servidor, las cosas a menudo se paralelizan a sí mismas, ya que los servidores web usan hilos / bifurcaciones para cada solicitud, pero para muchas cosas, simplemente no hay beneficio, digamos que cargo un JPEG en mi PC, toma una fracción de segundo, Entonces, ¿hay algún beneficio real para que funcione en múltiples núcleos? La sobrecarga de iniciar esos subprocesos puede incluso no valer la pena.

Un SPARC M7 probablemente ofrece diez veces el rendimiento del procesador en mi MacBook, pero también es más de diez veces el precio, y para mí, simplemente no vale la pena, no vale la pena. Además, la batería duraría unos 5 minutos.

* En realidad, obtienes cientos de procesadores por oblea.

Costo-

No todas las CPU son iguales. ¿Has visto los enchufes xeon? Algunos son dos veces el tamaño de los enchufes de 2011, cuadruplican el tamaño de 1150 enchufes. Cuando se hacen los cpus, algunos funcionan muy bien, otros no tan bien. Así es como funciona el sistema i3, i5, i7, algunos son en realidad el mismo chip, pero uno es más alto debido a su rendimiento.

Cuando toma un xeon de conteo de núcleo alto, por ejemplo, si un tamaño de CPU tan grande, la variación del rendimiento será alta. Cuando se trata de 72 núcleos xeon 7290, siendo la única CPU con esa cantidad de núcleos, no puede bin la CPU. Se ajusta a los estándares de Intel o no. Esto significa que Intel gasta más dinero haciéndolo más preciso y pierde mucho dinero de los chips que fallan. Pasan esta etiqueta de precio al consumidor.

Cuando tiene muchos núcleos, también necesitan una gran cantidad de caché para que puedan usar, de lo contrario, serían extremadamente lentos. La memoria caché es bastante costosa, y para un alto conteo de núcleos y cpus de alta gama, desea una gran cantidad de memoria caché para mantenerlo en funcionamiento. El precio para esto también se pasa al consumidor.

Calor-

Los núcleos producen calor. Si cabes 72 núcleos en una CPU, necesitas una forma de mover ese calor de manera eficiente a otro lugar. Si está en un enchufe, puede ser difícil alejar esa cantidad de calor.

Tiene más sentido hacer configuraciones de múltiples CPU.

Sentido práctico-

Puedes hacer múltiples configuraciones de CPU

Si usa 8x 7290 para tareas puramente paralelas, o un solo equivalente de CPU, también podría haber comprado algunas GPU y usado aceleración cuda para sus tareas. Las GPU son excelentes para la computación paralela.

Hay CPU (por ejemplo, Xeon Phi 7290 de Intel) que tienen hasta 72 núcleos. Las únicas limitaciones prácticas son el espacio físico, el consumo de energía y la capacidad de disipar todo el calor generado.

En este momento, a partir del año 2016, estamos limitados por el proceso de fabricación de semiconductores en alrededor de 14 nm. Cuanto más pequeño sea el proceso, más eficiente será la energía del chip y más transistores podrá colocar en el chip y, por lo tanto, más núcleos. Así que existen los límites físicos del proceso de producción en sí. El silicio dopado también es muy costoso, por lo que cuantos más núcleos coloque en el dado, más grande se volverá y, por lo tanto, será más costoso por CPU. Cada pulgada cuadrada de semiconductor también produce calor, por lo que con un troquel tan grande con más de 30 núcleos será muy grande y te toparás con los desafíos de ingeniería de tener que eliminar alrededor de 2kW de calor de una pieza de silicio del tamaño de una hamburguesa . Luego viene el aspecto del software donde el software que ejecuta sabrá cómo paralelizar las instrucciones para hacer un buen uso de los 30 núcleos, que es un desafío de programación sólido en sí mismo.

Estas son algunas cosas en las que puedo pensar. Aunque he visto servidores con 64 núcleos … deberías mirar el administrador de tareas y es todo un espectáculo.

  1. No todas las aplicaciones se ejecutan en paralelo. No tiene sentido empacar tantas CPU en computadoras destinadas al procesamiento normal
  2. El ancho de banda de la memoria es muy limitado. Debe tener rutas de acceso de bus sofisticadas (Numa, Intel qpi) para asegurarse de que el rendimiento sea escalable
  3. Necesitará construir enormes cachés y eso nuevamente aumentará los costos.
  4. El consumo de energía sería muy alto. Y necesitará un sofisticado soporte de software para mantenerlos en modo de bajo consumo cuando no estén en uso.

Aquí hay muchas buenas respuestas y, como mencionan algunas personas, no se detiene en 16 núcleos.

Otra razón para no tener un conteo de núcleos alto es distribuir las CPU en diferentes servidores. De esta manera, un servidor que muere no mata a todo el sistema. También le permite reemplazar el servidor muerto mientras el sistema aún se está ejecutando. La distribución a través de la red agrega algunos gastos generales, pero puede mejorar la disponibilidad y la velocidad si se hace correctamente.

¿Por qué parar a las 16, etc.?

La disipación de calor se convierte en un desafío difícil en una sola oblea, pero los fabricantes de chips están pensando más allá de simplemente agregar más núcleos.

IBM ha estado experimentando con obleas apiladas enfriadas por agua que están unidas con adhesivo; en efecto un procesador en 3D: IBM Cools Chips 3-D con H2O

Curiosamente, para otros núcleos de CPU más simples, hemos estado construyendo chips con cientos de núcleos durante años. En realidad, no es el núcleo en sí lo que es tan malo, son todas las cosas que esperamos a su alrededor hoy. Si la mayoría de lo que necesita son funciones de ALU, entonces eso es fácil. Las NPU de hoy ya tienen cientos de núcleos.

Por el contrario, si tiene un núcleo x86 (muy complejo) con una FPU, caché e hiperprocesamiento, ocupa mucho espacio en los troqueles, sin mencionar el poder. Así que solo puedes unos pocos de esos por chip.

¿Quieres ir más rápido? Primero hazlo más simple.

En general, cuanto más núcleos menor es la velocidad del reloj, la impracticabilidad proviene de la optimización del software para usarlos. Algunas aplicaciones que ponen una buena carga en una CPU pueden beneficiarse de menos núcleos y mayor frecuencia en lugar de una tonelada de núcleos más lentos. Supongo que todo depende de por qué los necesita y cómo los utiliza. El costo de beneficio es un factor bastante razonable cuando se mide la impracticabilidad.