Tened en cuenta que esto es completamente especulatorio pero tiene un fundamento real. Antes de nada hemos de tener en cuenta que es el rasterizado de los polígonos, lo cual he explicado en la entrada anterior y en esta entrada aprovechare para ampliar el concepto… ¿Que ocurre cuando realizamos el rasterizado en un Tile Renderer? Es decir, una GPU donde en vez de rasterizar teniendo en cuenta la ventana completa se tenga en cuenta solo una parte de la ventana.

El tema es que hay que diferenciar el rasterizado por tiles del renderizado por tiles, se necesita lo primero para lo segundo pero el hecho que una GPU rasterice por tiles no implica que a posteriori vaya a renderizar la escena por tiles y puede hacerlo de manera convencional. Una arquitectura con un rasterizador por tiles pero que renderiza de manera normal son las Maxwell y las Pascal de Nvidia.

En el siguiente video David Kanter nos muestra como rasteriza primero una GPU convencional y como rasteriza (a partir del minuto 11) una con un rasterizador por tiles y estamos hablando de una GPU con la misma arquitectura que la que lleva Nintendo Switch.

Como los polígonos no se envían todos de manera ordenada para poder realizar esto todas las GPUs con un rasterizador por tiles (independientemente de si luego renderizan a nivel de tile o de pantalla completa) necesitan ordenar la geometría antes del periodo de rasterización y al principio del pipeline ni en la parte final del pipeline, es por ello que se las llama arquitecturas sort(ordenar) middle (en medio).

sortmiddle

Sabemos que arquitecturas que son puro Tile Renderer como los PowerVR y los Mali son así pero… ¿Lo es la arquitectura Maxwell de Nvidia? Lo que sabemos es que tiene una unidad de tiling en su interior para realizar el rasterizado, pero no podemos saber así como así que es una arquitectura sort-middle, así que lo mejor es tirar de patentes que nos informarán de la arquitectura del chip. Y por suerte he encontrado una relacionada con la arquitectura Maxwell (y Pascal).

Esta claro que es una GPU mirando sus diagramas principales.

nvidiapatent1

nvidiapatent0

Eso si, no aparece ninguna unidad de tiling por el momento… Bueno, si que aparece…

nvidiapatent2

La unidad de Tiling se encuentra en los dos mundos y esta marcada con el número 375, veamos lo que hace:

La unidad de tiling 375 es un motor de ordenamiento de primitivas gráficas que reside entre el world space pipeline 352 y el screen space pipeline.

Con esto queda confirmado que la GPU es sort-middle y sabemos que rasteriza por tiles, ahora bien… ¿renderiza por tiles?

nvidiapatent3

La FIG. 4 es un diagrama conceptual de la cache tile que el pipeline de procesamiento de gráficos puede estar configurado para generar y procesar, de acuerdo con una encarnación de la presente invención.

El espacio de pantalla 400 representa uno o más búfers configurados para almacenar datos renderizados de imagen y otros datos transmitidos por unidades funcionaes dentro del pipeline de procesamiento gráfico. El espacio de pantalla 400 puede esta asociado con cualquier número de render targets.

Vamos, que por si no quedaba claro es el búfer de imagen.

Cada cache tile 410 representa una porción del espacio de pantalla 400.

Ahora bien, en un Tile Renderer convencional lo que hace es procesar dichas tiles en una memoria y/o cache interna dependiendo del caso.

En algunas encarnaciones, las cache tiles pueden tener un tamaño arbitrario de X e Y en el espacio de pantalla. Por ejempl, si una cache tile tiene que residir en una cache de memroia que también es utilizada pra almacenar otros datos, entonces la cche tile puede tener un tamaño que le permita consumir solo una porción específica de la cache de memoria.

Y aquí entramos en la gran diferencia, si quieres que Maxwell renderice por tiles lo has de especificar y renderizar sobre la cache L2 con un problema añadido, todo, absolutamente todo lo que procesa la GPU pasa por la cache L2 y el hecho de decirle a la GPU que renderice sobre la cache y no sabre la RAM principal lo tenemos que realizar de manera manual, incluso la propia patente nos informa que se puede producir una cache miss si la leeis detenidamente, en el caso de un tile renderer las posibilidades que se produzca una cache miss es 0.

Los raster tiles 420 representan una porcion de la cache tile (410). Como se muestra, la cache tile 410(0) incluye unos 16 raster tiles 420(0)-420(5) ordenados en un array de cuatro raster tiles 420 de alto por cuatro raster tiles 420 de ancho.

Esto son 4×4 pixeles y hemos de tener en cuenta que…

El espacio de pantalla 400 puede incluir hasta ocho render targets.

Esto significa:

16*16*4 bytes de color*8 RTs= 8KB

¿Pero cual es la velocidad de tratamiento de los tiles? ¿Se tratan de uno en uno o simplemente se trabaja en paralelo en sistemas más potentes?

