Blog Personal.

AMD, Conceptos Básicos, Intel, Nvidia

Organización y Comunicación de una GPU contemporánea

Contemporáneo( ADJETIVO): 1. Que existe al mismo tiempo que otra cosa, que pertenece a la misma época que ella. 2. Que existe en la época actual, que pertenece al presente.

Organización de una GPU contemporánea.

La organización interna de una GPU es como la de una matrioska.

También podríamos hablar de un conjunto almacenando una serie de subconjuntos de manera progresiva, en la siguiente sección os haga un repaso rápido de la arquitectura general de una GPU

Conjunto A: La Compute Unit

Compuesta por:

  • Unidades SIMD y sus registros
  • Unidades Escalares y sus registros.
  • Planificador
  • Memoria Local Compartida
  • Unidad de Filtraje de Texturas
  • Cache de datos y/o texturas de primer nivel
  • Unidades Load/Store para mover datos desde y hacía la cache y la memoria compartida.
  • Unidad de Intersección de Rayos.
  • Arrays Sistolicos.
  • Export Bus que exporta datos hacía fuera del Conjunto A y hacía los diferentes componentes del Conjunto B.

Conjunto B: Shader Array/Shader Engine

Compuesta por:

  • Varios Conjuntos A en su interior (Compute Units)
  • Caches de Instrucciones y Constantes

Tanto en GCN como en RDNA grupos de Compute Units tienen dichas caches compartidas y están organizadas en un conjunto común.

Las Compute Units pueden exportar datos a otras Compute Units sino a una serie de unidades de función fija que se encuentran dentro del Conjunto B:

  • Unidad de Primitivas: Esta es invocada durante el World Space Pipeline o Pipeline Geométrico, se encarga de realizar la teselación de la geometría de la escena.
  • Unidad de Rasterizado: Realiza el rasterizado de las primitivas, convirtiendo los triangulos en fragmentos de pixeles y siendo su etapa la que empieza el llamado Screen Space Pipeline o Fase de Rasterización.
  • ROPS: Unidades que escriben los búfers de imagen, actúan durante dos etapas. En la fase de rasterizado previa a la de texturizado generan el búfer de profundidad (Z-Buffer) mientras que en la fase posterior al texturizado reciben el resultado de esta étapa para generar el Color Buffer o los diferentes Render Targets (renderizado en diferido).

Estas tres unidades son de función fija o pseudo-fija, simplemente harán siempre el mismo trabajo. Digo que son psuedo-fija porque realmente podemos escoger versiones de ese mismo trabajo ya cableadas.

Conjunto C: Unidad GFX

La unidad GFX es casi la GPU completa o la GPU sin los aceleradores, se compone de los siguientes componentes:

  • Varios Conjuntos B en su interior.
  • Memoria Global Compartida: Un Scratchpad y por tanto fuera de la jerarquía de caches para comunicar los Conjuntos B entre si.
  • Unidad Geométrica: Tiene la capacidad de leer los punteros a la RAM que apuntan a la geometría de la escena, con ello es posible eliminar geometría no visible o superflua para que no se renderice inútilmente en el fotograma.
  • Procesadores de Comandos (Gráficos y Computación)
  • Cache de Último Nivel: Todos los elementos de la GPU son clientes de esta cache por lo que tiene que tener un anillo de comunicación inmenso, todos los componentes del Conjunto B tienen contacto directo con la Cache L2 así como todos los componentes del propio Conjunto C.

La Cache de Último Nivel o Last Level Cache (LLC) es importante ya que es la cache que nos da coherencia entre todos los elementos del Conjunto C entre si incluyendo obviamente los Conjuntos B dentro del mismo. No solo eso sino que permite no sobre-saturar el controlador de memoria externa ya que con esto es la propia LLC junto a la o las unidades MMU de la GPU las que se encargan de hacer la captación de instrucciones y datos desde la RAM. Pensad en la Last Level Cache como una especie de almacén de logística en la que todos los elementos del Conjunto C envían y/o reciben sus paquetes y la logística de los mismos esta controlada por la MMU que es la unidad encargada de hacerlo.

El concepto de la cache de último nivel no es único de las GPUs, se encuentra en todo procesador multinúcleo.

Conjunto D: GPU

Esta compuesto por:

  • La Unidad GFX incluyendo la LCC
  • El puente Norte o Northbridge de la GPU, si esta se encuentra en un SoC heterogéneo (con una CPU) pero con un pozo de memoria compartido entonces utilizarán un Northbridge común. Todos los elementos del Conjunto D se encuentran conectados al Northbridge
  • Aceleradores: Codificadores de Video, Adaptadores de Pantalla, se encuentran conectados al Northbridge. En el caso del Adaptador de Pantalla es el que envía la señal de video al puerto DisplayPort o al HDMI
  • Unidades DMA: Si hay dos espacios de direccionamiento de La RAM (incluso con un mismo pozo físico) la unidad DMA permite pasar datos de un espacio de la RAM a otra. En el caso de que sea una GPU aparte las unidades DMA sirven como comunicación con la CPU u otras GPUs.
  • Controlador e interfaz de memoria: Permite Comunicar los elementos de Conjunto D con la RAM externa. Se encuentran conectados al Northbridge y es el unico camino de entrada a la RAM exterior.

