Hoy en día todos tenemos un dispositivo que al menos tiene como procesador principal un SoC, sea un smartphone, una consola de videojuegos o incluso un PC. ¿Sabías que todos ellos tienen una estructura en común entre ellos? En este artículo os introducimos la arquitectura que los SoC que tienen en común.
Aunque se utilicen en dispositivos distintos, para aplicaciones distintas, ejecuten binarios distintos y hayan puntos que los diferencian todos los SoC tienen una arquitectura en común, la cual afecta al rendimiento de estos y a su naturaleza en conjunto.
¿Qué es un SoC?
A día de hoy todo procesador es un SoC, pero llamamos SoC a aquellos que reúnen una CPU y una GPU en el mismo espacio, para diferenciarlos de aquellos SoC que solo sirven como procesadores centrales o chips gráficos a los que se les sigue llamando CPUs y GPUs respectivamente.
Los SoC se encuentran a día de hoy en todo tipo de ordenadores y tienen como ventaja económica el hecho de aunar en un solo chip varios componentes. El motivo es que en el proceso se ahorran no solo la fabricación de varios chips al simplificarse en uno solo, sino también los test correspondientes.
Por lo que los SoC no son más que producto de la integración continua de los componentes gracias a la Ley Moore, en la que poco a poco la cantidad de componentes en las placas base se ha ido reduciendo al integrarse unos dentro de otros. Dicha integración, no obstante, tiene una serie de contrapartidas que afectan a su rendimiento y hacen que un diseño basado en un SoC tiene menos rendimiento utilizando un chip por separado.
Arquitectura general de un SoC
Independientemente de que tipo de SoC estemos hablando todos ellos tienen una serie de elementos en común de cara a su organización. ¿A qué nos referimos con ello? La organización o arquitectura es la forma en la que los componentes de un procesador están interconectados entre si dentro de un chip integrado.
En los SoC todos los elementos comparten un acceso común a un mismo pozo de memoria, esto significa que en todo SoC el acceso a la memoria se realiza a través de un solo componente. El cual es en todas las arquitecturas el Northbridge o puente norte, el cual comunica todos los componentes de la CPU entre ellos y con la memoria RAM.
El Northbridge realmente no ejecuta ningún programa, pero sí que se encarga de organizar los envíos y recepciones de datos, por lo que a nivel interno del SoC procesa una gran cantidad de datos de manera continua y es la parte más importante a la hora de diseñar un SoC.
Existe el mito entre los usuarios que la creación de un SoC es pegar las diferentes piezas entre sí. La realidad es muy distinta ya que la interconexión entre componentes requiere la construcción de una infraestructura de intercomunicación en concreto que es diferente para cada SoC.
Arquitectura en un SoC y acceso a memoria
En los SoC todos los componente comparten el acceso a la memoria RAM, esto suponen problemas de contención. ¿Qué es un problema de contención? Es cuando las peticiones a memoria son tal altas que se acaba añadiendo más latencia de lo normal y con ello haciendo que el rendimiento de cada elemento en el SoC sea peor que con cada elemento teniendo su propio tipo de memoria.
La mejor manera de paliar esto es utilizar varios canales de memoria al mismo tiempo, lo habitual es que en PC se utilicen dos canales de memoria por SoC, en estaciones de trabajo 4 y en servidores 8. Cada canal de memoria puede ser utilizado por un componente del hardware al mismo tiempo, pero debido a la gran cantidad de elementos que acceden al mismo tiempo esto no es suficiente.
Además, el hecho de gestionar una interfaz de memoria de varios canales complica aún más el Northbridge y con ello se aumenta su tamaño del SoC. Es por ello que son los SoC para servidores los que mayor tamaño tienen, no solo por una mayor cantidad de núcleos, sino porque el mayor espacio para el Northbridge les permite añadir una mayor complejidad de cara a las interfaces de memoria.
Memoria coherente versus memoria no-coherente
![Non-Full HSA](https://hardzone.es/app/uploads-hardzone.es/2020/11/Non_Full_HSA.jpg)
![Full HSA](https://hardzone.es/app/uploads-hardzone.es/2020/11/Full_HSA.jpg)
En un SoC pese a que el acceso a la memoria es unificado a nivel físico no lo es a nivel de direccionamiento. Cuando hablamos que un componente del SoC es coherente en cuanto a memoria a lo que nos referimos a que todos apuntan a las mismas direcciones de memoria y cuando se realiza un cambio en cada parte de la memoria RAM entonces el resto de elementos son conscientes.
La coherencia se da respecto a la CPU, pero existen componentes dentro del SoC que pueden funcionar sin tener un mecanismo de coherencia. Esto obliga a que de cara a la memoria externa haya una parte que se asigne a la parte coherente y otras a la partes no coherentes. Cuando el Northbridge del SoC recibe una petición de memoria en un SoC que tiene los dos tipos lo que hace es dividir el direccionamiento de memoria, de tal manera que los componentes coherentes con la CPU acceden a una parte de la memoria y otros a otra parte de la memoria.
La mejor manera de conseguir la coherencia de memoria es añadir un nivel de caché adicional, el cual no se encuentra en cada uno de los componentes sino en el Northbridge, elemento en el que se comunican todos en común. Este método es común entre los SoC de smartphone y es el más fácil de implementar con tal de conseguir la coherencia de memoria.
Ahogamiento termal en los SoC
Otro de los problemas en los SoC es el hecho que los componentes están muy cercanos entre ellos, lo que provoca que puedan alcanzar menos temperatura que si estuvieran montados como componentes por separado. Esto se traduce en que las velocidades de reloj que pueden alcanzar cada componente son menores que por separado afectando al rendimiento.
Por lo que en un SoC si se quiere que un componente alcance la máxima velocidad lo hace en perjurio del resto de componentes. Incluso en los SoC con CPU multinúcleo esto ocurre entre los diferentes núcleos, donde algunos diseños permiten que un solo núcleo funcione a más velocidad que el resto.
Es por ello también que muchos SoC tienen la capacidad de conectar y desconectar diferentes partes de la GPU cuando no se utilizan, pero esto tiene que estar implementado en la arquitectura del propio SoC y por tanto en su diseño.