Hace tres años AMD sacó su nueva arquitectura Zen al mercado que traía consigo muchas novedades en el diseño de procesadores. En aquel momento nos resultaban desconocidas algunas siglas como CCD, CCX, el infinity fabric… Tres años después, AMD vuelve con el que es el primer gran rediseño de esta exitosa arquitectura que llegó al mercado en 2017 y que aquí también analicé en profundidad en su día. ¿Qué cambios nos encontramos con respecto a los diseños anteriores de la familia Zen para conseguir ese 19% de mejora en IPC?
Cambios en el layout
El núcleo de Zen 3 es básicamente nuevo. Algunas cosas que voy a comentar aquí es posible que te suenen de Zen 2 pero eso es porque en el desarrollo del núcleo anterior los ingenieros de AMD fueron capaces de añadir avances que en un principio se iban a estrenar con Zen 3. Pero esto no quiere decir que Zen 3 sea una simple evolución.
Mirando el diagrama de bloques de una forma más general que AMD ha proporcionado, no parece haber demasiados cambios con respecto a la generación anterior de Zen presente en los Ryzen 3000. Tenemos uno o dos CCD, fabricados en el proceso de TSMC 7nm y un I/O die, que en este caso es literalmente el mismo que en la generación anterior.

En ese CCD que a simple vista no parece haber cambiado, nos encontramos con prácticamente todo nuevo, y lo que no es nuevo está reorganizado. Cada CCD mide 80,7 milímetros cuadrados con unos 4.150 millones de transistores. Antes cada CCD tenía dos CCX de 4 núcleos cada CCX, cada uno con 16MB de caché. Esto nos daba como resultado que para un procesador de 8 núcleos eran necesarios dos CCX de 4 núcleos cada uno con su caché, que se interconectaban con el infinity fabric a través del I/O die y la latencia extra que supone esa interconexión por fuera del CCX.
En Zen3 el CCX sube hasta los 8 núcleos y los dos bancos de 16 MB de caché se unifican en uno de 32MB. Así que la intercomunicación entre esos 8 núcleos ya no tiene que salir por fuera y cada núcleo tiene acceso a un banco de caché el doble de grande que antes. Normalmente cuando haces la caché más grande, esta también suele ser más lenta a consecuencia de ese aumento de tamaño. Ahora esto compensa por el ahorro de latencia al no saltar por el infinity fabric en muchas situaciones. En este caso según cifras de AMD, la caché tardaría unos 7 ciclos de reloj más en responder, quedándose en 46. También hay cambios de ancho de banda entre los núcleos y la caché de nivel 3, ya que esta caché utiliza la misma interfaz de comunicación que Zen 2 pero al haber la mitad de bancos de memoria caché por pasar de dos de 16MB a uno de 32MB, resulta que el ancho de banda de los 8 núcleos con la caché de nivel 3 ahora es la mitad que antes. Los otros niveles de caché probablemente sufrirán más presión por esto, pero si AMD ha balanceado el diseño de esta forma probablemente sea porque las cachés de nivel 1 y 2 tenían margen y dejando la caché de nivel 3 con la mitad de ancho de banda ahorras energía.

El resto de sistema de cachés no ha cambiado demasiado comparado con la generación anterior. La caché de datos e instrucciones de nivel 1 sigue siendo de 32KB y la de nivel 2 sigue con 512KB. La latencia también se mantiene invariable aquí. La caché de nivel 3 actúa como victim caché de la de nivel 2 con lo que solo se llena con aquellos datos que han sido expulsados de la caché de nivel 2. Este sistema de cachés tiene shadow tags para dar una funcionalidad extra a los núcleos situados en el mismo Die y que puedan sacar datos de otras cachés de nivel 2 si la otra alternativa fuese saltar fuera a buscar ese dato.
Marcados en amarillo en la imagen anterior hay otros dos cambios además de los 32MB de caché de nivel 3. La caché de datos ahora acepta 3 loads o 2 stores por ciclo (excepto para operaciones de 256bits, que pasaría a 2 loads y 1 store).
Operaciones de enteros y coma flotante
En muchas zonas del núcleo Zen 3 vemos un ensanchamiento general. La unidad de enteros puede ahora trabajar con 10 micro operaciones por ciclo, subiendo desde las 7 de antes. En coma flotante, pasamos de 4 a 6 por ciclo. La unidad de enteros de Zen 3 puede hacer por ciclo 4 ALUs, 3 AGUs, un salto y 2 guardados de datos. La de coma flotante, un poco de todo: Un F2I (Float to integer), un guardado de F2I, 2 MAC (Multiplicar y acumular) y 2 sumas. Para ambos casos, los schedulers han dejado de ser individuales para cada unidad de ejecución para pasar a otros capaces de trabajar con dos micro operaciones a la vez. Ha habido también un aumento de registros para estas tareas con lo que la ventana de reordenación de operaciones para la ejecución de instrucciones fuera de orden (OoO) ha aumentado de 224 a 256.

