Blog Personal.

Conceptos Básicos

Fast of Furious

En el Discord me habéis preguntado lo siguiente:

Buenas Urian, he descubierto tu página hace poco y me parece una pasada. Estos días he leído que tanto Series X como PS5 tendrían 4 shader arrays y por tanto la mayor frecuencia de PS5 se traduciría en un poligonaje sensiblemente superior… Pero sin embargo la inferioridad en cantidad de shading units mantendría dilatada la calidad del tratamiento de la escena, ¿no? Entiendo que el concepto de PS5 es poder tener una GPU barata que dé mucha tralla… Aunque tendría que tener una circuitería de calidad para mantener semejantes frecuencias y a saber qué voltajes sin que la vida útil sea escasa…

Pues sinceramente…

Lo único que puedo es explicar un poco de teoría general como premisa para que la gente pueda sacar conclusiones.

A la hora de renderizar una escena en 3D las primitivas gráficas pasan por una serie de etapas que se pueden dividir en dos partes.

  • El pipeline geométrico o World Space Pipeline.
  • El pipeline de rasterización o Screen Space Pipeline.

En el primero trabajamos con primitivas geométricas que son los vértices que forman los polígonos y no se trabaja a nivel de una resolución concreta, en la segunda étapa trabajamos con fragmentos que son polígonos rasterizados y teniendo en cuenta una resolución concreta.

La primera etapa del Screen Space Pipeline realmente es una étapa de transición, una étapa intermedia.

¿Que significa esto? Un ráster no es más que es una matriz de pixeles, lo que esencialmente llamamos bitmap y el proceso de rasterización no es otra cosa que la transformación de toda la geometría de la escena en rasters, es decir, mapas de bits.

Durante el World Space Pipeline, por triangulo solo tenemos que trabajar con unos 3 vertices, pero en el Screen Space Pipeline la cantidad de datos con los que trabajamos (número de pixeles aumenta enormemente), de ahí el famoso gráfico en forma de diamante que he puesto varias veces.

Los más veteranos recordaréis como las gráficas de antaño tenían Pixel/Fragment Shaders y Vertex Shaders separados con un ratio de los primeros respecto a los segundos realmente alto. Llego un tiempo que los Shaders se unificaron a una sola unidad para solventar de manera muy pero que muy rápida el World Space Pipeline aumentando enormemente la cantidad de unidades correspondiente a estos. Ahora bien, el elemento más limitante existente son las unidades de rasterizado porque dependiendo de la tasa de la velocidad en la que conviertan los triángulos en fragmentos (rasters) entonces el Screen Space Pipeline funcionará con más o menos rendimiento.

En el World Space Pipeline (Pipeline Geométrico) enviamos un vertice por ola por lo que podemos asignar todas las instrucciones de una ola a un solo dato, esto hace que todos los shaders geométricos funcionen igual que el Compute Shader y se hayan convertido en eso mismo haciendo que actualmente solo hayan dos tipos de Shaders realmente, siendo el otro tipo de los Pixel Fragment/Shaders?

Hay que tener en cuenta que los triángulos ya rasterizados se subdividen en grupos de 2×2 pixeles llamados fragmentos y se envían a las Compute Units (SM en el caso de Nvidia) asociadas a la unidad de rasterizado. En este caso la ola si contiene n instrucciones no será n instrucciones distintas sino n/4 instrucciones distintas que se reparten entre los 4 pixeles distintos.

¿Pero como se distribuyen los fragmentos de un triangulo rasterizado?

Imaginemos que un polígono se convierte en un fragmento de 4×4 pixeles, esto significa que el fragmento será enviado a 4 Compute Units distintas.

Y dentro de cada Compute Units, cada pixel del fragmento será trabajado por una de las unidades SIMD.

Este es el motivo por el cual las CUs/SM en general tienen 4 unidades SIMD y 4 unidades de texturas. A cada fragmento de 2×2 pixeles le corresponde una ola, pueden haber varias olas por fragmento pero en general a nivel de ejecución de las Compute Units el tamaño de las olas es limitado. El caso es que cada ola en la Compute Unit se va a mantener hasta que sea resuelta por completo, para ello utilizan el método Round-Robin que se basa en darle un tiempo fijo a cada instrucción, si la instrucción no puede resolverse por falta de datos entonces pasa atrás en la cola y se adelanta la siguiente. ¿Pero que ocurre cuando se solventa una ola? Pues que deja espacio para que entre otra ola, es decir, otro fragmento de 2×2 en la Compute Unit.

Los fragmentos no se solucionan inmediatamente sino que son colocados en los registros de la Compute Unit y solo se solventarán cuando los que vienen antes hayan sido resueltos, aparte de que el tamaño de los registros es fijo así como la cantidad de olas que el planificador puede manejar. Cuando se llega a uno de los dos límites entonces la Compute Unit ya no puede recibir más fragmentos desde la unidad de rasterizado con los que operar.

