Esta apareciendo el rumor de que la siguiente iteración de los Zen de AMD podría soportar hasta unos 4 hilos de ejecución simultaneos en vez de 2 hilos.

Los primeros rumores sobre Zen 3 apuntan a la posible utilización de una nueva característica llamada SMT4, la cual permitiría que cada núcleo físico del procesador maneje 4 hilos frente a los 2 hilos por núcleo utilizados tanto por la implementación de SMT de AMD como Hyper-Threading (la implementación de SMT de Intel). Si tenemos en cuenta que Zen 2 ya supuso un avance importante a nivel de SMT, es lógico pensar que AMD continúe por esa senda.

Se ha de aclarar que aumentar los hilos de ejecución no significa colocar más núcleos sino aumentar la cantidad de unidades de control, pero no la cantidad de ALUs, de tal manera que la GPU maneje más hilos simultáneos pero no aumenta su capacidad de resolución de los mismos al no aumentar las unidades de ejecución.

Un hilo de ejecución es una linea de programa que no tiene que ver con otros que se están ejecutando al mismo tiempo. El concepto es complejo porque no es lo mismo un hilo de ejecución a nivel de software que de hardware, a nivel de software el kernel del sistema operativo es el que maneja los diferentes hilos de software (programas) para que se ejecuten en una CPU de manera ordenada a tráves de una unidad de control. El Sistema Operativo por tanto le da una una lista ordenada dentro de sus capacidades a lo que la CPU puede ejecutar.

Pero resulta que hay veces que hay un desfase entre la unidad de control y las unidades de ejecución que hace que estas últimas no se aprovechen al 100% por lo que si el rendimiento ideal es 100 entonces el rendimiento real es 100-X donde X es el periodo en el que las unidades de ejecución están paradas por el hecho que la unidad de control no va a la par. ¿Con que lo solucionamos? Pues añadiendo otra unidad de control, esta será vista por el sistema operativo como un segundo núcleo pero no es un segundo núcleo sino que aprovecha el periodo X no utilizado de las unidades de ejecución para ejecutar sus instrucciones, pero de nuevo aunque con un valor mucho más bajo nos encontraremos con un nuevo periodo de inactividad que podremos utilizar añadiendo unidades de control adicionales, pero cada nueva unidad de control que se añada aumentara menos el rendimiento respecto al resto, porque lo que es el valor de la X cada vez será menor.

Si AMD ha decidido aumentar de 2 hilos por núcleo a 4 hilos por núcleo es que existe un periodo X en el que las unidades de ejecución del Zen2 podrían estar activas y no lo están. No significa que vayan a duplicar rendimiento. Pero si queréis un ejemplo real voy a tomar los siguientes datos del IBM Power8.

Si miráis la tabla veréis que el aumento de rendimiento al aumentar la cantidad de unidades de control es cada vez más pequeño. Tened en cuenta que la potencia total teórica del chip nunca aumenta porque no aumentamos las unidades de ejecución.

Un poco de trasfondo histórico.

Pese a que la hemos visto en ejecuciones fuera de orden dentro de los chips comerciales durante años el SMT fue una solución planteada para los núcleos con ejecución en orden, voy a citar a la Wikipedia, en el artículo donde se explica la ejecución fuera de orden…

Procesadores en orden

En los primeros procesadores, las instrucciones eran procesadas según estos pasos:

  1. Captura de la instrucción.
  2. Si los operandos de entrada están disponibles (en los registros por ejemplo), la instrucción es enviada a la correspondiente unidad funcional. Si alguno de ellos no lo está durante el ciclo de reloj actual (generalmente porque está siendo capturado desde memoria), el procesador inserta burbuja hasta poder utilizar el dato.
  3. La instrucción es ejecutada por la unidad funcional adecuada.
  4. La unidad funcional escribe los resultados en el archivo de registros.