Hay otras mejoras generales como el predictor de saltos «zero bubble» que según AMD prometen un mejor uso en general del núcleo reduciendo tiempos muertos.
Fetch / decode
Adentrándonos un poco en ese predictor de saltos, nos encontramos que no es simplemente más preciso. La latencia ha mejorado. Que sea «zero bubble» implica que cuando el predictor ha hecho su trabajo, esto puede ser usado en el siguiente ciclo de reloj sin necesidad de esperar a que sea enviado al bloque correcto. Un predictor mejor también reduce la cantidad de veces que predice mal, reduciendo las penalizaciones que esto supone. El predictor de salto TAGE usado aquí es una de las piezas que se pudo añadir al anterior Zen 2. En Zen 3, nos encontramos con algunos extras que no estaban en la generación anterior.

El L1 BTB dobla su tamaño de 512 a 1024 entradas. El L2 BTB reduce un poco su tamaño de 7k a 6,5k entradas por una cuestión de balanceo con el L1 BTB. El ITA (Indirect Target Array) aumenta de 1024 a 1536 entradas.
La unidad encargada de decodificar instrucciones es un punto especialmente crítico en los procesadores x86 debido a que su juego de instrucciones es de longitud variable entre 1 y 15 bytes. Aquí se sigue manteniendo un diseño de 4 vías ya que ir más ancho penaliza mucho en eficiencia para los procesadores x86. Para tratar se solventar este problema de eficiencia y de no poder hacer un diseño mucho más ancho de 4 vías, se puede optar por utilizar una Op-cache. La primera generación de Zen fue para AMD la primera vez en implantar esta solución. En su día no fue fácil por problemas como un juego de instrucciones residiendo en la caché de instrucciones pero cuyo target estaba en la OP-cache, teniendo esta a su vez como target la caché de instrucciones. Los ingenieros de AMD se pusieron a estudiar más a fondo este problema y en Zen 3 nos encontramos con un diseño que gestiona mejor el flujo de datos entre la caché de instrucciones y la OP-cache.
El dispatcher se mantiene en 6 macro operaciones por ciclo, haciendo que Zen 3 siga siendo un procesador con un IPC máximo teórico de 6. Que el OP-cache sea capaz de gestionar 8 macro operaciones es por una cuestión de reducir la posibilidad de burbujas en el frontend, pero no por ello este diseño va a poder tener un IPC de 8 ya que es el dispatcher aquí el que hay que coger como referencia.
Load / store
Hasta aquí hemos podido ver cómo el núcleo es capaz de hacer más cosas. Para poder hacer más cosas, hace falta un subsistema que pueda alimentar al núcleo con los datos que necesita y que también sea capaz de guardar el resultado de la ejecución. Entramos en la parte de load/store, muy relacionada con el cambio de cachés que hemos comentado al principio.
Viendo en la sección de operaciones de enteros cómo teníamos tres AGUs, el núcleo tiene ahora más ancho de banda para esta parte porque la cantidad total de load y stores por ciclo que puede hacer aumenta a tres desde los dos de las generaciones anteriores.
El resto de secciones también han visto mejoras en eficiencia o capacidad. La cola de store ha aumentado de 48 a 64 entradas. La caché de datos de nivel 1 ha mejorado en accesos concurrentes. Las instrucciones REP MOVS ha sido comentada por AMD como una que mejora bastante ya que antes tenía una latencia muy alta en copias cortas que ha sido solucionado para Zen 3.

Qué esperar para el futuro
La serie Ryzen 5000 que hace uso de Zen 3 se espera que sea la última serie que utilice el socket AM4. AMD necesita cambiar de socket si quiere que sus futuros procesadores tengan compatibilidad con futuros estándares como DDR5, USB4 o PCI express 5.0. Para dar compatibilidad a lo anteriormente comentado, yo también me esperaría un rediseñado I/O Die, que además es lo único de Zen 3 que no se ha tocado. No me encajaría mucho que se siguiese usando un I/O Die de 12nm cuando el próximo Zen 4 se espera en TSMC 5nm.
Veo también probable de cara al futuro que sigan con algunas cosas evidentes, como recuperar el ancho de banda perdido con la caché de nivel 3 o seguir mejorando latencias.