jueves, 2 de febrero de 2017

AMD AGLUs, Bulldozer INT cores. Actualizado – LowLevelHardware

En este técnico artículo voy a detallar la estructura de los pipelines de ejecución de los INT cores duales de un módulo del nuevo procesador AMD Bulldozer.

int_clusterUno de los núcleos de enteros de Bulldozer.

AMD Bulldozer. Filosofía de diseño.

Con Bulldozer AMD ha roto con el diseño “convencional” para el núcleo de procesamiento. Hasta ahora, un procesador era un bloque que trabajaba conjunta y síncronamente compuesto de varias subunidades.

BulldozerAMD Bulldozer: Cada INT core y la unidad SIMD son funcionalmente independientes.

En cambio en Bulldozer, AMD ha seguido un diseño  CMT (Cluster Multi Processing) de coprocesamiento con subunidades independientes y con pipelines desacoplados mediante buffers y queues.

Las ventaja principal de esta disposición reside en la compartición de algunas estructuras entre los dos cores de enteros. Cada core ejecuta un thread, cada thread debería afinitizarse a un core para dar un óptimo rendimiento.

Aunque alguna de las unidades esté bloqueada procesando datos el Front End sigue ejecutando Fetching y computando los Branches llenando sus queues (colas) y buffers con resultados.

OrochiDie de Bulldozer con 4 módulos y 8 INT cores.

Resumiendo, con Bulldozer AMD construye un procesador multicore de 8 núcleos partiendo de una unidad que llaman el módulo que incluye 2 INT cores, la unidad SIMD y la L2 de 2 MB y 16 vías.

A lo largo de los dos últimos años he escrito varios artículos sobre AMD Bulldozer:

AMD Bulldozer. Primeros benchmarks. Actualizado – LowLevelHardware

AMD Bulldozer – ProfessionalSAT

La micro arquitectura de AMD Bulldozer. Actualizado – LowLevelHardware

Novedades y expectativas 2010. Actualizado – LowLevelHardware

AMD Bulldozer. Prestaciones estimadas – LowLevelHardware

Micro arquitectura AMD Bulldozer 2011. Actualizado – LowLevelHardware

Previo AMD Bulldozer. Actualizado – LowLevelHardware

AMD Bulldozer Front End.

El frontend de Bulldozer es compartido por todas las subunidades y está dimensionado y lógicamente desacoplado de las unidades de ejecución.

Cada módulo contiene un sólo Front End que da servicio a tres unidades de ejecución:

  • Los dos INT cores con 4 pipelines de ejecución cada uno y con su Scheduler y Register File privados.
  • La unidad SIMD compartida (llamada desacertadamente por AMD y la prensa especializada FPU compartida) con su Schedule y Register File.
    Yo la llamo unidad SIMD porque no sólo incluye (como detallaré en otro artículo) dos pipelines SIMD SSE, AVX y X87 sino también 2 unidades de 128 bit SIMD de enteros SSE y MMX (INT SIMD SSE y MMX).

FrontendEn rojo resaltado el Front End de AMD Bulldozer.

El Front End contiene entre otros:

  • La lógica de Branch Prediction que ha sido considerablemente rediseñada y ampliada de cara a aumentar su tasa de aciertos. Cuenta con un BTB de 2 niveles con miss penalties (penalización de fallo) de 15 a 20 ciclos en función del tipo de Branch.
  • Las etapas de fetching y decoding cargan datos (32 bytes/ciclo) desde las cachés L1i (64 KB, 2 vías) y alimentan dos ventanas de 16 bytes (una por thread). Hay un IBB (Instruction Byte Buffers) de 16 niveles en la cola de fetching por thread (2 IBBs, con cada 16 bytes por nivel).
    Los Decoders pueden decodificar hasta 4 instrucciones / ciclo desde los IBB, cada ciclo se escanean dos de las ventanas de 16 bytes en busca de hasta cuatro instrucciones. En caso de instrucciones X86 complejas que hagan recurrir al Microcode Engine solamente se decodifica una instrucción por ciclo.

Bulldozer INT cores. Unidades de enteros.