Si la siguiente instrucción necesitaba una unidad determinada pero esta no se encontraba disponible entonces se añadía un tiempo de espera que disminuía el rendimiento. Antes de la llegada del Pentium Pro que fue el origen de la arquitectura P6 de Intel (Pentium II y Pentium III) todo en los x86 de Intel era In-order y nunca se planteo el uso del SMT para aprovechar el rendimiento de esas burbujas, se cambio a la ejecución fuera de orden directamente.

Procesadores fuera de orden

Este nuevo paradigma rompe con lo anterior basándose en el siguiente orden:

  1. Captura de la instrucción.
  2. Envío de la instrucción a una cola (también llamada buffer o estación de reserva).
  3. La instrucción espera en cola hasta que los operandos de entrada estén disponibles, de manera que una instrucción más reciente puede abandonar el buffer antes que otra anterior si ya tiene los datos disponibles.
  4. La instrucción es enviada a la correspondiente unidad funcional, que la ejecuta.
  5. Se envía el resultado a cola.
  6. La instrucción en curso solamente puede escribir en el archivo de registros una vez que todas las anteriores a ella hayan escrito sus correspondientes resultados.

La idea clave del procesamiento OoO consiste en permitir al procesador evitar ciertos tipos de burbuja que suceden cuando la información necesaria para realizar una operación no está disponible. Siguiendo los pasos antes explicados, el procesador OoO evita las burbujas comentadas en el paso 2 de la ejecución en orden cuando la instrucción no se puede completar a causa de la falta de datos.

Los procesadores OoO rellenan esos «huecos» de tiempo con instrucciones que sí están listas para ejecutarse para después reordenar los resultados y aparentar que fueron procesadas de manera normal. La forma en que las instrucciones son ordenadas en el código original a ejecutar se conoce como orden de programa, mientras que el orden en que el procesador las maneja es el orden de datos, siendo aquel en que los datos van quedando disponibles para su captura desde los registros del procesador. Se necesita una circuitería bastante compleja para convertir un orden en otro y poder además mantener el orden lógico de la salida; el propio procesador ejecuta las instrucciones de forma aperentemente aleatoria.

Años más tarde, a finales de la vida del Pentium 4, Intel añadio capacidades multihilo a algunos de los procesadores de esa gama, pero donde se vio un auge del SMT fue en los núcleos in-order, precisamente tenemos dos ejemplos de ellos muy claros.

Bueno, en realidad es un solo ejemplo, es el núcleo PowerPC utilizado en la CPU Xenon/Waternoose de Xbox 360 y el Cell Broadband Engine de PS3. Utilizaban ejecución in-order con un enorme pipeline lo que hacía que las burbujas eran enormes… ¿Como aprovecharlas? Pues haciendo que ese periodo fuese aprovechado por otro hilo de ejecución. Si queréis saber sobre este núcleo os dejo la siguiente entrada. Mucha gente erroneamente confunde esos núcleos con el PowerPC 970/G5 que es un procesador fuera de orden sin soporte multihilo/SMT.

Otro ejemplo, son los llamados Xeon Phi, que derivan del proyecto Larrabee, en realidad no fueron más que Larrabee sin capacidad de ejecutar gráficos. ¿Que tienen de especial? Se basan en la arquitectura P54C que es la misma que la del primer Pentium que es in-order pero con soporte con hasta 4 hilos de ejecución para disminuir las burbujas generadas. Y es que el problema existente en todos los procesadores es que la cantidad de etapas de ejecución por instrucción ha de aumentar si se quiere aumentar la velocidad de reloj, esto es fatídico para los in-order y por eso se descartaron por completo en el 95% de las veces, pero en algunos casos concretos en los que se utilizaron in-orders a gran velocidad se tuvo que tirar de esta solución para evitar la perdida de rendimiento por las burbujas creadas. Otro ejemplo de núcleo in-order fue el PowerPC A2, utilizado en el BlueGene/Q, que por los mismos motivos utilizaba ejecución multihilo x4.

