viernes, 3 de marzo de 2017

Ronda de análisis de AMD Ryzen 7 [actualizado 05/04/2017]

Desde hoy se pueden comprar los nuevos procesadores de AMD de 8 núcleos y 16 hilos. Como con cualquier nuevo dispositivo hardware, la web se llena de análisis (reviews).





Se puede decir que tienes un octacore por la mitad de precio o menos que el de Intel. El Ryzen 7 1700 vale 369 euros y puede subirse hasta 4.0 Ghz. Quizá en el futuro puedan subir más con nuevos steppings. El Core i7 6900K cuesta 1199 euros.

En los próximos meses habrá actualizaciones de BIOS y parches en aplicaciones y juegos que no funcionan de forma óptima. Las pruebas de Phoronix, cuyos benchmarks son compilados desde código fuente, muestran que  con un código que tiene más en cuenta el procesador de AMD, el rendimiento es equivalente a Intel o mejor. A veces queda por debajo del quadcore 7700K por temas de frecuencia. Excepciones son Stockfish, Himeno y FFmpeg. En hardware.fr prueban Stockfish 8 en vez de un snapshot del 5 y obtienen resultados superiores a los ocho núcleos de Intel. En cuanto a FFMpeg, con x264 (Handbrake) el 1800X supera al resto de rivales tal y como se puede ver en HardOCP. Según los resultados de Hardware.fr de x264 y x265, el AMD es capaz de igualar al Intel Core i7 6950X, de 10 núcleos y 1700 euros de coste.

En Overclockersclub nos podemos fijar en Hitman, juego el cual obtiene más FPS por mejora de frecuencia en Intel que en AMD. El incremento del 6700K (4.0 Ghz) al 7700K (4.2 GHz) es mayor que el OC del 1800X de 3.8 Ghz a 4.0 GHz. Nos permite intuir que la interconexión entre los distintos CCX va a una frecuencia independiente de la de los núcleos. En el caso de intel la interconexión de los núcleos va a 3 GHz. De ahí la gran escalabilidad en FPS al aumentar la frecuencia de la RAM. Desde AMD también se indica que configurando la RAM se obtienen grandes ganancias.
Si sólo vas a jugar a 1080p, a día de hoy y a falta de los parches correspondientes para AMD, el 7700K sigue siendo mejor opción, aunque la diferencia es insignificante. Y a poco que cambies los parámetros de la RAM dicha diferencia desaparece.

1440p. -5% de media con respecto al actual objetivo de optimización del software privativo, Intel
1080p. -12% de media con respecto al actual objetivo de optimización del software privativo, Intel


Con 8 núcleos puedes tener otras tareas (streaming de partidas en vivo, antivirus de fondo, etc.) sin afectar a la experiencia de juego (tiempo por fotograma, percentiles). La variabilidad de los FPS es menor con respecto a un quadcore. Esto significa que la experiencia de juego es más constante, con menos sobresaltos. El Ryzen ofrece un rendimiento top en juegos con un extra de multitarea y paralelismo que se corresponde con la gama HEDT de Intel.

En un futuro a medio plazo los juegos cada vez serán más paralelos. APIs como Vulkan y Direct3D 12 son cada vez más comunes. Ya veremos que consiguen Bethesda (Doom y Prey entre otros) y AMD con su acuerdo. Otros desarrolladores están en contacto con AMD para generar parches que optimicen para AMD como ya lo están para Intel. En la GDC 2017 celebrada la primera semana de marzo AMD dio una conferencia sobre cómo optimizar software para sus nuevos procesadores.

El rey del bajo consumo energético

Consumo con el Prime95, un programa que no representa una carga normal ya que estresa al máximo todos los núcleos. Se suele usar para detectar inestabilidades.



Virtualización, codificación de vídeo, revelación y edición fotográfica, renderizado, simulación o compilación de código, todo va más rápido con los Ryzen 7 de AMD. Phoronix lo atestigua y sitios que utilizan benchmarks sin recompilar obtienen también resultados equivalentes en dichas áreas.