Para la explicación he tomado las GPUs de AMD como referencia, pero los mismos conceptos son 100% aplicables a las GPUs de Nvidia, Intel o cualquier otra marca.

Comunicacion de una GPU contemporánea.

Para poder comunicar entre si los diferentes elementos en un conjunto de los que hemos visto arriba necesitamos lo que se llama un Crossbar Switch. Este es una infraestructura en red con varios puntos de entrada y varios puntos de salida, en realidad los mismos puntos de entrada son los de salida pero esto nos permite cablar los diferentes componentes entre si.

Pero como habréis adivinado el Crossbar no entiende de comunicación entre componentes y no es más que una red tonta, es por ello que se utilizan routers para comunicar los diferentes componentes entre si y si, el concepto es el mismo que el tener un router como que utilizaís en casa para internet.

Estos routers son pequeños procesadores que se comunican entre si, solo necesitan la dirección interna de cada componente para comunicarse internamente. Sin ellos sería necesario asignar direcciones de memoria de la RAM y exportar los datos a la misma creando una enorme latencia y sobretodo teniendo que trasladar los datos a la memoria externa, lo que supone un aumento enorme en el coste energético de las transmisiones.

Es necesario que la transmisión de datos independientemente sea lo más cercana posible al procesador. Esto afecta enormemente a la construcción de una GPU basada en Chiplets a tiempo presente ya que si actualmente fuese posible ya las tendríamos en el mercado ya que fabricar un chip único y más pequeño es mejor de cara a costes y manejo del stock que varios chips monolíticos pero actualmente no se puede hacer eso.

El «router» creado por AMD para comunicar interna y externamente los bloques de sus arquitecturas es el Infinity Fabric, un intercomunicador de 32 Bytes/ciclo (256 bits/ciclo) que comunica las diferentes partes entre si comunicando los diferentes routers entre si a diferentes niveles. Esta tecnología es utilizada a todos los niveles de la arquitectura tanto en RDNA como en Ryzen para comunicar los diferentes componentes entre si ya sea internamente como externamente (fuera del chip), esto les permite subdividir las arquitecturas en varios chips sin problemas como ocurre con los chips basados en Zen 2.

En realidad todas las empresas están realizando desarrollos en este sentido en los últimos años con tal de poder dividir en chiplets no solo sus CPUs sino también sus GPUs.

El problema es que para comunicar la gran cantidad de componentes que hay en una GPU (o una CPU con decenas de núcleos) necesitamos una enorme cantidad de canales de comunicación y por tanto de cableado, como mínimo n2 donde n es la cantidad de elementos activos y por tanto esto es una gran cantidad de cables. Lo que se hace es asignar un router conjunto a un grupo de elementos y utilizar un mecanismo SerDes (Serializador/Deserializador) con tal de reducir la cantidad de cables.

El SerDES se encuentra en cada Receptor y Transmisor de cada uno de los «routers» que hay alrededor del procesador. Siendo los paquetes serializados previamente al envió de datos y son deserializados posteriormente a la recepción, con ello reducimos el cableado y nos olvidamos tener que tirar de un Crossbar Switch la mar de complejo compuesto por n2 cables sino por uno de r2 donde r es la cantidad de routers existentes en la arquitectura.

Una de las cosas que se implementan en los SerDES son unidades de compresión/descompresión al vuelo que toman los datos serializados desde el emisor de manera comprimida y los descomprimen al vuelo y en serie para enviarlos al receptor ya descomprimidos. El uso de los SerDES es importante en interfaces entre diferentes chips. Esto es debido a que tener una gran cantidad de clientes a través de una interfaz externa aumenta enormemente el perimetro del chip resultante ya que la intercomunicación se hace en la parte exterior del chip, en la parte interna puedes crear un Crossbar Switch interno pero no en la parte externa donde no se puede, de ahí la importancia de utilizar mecanismos SerDES para reducir la cantidad de cables y la comunicación solamente a los routers entre si.

Y con todo esto deberías poder entender un poco mejor (creo que bastante mejor) la arquitectura de una GPU.

Esto es todo, tenéis los comentarios de esta misma entrada para comentar y no olvideis que tenemos Discord.

5 1 vote
Article Rating
3 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments

[…] Organización y Comunicación de una GPU contemporánea […]

[…] Organización y Comunicación de una GPU contemporánea […]

[…] Organización y Comunicación de una GPU contemporánea […]