Al igual que en la ejecución fuera de orden no aumentamos el rendimiento total del procesador, pero el SMT en los in-order resulta en un aumento de rendimiento mucho mayor ya que las burbujas hace que el periodo X de inutilización sea más alto. Por lo que el SMT en núcleos in-order es más útil pero ya nadie hace ese tipo de núcleos, ya ni tan siquiera existen en el mercado de los smartphones siquiera.

Pe… pero Urian… ¿Que hay de las GPUs? ¿Acaso no se pueden beneficiar del SMT?

No, su funcionamiento es diferente al de una CPU. Una CPU se compone por una unidad de control como mínimo y varias unidades de ejecución. con tal de utilizar más y mejor las unidades de ejecución se hace más complejas la unidad de control (fuera de orden, SMT). En una CPU con multihilo si los hilos no utilizan las mismas unidades de ejecución entonces tienes un aumento de rendimiento. En la GPU en cambio no tienes una unidad de control, lo que tienes es un sistema que escribe las instrucciones+dato en lo registros de las Compute Unit que van siendo ejecutadas por las ALUs, son dos paradigmas completamente distintos que no se pueden comparar.

Continuando con el tema, el aumento del SMT significa hacer mucho más ancho el camino de datos, normalmente la formula utilizada es:

1 Byte*número de instrucciones por núcleo*número de hilos por núcleo (SMT)*número de núcleos*velocidad de reloj de los núcleos= Ancho de banda necesario en el uncore para alimentar los diferentes núcleos.

Para no liaros mucho a lo que me refiero es que se necesita que el ancho de banda de los caminos de datos se duplique… En el caso del Zen 2 podemos ver como el Infinity Fabric se comunica a unos 32 bytes/ciclo desde los núcleos a la cache L2 (privada de cada núcleo) a la cache L3 y la cache L3 con el Data Fabric (uncore).

Pero uno de los cambios anunciados en el Infinity Fabric es que puede funcionar hasta con 64 Bytes/ciclo… ¿como lo se? Mirad la siguiente diapositiva:

Por lo que para AMD no le costaría hacer un Zen2 con el doble de ancho de banda interno y si, se que esto aumentaría la cantidad de Pj/bit en el proceso, pero lo haría de manera lineal y no creo que lo veamos en el Zen bajo el proceso de 7nm, sino en que va a utilizar el proceso de 7nm+.

AMD se aprovechara de las ventaja del nodo 7nm+ (7nm EUV) que aumenta levemente la densidad y disminuye el consumo con tal colocar unidades de control adicionales, aumentando el SMT y poder aprovechar mejor los tiempos muertos. Es una solución simple, muy tradicionalmente utilizada para mejorar el rendimiento de las arquitecturas cuando se ha llegado al limite absoluto de mejora de la misma y las mejoras arquitecturales sobre el núcleo no son ya posibles.

Pe… pero Urian, AMD dijo que tenía pensado hasta Zen5.

Es verdad… Lo sabemos gracias a una cuenta de Linkedin, la del arquitecto jefe del Zen2 para ser exactos.

Pero Zen5 parece ser una mejora micro-arquitectural del núcleo mientras que Zen3 y Zen4 parecen ser optimizaciones sobre Zen2. A mi personalmente me interesa saber en que punto saltaran a un modelo 3DIC con el uncore/IO Die en el sustrato/interposer y los chiplets en la parte superior… ¿en Zen 4 o en Zen 5? No se si lo veremos en Zen 3, cosa que dudo, pero el salto a un modelo 3DIC debería ser crucial para reducir la cantidad de Pj/bi y mejorar el escalado energético. Es posible que Zen 4 sea una mejora menor, como lo fue Zen+ y sea un simple port de Zen3 a 5nm, quien sabe.

Pero lo que me interesa es que sepáis como funciona el tema del SMT realmente. Esto es todo, ya sabéis que tenéis los comentarios y el abandonado Discord para comentar.