Aparte de esta necesaria comparación con Intel, los nuevos chips de AMD son superiores a los anteriores AMD FX en todos los casos.
Sin duda alguna los nuevos AMD Ryzen son unos procesadores totalmente recomendables por encima de cualquier opción de Intel.

En lo que queda de año saldrán a la venta Ryzen 5, Ryzen 3 y las APU. Es de esperar que a partir de Ryzen 3 se use un núcleo revisado en todas las gamas. Ryzen 3 estará compuesto de un único CCX así que puede que aprovechen para revisar el RTL del núcleo.
Ahora, echemos un vistazo a resultados en juegos y luego a la arquitectura de Ryzen.


El Crysis 3 funciona mucho mejor con el procesador de AMD. Crysis debe de ser un juego que implemente bastante paralelismo y por tanto las caídas de tasa de fotogramas por segundo (reflejadas en los percentiles >= 99%) son menores cuantos más núcleos disponibles hay.
Estos resultados muestran que con el suficiente ancho de banda y una configuración adecuada, Ryzen 7 puede superar de forma absoluta en 1080p al Core i7 7700K pese a funcionar a menor frecuencia.

Si tus hilos no paran de moverse o de ser creados y destruidos sin tener en cuenta la localidad, pierdes rendimiento. Esto en aplicaciones de productividad y servidores no ocurre. En videojuegos... no han estado por la labor. Además, la alta latencia de los anillos cuando hablamos de procesadores de 4 núcleos no se deja notar.

AMD a diferencia de Intel ha optado por un diseño modular y ello le permite escalar fácilmente la cantidad de núcleos, dentro de los límites de un crossbar.

Total: se requieren nuevas UEFI/BIOS con soporte para frecuencias de RAM más elevadas (a día de hoy hay kits de 4266 Mhz DDR -2133 Mhz reales- y el día de las reviews de Ryzen las placas no daban más de 2400 Mhz -1200 Mhz reales-), parches en planificadores y optimizaciones en los juegos para mantener la localidad de los datos en los CCX de manera que se minimice la cantidad de ancho de banda empleado en la interconexión (el crossbar switch, llamado comercialmente Infinity Fabric) y cantidad de prebúsquedas a través de la interconexión. Es como tener una máquina NUMA en un sólo chip. Este tipo de diseño es el que usó Intel para sus Core 2 Quad. PS4 y Xbox One utilizan un chip co-diseñado por AMD y Sony/Microsoft que también usa dos grupos de 4 núcleos. Los desarrolladores de software deberían adoptar las mismas estrategias a la hora de crear su software.

Sabiendo de la existencia de estándares como OpenMP 4.0+, parece que este tipo de chips y los que vendrán serán grandes beneficiados de estos nuevos modelos de programación. En el estándar C++20 está previsto incluir un modelo de hilos de ejecución avanzado: fork-join basado en Intel TBB y Microsoft PPL. Son mas limitados que tareas con dependencias como en OpenMP. Quiza en un futuro se integren construcciones tipo OpenMP en el lenguaje y dejen de ser anotaciones en el código. Esto permitiría añadir dinamismo a la especificación de dependencias. Mientras, seguiremos con fork-join y otros como latches y barriers, corrutinas o los futures mejorados que permiten manualmente crear dependencias entre distintas tareas aunque sin ninguna posibilidad de planificación u otras opciones de una biblioteca de tiempo de ejecución que sí ofrece OpenMP. OpenMP está disponible en los compiladores libres GCC y LLVM. El compilador privativo ICC de Intel también lo soporta. El compilador de Microsoft sólo soporta OpenMP 2.0 (versión publicada en el año 2002), por lo que no hay soporte de tareas ni dependencias o planificación de hilos. La última versión de OpenMP es la 4.5 y está por publicarse la 5.0.