En sistemas que incluyen multiples GPC 208, el procesamiento asociado con una cache tile se puede dividir entre los GPCs disponibles.

Esto es una GeForce 980, tiene cuatro GPCs:

gtx980-17b

Por lo que dividirá el tile en cuatro grupos de 2×2 pixeles y lo tratara de esta manera, tened en cuenta que no se puede dividir más allá de 2×2 pixeles, en cambio la 960 que tiene dos GPC dividirá el tile en 2×4 pixeles o 4×2 pixeles.

nvidia-geforce-gtx-960-block-diagram

La GPU en el Tegra X1 se compone de un solo GPC por lo que no dividirá nunca el tile.

x1gpu

Por lo que los tiles una vez ordenados son procesados uno por uno y lo que varía no es la cantidad de tiles que son procesados al mismo tiempo sino la velocidad con la que estos son procesados. En todo caso el sistema no procesa por tiles… pero es una base para hacerle unos cuantos cambios y hacerlo evolucionar a un tile renderer al uso y puede, digo puede, que esa evolución se haya hecho en la Nintendo Switch.

¿En que me baso? Primero en los juegos que utilizaban un alto ancho de banda para Bc y Bz de Wii U por el hecho que estaban pensados para aprovechar la eDRAM que han sido portados sin problemas a Switch pese a que mirando la foto de la circuitería no hay memoria externa para compensarlo.

wp-1487525363509.jpeg

Y el tamaño del chip es demasiado pequeño para contener memoria embebida lo suficientemente grande por lo que lo único que nos queda es el tile rendering y no olvidemos que para tener un tile renderer hace falta una GPU del tipo sort-middle como base.

Existe una patente de Nvidia donde aparece una arquitectura de GPU atípica que habla de un sistema de este tipo, a partir de ahora estoy hablando de otra patente, lo digo porque los números de referencia no coinciden.

Un tile shader para el espacio de pantalla del pipeline gráfico, un método para renderizar gráficos y una GPU son comentados En una encarnación, el tile shader incluye: (1) una interfaz de entrada para recibir un tile de pixeles para procesar y (2) yn procesador de tiles configurado para realizar un procesamiento a nivel de tiles de los pixels.

Dicho procesador no existía en la otra patente y este no es la unidad de tiling sino que es la unidad que recibe los tiles ya ordenados que son enviados desde el rasterizador.

tileprocessor

El Tile Shader 400 incluye una interfaz de entrada 410, una interfaz de salida 420 y un procesador de tiles 430. El tile shader es un tile shader programable que esta configurado para operar con tiles de pixeles de acuerdo con una serie de instrucciones que reflejan los algoritimos para realizar operaciones del espacio de pantalla a nivel de tile.

En la arquitectura Maxwell convencional lo que se hace es ordenar los tiles y enviar la información de estos directamente desde la memoria principal al pixel/fragment shader para texturizar, pero la información del tile se encuentra en la memoria principal. Con el Tile Shader lo que se hace es que el tile shader es el que lee directamente en memoria el tile y lo procesa para enviarlo al Pixel/Fragment Shader… Pero aquí nos encontramos de nuevo con el mismo problema de antes:

tileshaderproblem

Necesitamos que la parte final del pipeline que pone composite escriba no en la DRAM los búfers de imagen sino que lo haga en una memoria interna para sea un tile renderer completo, es decir que para que el tile rendering sea completo necesitariamos que los ROPS que son lo que es el Composite Stage tuviesen una memoria dedicada.

Es muy pero que muy probable que el X1 ya disponga de la unidad llamada Tile Shader en la patente en su interior.

Y esto es interesante:

Asumiría que el tamaño de los tiles coincide con el tamaño de la cache de los ROPS. Sin embargo el hardware de Nvidia no tiene caches dedicadas en los ROPS, por lo que asumo que el tile búfer reside en la cache L2 (donde habitualmente ellos mantienen las salidad de los ROPS)…

Hace algunos años hice algunos experimentos con la cache de los ROP de la AMD GCN (7970) con tal de optimizar el renderizado de particulas. GCN tiene ROPs de caches dedicadas (16KB color, y 4KB profundidad) en mi experimento divide el renderizado en tiles de 64×64 (16KB) y el resultado fue un ahorro enorme en el ancho de bana (por encima del 100% de incremento de rendimiento), en especial cuando el overdraw era muy grande (montones de particulas con el alpha activado (transparencias) cercanas a la cámara).

En efecto el hardware de AMD tiene unas unidades llamadas RBEs que son ROPS con cache.

rbebig

Pues bien, lo único que necesitariamos con todo lo explicado hasta ahora sería que los ROPS en vez de escribir sobre la Cache L2 escribiese sobre una cache propia desde procesar la Bc y la Bz de cada tile y hacer que el ancho de banda de la memoria principal de Switch quede solo para la Bt. Para los conceptos sobre el ancho de banda (B) mirad esta entrada que hice hace unos días.