El problema del filtro anisotrópico en la actual generación

Cogiendo la generación actual veremos que cada Compute Unit de la GPU tiene 4 unidades SIMD de 16 Stream Processors cada una, 4 unidades de texturas y 4 bloques de cache de primer nivel dentro de la misma Compute Unit.

GCN_CU

Pero lo que interesa aquí es la cache de primer nivel para texturas y las unidades de texturas asociadas, dichas unidades de texturas se encargan de la interpolación por pixel y según la información de la arquitectura el ancho de banda de la cache L1 es de 64B/ciclo a dicha cache están conectadas las unidades carga y almacenamiento de las unidades de filtrado de texturas y dichas unidades como se puede ver en el diagrama de arriba.

Captura de pantalla 2015-12-02 a las 12.07.32

En teoría 64B/ciclo para una 4 unidades de texturas, son 16B/ciclo por unidad lo que quiere decir que en modo color de 32 bits (4 bytes ciclo) puede realizar bilineal por un ciclo, no olvidemos que el bilineal consiste en interpolar unos cuatro pixeles. ¿Es así..? Veamos lo que dice AMD al respecto.

gs4106-the-amd-gcn-architecture-a-crash-course-by-layla-mah-49-638

En efecto… 4 Texels interpolados por ciclo de reloj, lo que equivale a filtro bilineal y este es el motivo por el cual hay problemas con el anisotrópico, la idea es que a medida que aumentamos la cantidad de pixeles interpolados mayor es la calidad del filtraje de texturas y con ello la calidad de imagen pero a cambio se necesita una mayor cantidad de ancho de banda con la memoria y si esta no es suficiente entonces lo que acaba siendo afectado es la tasa de texturizado.

Hay varios tipos de filtrado de texturas, el bilineal es utilizado cuando hay una sola textura con la que operar mientras que el trilineal lo que hace es interpolar utilizando dos texturas (la textura y su mip map) por lo que necesita 8 accesos por pixel, un ancho de banda de lectura que es 8 veces superior.

picture_4_large

Pero la cosa se complica con el anisotrópico, el cual necesita unos 16 accesos, un AFx2 necesitaría 32, un AFx4 unos 64… Obviamente el cuello de botella aquí es la cache de primer nivel pero es que además tenemos que tener en cuenta los Pixel/Fragment Shaders, los cuales no es que hagan el trabajo de la interpolación pero manipulan los datos que les envían las unidades de texturas en grupos de varios pixeles al mismo tiempo y dependen del suministro de información, el hecho de que recortar el suministro para aplicar un AF más potente significa también dejar de alimentar la unidad de shaders ya que no puede operar si no les llega la información desde el resto del pipeline gráfico.

pipeline-v1-05

Un Pixel/Fragment Shader se encarga de manipular los datos previamente interpolados que le llegan de las unidades de texturas, por eso las unidades shader se diseñan para estar al lado de una unidad de texturas siempre porque en modo Pixel/Fragment Shader es de donde recibe los datos… Es decir, los pixeles interpolados y el cuello de botella en este caso parece ser el ancho de banda entre las TMUs y la cache L1 que tienen asignada. ¿pero es mala la configuración de la arquitectura GCN? Lo mejor es compararla con su contemporanea, la Nvidia Kepler, antes de nada veamos el mapa de la Compute Unit de las Kepler, la unidad SMX.

kepler-smx

Tenemos 16 unidades de texturas… ¿pero cual es el ancho de banda para estas?

En la arquitectura kepler, al igual que en la anterior generación con la arquitectura FERMI, cada SMX tiene 64KB de memoria en el chip que se pueden configurar como 48KB de memoria compartida con 16KB de cache L1 o a la inversa. Kepler permite ahora una flexibilidad adicional en la configuración de la localización de la memoria compartida y la cache L1 permitiendo una división de 32KB /32KB entre ambas memorias… el ancho de memoria compartido se ha doblado respecto a a los SM de Fermi, a 256B/ciclo.

La memoria compartido es lo que en la CU de la arquitectura GCN aparece como Local Data Share. En el caso de Kepler tenemos 64KB con un ancho de banda de 256B/seg a compartir, si utilizamos unos 16KB para la cache L1 (texturas) entonces el ancho de banda de esta parte será de 64B/ciclo y por tanto tendrá la misma capacidad en la interpolación/filtrado que la arquitectura GCN, si se utilizan 32KB entonces la cosa se irá a los a los 128B/ciclo y por tanto la calidad del filtrado mejorara, en el último caso es cuando dejamos de alimentar los shaders desde la memoria compartida (datos fuera de los pixels/fragmentos, programas shader) y hacemos que las TMU tengan para si mismas todo el ancho de banda.

 

¿En que se traduce esto? Pues en el hecho que la arquitectura GCN pese a sus limitaciones esta al nivel de lo que le toca a su tiempo, hay que tener en cuenta que el filtro anisotrópico es un problema muy grande en lo que a los gráficos se refiere y conseguir la mayor calidad posible en la teoría es imposible en la práctica por las limitaciones físicas que se presentan. En serio, no creo que los ingenieros y arquitectos de Nvidia y AMD hayan puesto esos ratios de ancho de banda en la cache L1 en sus GPUs porque así hayan querido sino porque no han podido tener más remedio.

Si, se que es un tema viejo y pendiente de hace tiempo pero creo que era importante aclararlo.

Anuncios