En cuanto a la arquitectura de Ryzen, en la GDC 2017 AMD realizó una charla sobre cómo optimizar el software para Ryzen. En ella mostró una siguiente diapositiva con los distintos relojes empleados:

Relojes y sus dominios en Ryzen. El crossbar usa el MemClk (fuente, GDC 2017, optimizar para Ryzen). 4 núcleos por CCX, 8MiB de caché L3 por CCX, 2 CCX, la interconexión, 2 canales de memoria y el concentrador de E/S

En la siguiente figura se puede observar una fotografía de la circuitería que hay en el dado de Ryzen 7.

Fotografía del dado del AMD Ryzen 7

En un dado de Ryzen (ver figura arriba) hay 2 Core Complexes, un conmutador crossbar, controladores de memoria, PCI Express y otros sin identificar, incluyendo lo que probablemente sean buffers entre las distintas interfaces (crossbar, memoria, I/O). Enlace a imagen de tamaño completo aquí -Imgur-). Estructura del núcleo (core) extraída de las diapositivas presentadas en el ISCC. Lo que marco como L0 correspondería con la caché de micro instrucciones (instrucciones AMD64/IA32 ya traducidas a las instrucciones RISC ejecutadas por el procesador).

Diagrama de bloques de la gama Ryzen 7. Un crossbar switch (Infinity Fabric) conecta diferentes grupos de 4 núcleos. Cada uno de estos grupos emplea un anillo para comunicarse
Sabemos que la frecuencia de la interconexión (un crossbar switch en vez de un anillo) entre los 2 CCX de los Ryzen depende de la frecuencia del bus de memoria. Así que cuanta más frecuencia tenga la RAM, más frecuencia tiene la interconexión entre CCX y más ancho de banda, en bytes por segundo, hay entre ellos. Intel en cambio utiliza un anillo y su frecuencia es independiente de la RAM. Por tanto mientras que aumentar la frecuencia de la RAM en Intel sólo significa disminuir la latencia por fallos en la caché L3, en AMD significa disminuir la latencia por fallos en L3 y la latencia, en ciclos de procesador, de comunicación entre núcleos. O aumentar el ancho de banda, en bytes por segundo, en la comunicación entre núcleos. En el caso de Intel dicha petición se sirve a través del anillo, a la frecuencia del anillo de interconexión, teniendo la L3 una rodaja por núcleo. Así se explica cómo el AMD escala más al aumentar la frecuencia de la RAM que los chips de Intel.

La interconexión de AMD tiene la escalabilidad suficiente para la cantidad de CCX empleada. Naples sólo utiliza 8. Ryzen, 2. Los crossbars tienen menor latencia y pueden ofrecer más ancho de banda. Sin embargo, son más caros. AMD además los mantiene a la misma frecuencia que la RAM, quizás para tener un coste en ciclos idéntico a la hora de acceder a RAM o a otro CCX o a un GPU integrada usando CCXs y GPUs memoria HBM2. En su día AMD indicó que su predictor neuronal les daba una gran parte de la mejora en rendimiento, así que las latencias realmente no deberían ser un problema ya que un buen predictor implica una alta eficiencia en el ancho de banda de interconexión y memoria -> mejor tasa aciertos en las prebúsquedas de datos útiles con lo que se puede compensar la mayor cantidad de ciclos de reloj de procesador necesarios. Ahora bien, si no tienes suficiente ancho de banda, por muy buen predictor que tengas no traerás a tiempo los datos de memoria o de otros CCX. Estamos hablando de que los anillos de los Core i7 funcionan a 3 Ghz mientras que el crossbar de Ryzen funciona a 1,06 - 1,2 Ghz en los análisis realizados. Es decir, por cada ciclo del crossbar de Ryzen pasan más ciclos de procesador que por cada ciclo del anillo del Core i7. A pesar de ello, Ryzen obtiene resultados equivalentes o superiores a cualquier procesador de Intel en aplicaciones multinucleo, lo que da una idea de lo bueno que debe ser el predictor.

