Si alguna vez te has preguntado por qué ya no vemos dentro del mundo del PC dos procesadores o más, es decir, varios chips de procesador montado sobre una placa, entonces, estas de enhorabuena, ya que te vamos a dar las respuestas a ello. Aunque puede ser que nunca te lo hayas preguntado. En todo caso, ¿no son mejores dos que uno?
Dicha pregunta tiene dos respuestas distintas según el contexto que le queramos dar. La primera de ellas es el motivo económico, por el hecho de que para la mayoría de usuarios tener un solo chip como CPU o procesador del sistema es suficiente. Por lo que acaba siendo un coste innecesario para los fabricantes de placas base al final, ya que será utilizado por muy poca gente. Es por ello que no vemos sistemas de doble zócalo para doble procesador. En cambió a los motivos técnicos, la explicación es algo más compleja.
¿Por qué no vemos dos procesadores en PC?
Pues bien, la realidad es que hace tiempo que usamos más de dos procesadores, desde el momento en que cada chip de CPU tiene varios núcleos de proceso y cada uno de ellos es un procesador en sí mismo al completo. Es decir, con sus unidad de control, las de ejecución y sus correspondientes cachés. Todo ello aderezado con una caché de último nivel para que no haya conflictos a la hora de acceder a la información en la memoria, así como un acceso a la memoria en común gracias a que a día de hoy, la parte encargada de acceder a la RAM se encuentra dentro del procesador.
Ahora bien, hemos de entender que cualquier programa que se ejecute un procesador se puede dividir en dos categorías distintas:
- Código secuencial que no se puede ejecutar en paralelo y que funciona en uno solo de los núcleos. Por lo que la comunicación entre estos no será importante.
- Código en paralelo que puede ser ejecutado entre dos o más núcleos. Es aquí donde la velocidad de comunicación tiene mucha importancia.
Si existe mucha distancia física entre los núcleos que están colaborando entre sí., entonces esto se puede convertir en un cuello de botella de cara al rendimiento al ejecutar programas, dicho problema lo vamos a ver a continuación.
Procesadores disgregados y latencia
Uno de los problemas más grandes que existe a la hora de ejecutar código en paralelo es la latencia. A día de hoy la mayoría de chips son monolíticos y hechos de una sola pieza. Aunque tenemos el caso de AMD que con sus Ryzen de escritorio lleva tiempo disgregando por completo el procesador, especialmente en sus Ryzen 9. Es decir, dos chips separados que incluyen los diferentes núcleos al completo y sus niveles de caché.
Pues bien, tomando un Ryzen 9 5950X nos encontramos con el siguiente fenómeno:
- La latencia de cada núcleo con su colindante es de 6,2 nanosegundos.
- Debido a la estructura en anillo donde los datos van circulando en cada sector del procesador por ciclo de reloj y no todos al mismo tiempo, la latencia con el resto de núcleos dentro de un mismo CCD es de hasta 19.2 nanosegundos.
- Si tenemos que intercomunicar un núcleo de un CCD con el de otro CCD, entonces nos podemos ir a cifras de latencia de 83.6 nanosegundos.
Como se puede ver es contraproducente de cara al rendimiento separar los núcleos del procesador. Sin embargo, la solución de AMD no son dos CPU totalmente separadas, desde el momento en que el controlador de memoria se encuentra en el interior del IOD y, por tanto, el acceso a memoria es común. Por lo que no es lo mismo que dos procesadores totalmente separados
El consumo es mayor con dos procesadores o más
Otro punto a tener en cuenta está en el hecho de que la comunicación entre los componentes de un chip es más costosa cuanto más distancia existe entre ellos, dado que el consumo energético aumenta con la latencia. Es por ello que en ese aspecto, es mejor tener los núcleos lo más cercanos posible e incluso dentro del mismo chip. Aunque claro está que también limitaciones en ellos como la velocidad de comunicación interna y el tamaño máximo que se puede fabricar. Por lo que no solo aumentaría la factura de la luz al colocar un segundo procesador, es que además estos consumirían mucho más que por separado, ya que tendríamos que colocar un bus adicional para la comunicación entre ellos.
Muchos chips son difíciles de comunicar entre sí
Hemos de partir de la base de que toda CPU tiene una serie de interfaces que le permiten comunicarse con el exterior. Por un lado, la que le permite interactuar con la memoria RAM y por el otro el que hace que se comunique con los periféricos. Sin embargo, estamos hablando que todos ellos han de colaborar en un trabajo en común. ¿Cómo lo hacemos para que dos procesadores colaboren entre sí sin conflictos de ningún tipo?
- Para empezar debemos dividir la memoria RAM en varios espacios distintos, uno para cada uno de los procesadores.
- El Kernel del sistema operativo se ejecuta en el primer procesador, pero no todos los procesos. Por lo que se acaba necesitando un sistema de coherencia entre ambas partes. Es decir, deberemos crear un sistema de sincronización de datos entre ambos procesadores, para que las variables duplicadas tengan la misma información.
Todo esto se consigue a día de hoy con los actuales procesadores multinúcleo. Aunque la cosa se complica, si hablamos de separar los núcleos en diferentes chips y todos ellos con sus interfaces de periféricos y memoria. Cuando los procesadores son de un solo núcleo, tener dos chips y coordinarlos era muy fácil, e incluso cuatro.
Precisamente no se suelen ver más de cuatro procesadores en servidores, por eso. No solamente por el hecho que la latencia entre núcleos podría enviar al traste por completo el aumento de rendimiento, además de requerir una comunicación muy compleja. Pensad que la cantidad de interfaces para comunicar es multiplicar la cantidad de estos y restarle 1. Así pues, 4 procesadores requieren 15 interconexiones, pero ocho de ellos 63.