A la hora de distribuir los fragmentos para un máximo paralelismo no se distribuyen secuencialmente sobre una misma Compute Unit sino que un mismo fragmento ya dividido en sub-fragmentos de 2×2 se va repartiendo en las diferentes Compute Units, cuando no hay más fragmentos que repartir entonces las Compute Units que hay más allá no se utilizan, cuando hay pocas Compute Units entonces se reparten los siguientes fragmentos (recordad que a cada fragmento le corresponde una ola) de nuevo empezando por la primera Compute Unit pero estos no se van a solucionar hasta que la ola/fragmento que este ejecutándose previamente en esa Compute Unit lo haga.

El otro tema importante es el tamaño de los triángulos en lo que a la cantidad de pixeles se refiere una vez han sido rasterizados. El problema de las unidades de rasterizado actuales es su tasa de primitivas rasterizadas es fija y cuando los fragmentos son pequeños entonces esto se traduce en que el aprovechamiento de las Compute Units es menor por el hecho que hay menos fragmentos a repartir entre las Compute Units.

El problema con las unidades de rasterizado es que al ser de función fija tienen un limite respecto a la cantidad de pixeles que pueden generar por triangulo pero el verdadero handicap es que si los fragmentos generados tienen la mitad de pixeles entonces no se van a rasterizar el doble de triangulos. Este problema lo comento muy bien el profesor Kayvon Fatahalian en su presentación acerca de hacer evolucionar el pipeline 3D para ejecutar micropoligonos de la cual saque la siguiente imagen.

Supongamos que tenemos una unidad de rasterizado que genera fragmentos de 4×4 pixeles como mucho, si hacemos los triángulos más pequeños y por tanto los fragmentos resultantes entonces la cantidad de fragmentos que se envían a las Compute Units se reduce.

Aunque Fatahalian lo explico perfectamente en su presentación de 2011 sobre el tema.

Mi sorpresa es que buscando patentes sobre la aplicación de micropoligonos me encuentro con una llamada Parallel micropolygon rasterizers donde se hace referencia a las presentaciones del profesor Kayvon Fatahalian en dicha patente por lo que AMD tendría un nuevo tipo de unidad de rasterizado pensado para operar eficiencientemente con el micropoligonaje.

¿Y por qué es importante esto? Pues por el Unreal Engine 5.

Epic Games dijo que el rasterizado de los micropoligonos en la demo de Unreal Engine 5 en vez de realizarse a través de la unidad de rasterizado se hace a través de los Shaders a través de un programa Compute Shader por el hecho de que las unidades de rasterizado son demasiado lentas. En este caso una GPU con mayor potencia en las Compute Units sale ganando pero lo normal es esperar que el nuevo tipo de unidad de rasterizado sea implementada y que no haga falta tirar de Compute Shaders para hacer dicho trabajo ya que esto es menos potencia para otro tipo de shaders.

Claro esta que no sabemos si AMD ha integrado esto en RDNA 2, el hecho de que Epic tire de Compute Shaders para esto nos hace pensar que RDNA 2 utiliza el mismo tipo de unidad de rasterizado que Vega y la primera generación de RDNA y por tanto las consolas no se beneficiarían de una unidad de rasterizado de este tipo. Provocando que el rendimiento utilizando micropoligonaje no sea todo lo eficiente que debería ser por los motivos explicados arriba.

A partir de esta explicación puedes sacar conclusiones pero te digo que depende del tipo de aplicación que se ejecute en la GPU y no podemos sacer una idea generalizada por eso mismo. Cada motor gráfico, cada juego, cada escena es un mundo distinto con exigencias distintas por lo que no podemos sacar una conclusión general.

En todo caso, no se pueden confundir la cantidad de poligonos/segundo que puede convertir una unidad de rasterizado en un raster con la cantidad real de polígonos en pantalla que hay en el fotograma final.

Tampoco acabo de entender por qué Mark Cerny decía que mantener 2Ghz era tan difícil y al mismo tiempo que PS5 puede estar a 2.23Ghz casi todo el tiempo, me parece una contradicción muy rara.

No esta siempre a 2.23 Ghz, el fenómeno lo explique hace unos días.

Básicamente cada tipo de instrucción tiene un consumo energético distinto y el reloj se adapta según el consumo energético de la instrucción. No todas las instruciones pueden ir a más de 2Ghz pero algunas si que pueden hacerlo.

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

5 2 votes
Article Rating
1 Comment
Oldest
Newest Most Voted
Inline Feedbacks
View all comments

[…] Fast of Furious […]