Fotografía del dado de un Core i7 6950X. A diferencia de AMD, Intel crea unos dados monolíticos con los núcleos unidos en un anillo (Anandtech)


Fotografía del dado del Core i7 7700K. Gran parte del silicio es dedicado a la GPU
Diagrama de bloques del dado del Core i7 6700K (idéntico al 7700K, salvo por la Gen9.5 de la GPU)

Diagrama de bloques de la microarquitectura Kaby Lake, en la que el core i7 7700K se basa

El núcleo de Intel tiene más recursos: bancos de registros más grandes, estaciones de reserva más grandes, buffer de reordenado más grande y buffer de instrucciones store más grande. Un 5-10% más de todo eso. También tiene mayor ancho de banda entre las cachés L1 y L2, aunque la L1 de instrucciones es el doble de grande en el chip de AMD, así como la caché L2 (512KiB AMD vs. 256 KiB Intel).
En cuanto a entradas de instrucciones listas para enviar a ejecución, Intel tiene una ventana unificada de 97 entradas. AMD ha dispuesto ventanas distribuidas, independientes para cada unidad funcional de enteros y unificada para coma flotante. En total son 6*14 + 96 = 176 entradas.
Intel permite continuar asignando entradas a una unidad funcional si las otras unidades están en espera. En cambio el chip de AMD, aunque otras unidades no tengan instrucciones en espera, dichas entradas no pueden reasignarse a las unidades ocupadas para poder continuar recibiendo instrucciones. Deben de tener sus parámetros bien medidos para hacer esta asignación estática de entradas.
La asignación estática del tamaño de la ventana permite ahorrar energía y disminuir el tiempo de ciclo con el consiguiente problema de reasignación. Aunque por otro lado se garantiza que una unidad funcional va a tener siempre un máximo de 14 entradas libres mientras que con la asignación dinámica una unidad funcional puede llegar a acaparar todas las entradas de la ventana.


Diagrama de bloques de la microarquitectura Zen en la que Ryzen se basa. El «hash perceptron» es el predictor avanzado que ha ideado AMD


Para coma flotante la ventana es unificada y AMD maneja 128 bits por registro vectorial mientras Intel maneja 256 bits por lo que para realizar cálculos de 256 bits (Zen es compatible con AVX2) requiere dos registros.
No está claro que requiera dos entradas en la ventana (a pesar de lo que hay escrito en Wikichip que todo en la parte FP sea de 128 bits: aquí las ventanas no guardan valores, sólo etiquetas, los valores se leen o escriben del banco de registros al entrar en ejecución) ya que podría funcionar como un procesador vectorial con una longitud de vector de 2 elementos (2x128 = 256) y guardar cada mitad en un registro de 128 bits distinto (¿«In order to do AVX, the unit will split the operations accordingly»?). O puede que tenga registros de 256 bits, escribiendo primero una mitad y al siguiente ciclo la otra.
Existe una ventana secuencial («non schedulable») a la que quizá vayan, además de otras, las microoperaciones correspondientes a instrucciones AVX de 256 bits. Cada par de 128 se ejecutaría una tras otra. Así que AMD compensaría parcialmente su falta de anchura en las unidades de cálculo (mayor latencia en 256 bits) con mayor paralelismo (más instrucciones disponibles para ejecución por si una unidad anda atascada). Además, se pueden comunicar valores entre los bancos de registros de enteros y coma flotante bidireccionalmente, útil para las conversiones de entero a flotante y de flotante a entero. Los tests sintéticos como el AIDA no muestran una ventaja de 2x en coma flotante a favor de Intel. Más bien de 1.5-1.75x. En aplicaciones normales con un mix de instrucciones más homogéneo la cosa es bien diferente, como los benchmarks han demostrado.