Cada unidad de enteros es como un pequeño core de ejecución de 64 bit con 4 pipelines discretos alimentados por un Scheduler independiente.

INTcoresEn verde y azul los dos INT cores de un módulo Bulldozer.

El núcleo de ejecución consta de 4 pipelines de 64 bit con un diseño peculiar y novedoso que incluye las unidades combinadas AGLU:

Bulldozer_INT_PIPESCuatro unidades de ejecución de enteros con Scheduler común.

La longitud de los pipelines de enteros ha crecido en Bulldozer de un modo espectacular hasta las 18 o 20 etapas. Comparado con las 12 etapas de AMD Phenom destaca como un diseño claramente dirigido a altas frecuencias que en mi modesta opinión sólo tiene sentido si supera con claridad los 4 GHz en modos Turbo para compensar su gran penalización en caso de fallo de predicción Branch.

INT_cores

Los dos INT cores que forman parte de un módulo en AMD Bulldozer.

Lo novedoso de los INT cores son sus unidades híbridas AGLU:

Son unidades AGU (de generación de direcciones de memoria, address generators) pero con funciones básicas ALU, es decir, pueden procesar instrucciones simples ALU (LEA 64, INC) echando una mano para compensar el escaso ancho de proceso del core.

int_cluster_AGLUSResaltadas las dos AGLUs pertenecientes a uno de los INT cores.

Las unidades de ejecución completas (Full ALU) EX0 y EX1 incluyen hardware específico para IMUL e IDIV:

  • EX0 contiene una unidad de división de enteros parcialmente pipelinizada y con latencia y capacidad de proceso variable en función de la precisión. Aunque examinando detenidamente la documentación parece que más bien se trata de una unidad “virtual” ya que la instrucción IDIV se decodifica en el Microcode Engine y se secuencia en instrucciones sencillas ALU que se ejecutan en EX0. Además incluye una unidad para LZCNT y POPCNT.
  • EX1 por su parte contiene un rapidísimo multiplicador de enteros pipelinizado y de bajísima latencia.
  • Ambas unidades procesan Branches e instrucciones de enteros complejas.

Cada INT core cuenta con su Scheduler discreto e independiente y ejecuta un thread, además supervisa el procesamiento en las unidad SIMD compartida de las instrucciones FPU X87, FPU SIMD SSE / AVX  o INT SIMD MMX / SSE.

Conclusiones

El diseño de Bulldozer me deja un sabor agridulce, AMD sin duda ha dado un paso adelante y si consigue ponerlo en el mercado a frecuencias adecuadas (4 GHz o más en Turbo Mode) tendrá un procesador globalmente competitivo con Sandy Bridge.

Hay detalles que sinceramente no me acaban de convencer como algunas latencias muy elevadas en algunas instrucciones y sin duda será inferior a Sandy Bridge en proceso FPU AVX 256 bit.

Bulldozer puede ser un excelente procesador en cargas de enteros de 8 threads, queda la incógnita acerca del rendimiento de su caché L3 y el subsistema de memoria.

Las latencias L3 serán altas, creo que superiores a los 50 ciclos load to use, razonable me parecen 60 incluso. Hay que ver como compensa efectivamente el Hardware Prefetch este hecho. La elevada latencia L2 (de 18 a 20 ciclos) la compensa parcialmente su gran tamaño (Sandy Bridge se conforma con 256 KB, 8 veces menos, pero con latencias de 9-10 ciclos).

Tengamos en cuenta que la frecuencia del Uncore que incluye la caché L3 multibanco (4 bancos de 2 MB) de 8 MB será muy inferior a la de los cores, probablemente se mueva sobre los 2.4 – 2.66 GHz lo que afectará a la latencia L3 y de memoria.

El panorama en 2011 será divertido… nos vemos en la próxima entrega con un análisis de la unidad SIMD de 4 vías compartida de proceso FPU SSE / AVX / X87 y INT SIMD SSE / MMX.

Si consideras útil el contenido de este Blog, ayuda a mantenerlo ojeando algunas de las ofertas que consideres interesantes de nuestros anunciantes.