En cuanto a memoria, AMD realiza reenvíos de las stores a las loads y eliminación de instrucciones push y pop, mitigando también el menor tamaño del buffer de stores. Linus Torvalds especulaba con dicha idea. Estos reenvíos se activan mediante el Stack Memfile Engine [Store to Load forwarding] que aparece en el diagrama, en la parte del front end. Así las loads ya no tienen porqué ocupar ninguna entrada en las ventanas. Escriben en el registro el valor pasado de antemano sin necesidad de hacer ninguna lectura en la caché de instrucciones o leer del buffer de stores.
Otras diferencias son un ancho de banda entre caché L1 y L2 de 32 Bytes/ciclo en el caso de AMD y 64 Bytes/ciclo en el caso de Intel. Además, la caché L3 de AMD es de víctimas (exclusiva, no contiene datos replicados de la L2) mientras que Intel es inclusiva, replicando datos de la L2.
La L1 de instrucciones y la L2 son el doble de grandes en AMD con respecto a Intel, disminuyendo así la cantidad de expulsiones a L3 y sucesivas búsquedas en L3, que al no tener datos replicados de la L2 minimiza el número de accesos al exterior.
En el caso de Intel al tener datos replicados en L3 la capacidad real se ve disminuida, aumentando el uso de la red de comunicación y el consumo energético.
Por otro lado, el tener datos replicados facilita la localización de datos modificados por otros núcleos ya que sólo hay que consultar la L3 mientras que en el caso de AMD hay que consultar la L3 y la L2, algo que probablemente se haga en paralelo para no aumentar la latencia. Se complica la búsqueda de datos a cambio de un menor uso de la red de comunicación. Si el dato no está ni en L2 ni L3, entonces hace falta ir a memoria. Si la petición a memoria se lanzó en paralelo a la búsqueda del resto de cachés, sólo queda esperar una respuesta. Si la prebúsqueda acertó, los datos están en el bufer de prebúsquedas (prefetch buffer): se copian esos datos a la caché y se expulsa el bloque fallido. En caso contrario, hay que esperar a la RAM. Tanto si se acierta como si no, la prebúsqueda traerá datos adicionales de memoria principal para futuros servicios.

Todas estas medidas compensan de alguna manera el menor tamaño con respecto a Intel de los mencionados elementos, dando por posible un menor consumo energético. Los análisis muestran un consumo energético en estado ocioso de hasta 35W menor a Intel. Bajo carga, 5W menos que el 6900K en el Cinebench según PCPer. Recordemos también la frecuencia del anillo de comunicación en Intel de 3 Ghz y del crossbar en AMD de 1,06 Ghz. Ambos tienen el mismo ancho (32 Bytes/ciclo).

Así pues, ¿cómo puede el núcleo de AMD alcanzar o superar al de Intel suponiendo un funcionamiento efectivo de todo lo anterior? Una interconexión con más recursos y un uso más eficiente del ancho de banda de manera que se pierden menos ciclos: jerarquía de caché diferente, usando cachés exclusivas en vez de inclusivas aumentando capacidad efectiva, búsquedas en L2, L3, memoria y prebúsquedas en paralelo. Predicción de saltos con el «hash perceptron» y un algoritmo de prebúsqueda igual de efectivo.

En cuanto a las redes de comunicación, las latencias en los chips de Intel son variables por la unión en anillo de los núcleos mientras que en el caso de AMD son constantes al utilizar un crossbar. Acceder de un CCX a otro tiene siempre el mismo coste. En el caso de Intel no es así:



Cuantos más núcleos se añaden, más «paradas de autobús» tiene el anillo. Más ciclos tarda en ir de un extremo del anillo al otro. Los anillos se manejan como si fueran bidireccionales por lo que la latencia media queda reducida (ir del núcleo 0 al 9 representa un sólo ciclo en un dado de 10 núcleos). La cosa se complica cuando aumentamos la cantidad de núcleos de tal manera que se requiera poner más de un anillo. Eso significa que para acceder a los datos de un núcleo que esté en otro anillo hay que recorrerse el propio y luego el otro hasta llegar al núcleo requerido. Esto requiere varios ciclos, hasta un máximo de 12 con una media de 6 en el caso de 24 núcleos (la bidireccionalidad permite reducir a la mitad la latencia). Los accesos a memoria deben distribuirse de manera uniforme para mejorar la latencia media. Una rodaja de L3 en la que se concentre un alto número de escrituras incrementaría la latencia media si luego el resto de núcleos deben acceder a esos datos modificados por el propietario de dicha rodaja. Con unas escrituras más repartidas la latencia media disminuye ya que la cantidad de ciclos de espera para un dato es similar en todos los núcleos de manera que no haya uno más lento ralentizando al resto.

Por otra parte, un anillo permite escalar el número de núcleos mucho más que un crossbar, que permite colocar de 16 a 32 elementos sin perjuicio para el rendimiento. No se ve limitado aunque empeore latencias. Y siempre puedes colocar más de un anillo para mejorar latencias medias. AMD trata de aumentar la escalabilidad al tener los núcleos agrupados en paquetes de cuatro. El coste en espacio de un crossbar es cuadrático, el de un anillo es linea.

La red de comunicación entre núcleos incluye la comunicación con la memoria principal y los periféricos, que están conectados también a través de la misma.

Esto explicaría los resultados de latencia obtenidos por hardware.fr, en los que el Ryzen se comporta como si tuviera 8 MiB de L3 y no 16 MiB. Cuando se encuentra con el límite de capacidad de caché de un CCX, los nuevos datos vendrán de la memoria principal en vez del otro trozo de 8 MiB de L3 o de la memoria temporal (buffer) de prebúsqueda, ya que no han sido usados en ningún momento (mono hilo, no hay comunicación entre CCX, acceso a memoria puramente secuencial). En el caso de Intel, la L3 se comparte con todos los núcleos y se puede ver como la latencia aumenta progresivamente a medida que se usa más caché. En el caso de AMD, las latencias son más altas (Intel 3 GHz vs. AMD 1 GHz) y se ve el aumento repentino en 6 y 8 MiB para terminar con la latencia media de acceso a memoria a partir de 8 MiB. Sin embargo, esto no hay que tenerlo en cuenta: es un test sintético en el que no hay cabida para predicciones de ningún tipo. Si no, no se explicaría el contínuo aumento de rendimiento del AMD a medida que se aumenta la frecuencia de la memoria mientras el procesador de Intel se queda estancado.

2 comentarios:

  1. Golem vio un incremento del 17% con una nueva BIOS en una placa base de MSI.
    Con ASUS incluso algo más.
    En alemán:
    https://www.golem.de/news/ryzen-7-18...-125996-4.html

    ResponderEliminar
  2. Yo tuve un Intel Core 2 Quad Q6600 cuando todo el mundo compraba los dual cores. El Q6600 tenía una disposición de núcleos similar a Ryzen: dos dual cores que se comunicaban a través del bus de comunicación con memoria principal. Esto era un cuello de botella mucho mayor que la interconexión entre los dos CCX de Ryzen. Aún así, coger un quadcore en vez de un dual core me rentó bastante. Cada vez que ripeaba vídeo, música o grababa vídeos de partidas en juegos el C2Q salía muy, muy a cuenta. Y ya no te digo cuando los juegos pasaron a usar cuatro núcleos. Ahora estamos en la misma situación. Los juegos ocupan 4 núcleos y con el Ryzen tienes otros 4 núcleos disponibles para otras tareas al mismo tiempo que juegas y cuando haces otra cosa que no sea jugar, obtienes un rendimiento mucho mayor que cualquier quadcore.

    ResponderEliminar