Una patente de Nintendo en la que menciona el uso de unidades Tensor para el aumento de resolución se ha convertido en el clavo ardiente o el salvador a último momento para los que llevan años haciendo FUD sobre la existencia de una eminente Switch Pro o Switch 4K.

El primer punto a tener en cuenta de dicha patente es que no menciona explícitamente el DLSS de NVIDIA, pero sí que lo que hace es mencionar los Tensor Cores de NVIDIA para una técnica similar. En todo caso hay detalles que a los lerdos de Resetera siempre se les escapan en su afán continuo de engañar al prójimo. Es lo que tiene tener el Cortex prefrontal dañado y la parte relacionada con la moral defectuosa ya de serie.

¿De qué habla la patente de Nintendo? De un proceso de escalado de resolución a través de lo que llamamos una red neuronal, y hay pistas suficientes en la misma como para saber que no hablamos de nada relacionado con la actual Nintendo Switch en cualquiera de sus vertientes. En todo caso, lo mejor es que leáis atentamente.

  1. El proceso empieza con la consola renderizando una imagen, por lo que esta termina en el búfer de imagen de la misma. Dentro de la patente utilizan una resolución a 540p como ejemplo con el objetivo de conseguir una a 1080p, pero dejan claro que las resoluciones así como su ratio son un ejemplo ilustrativo. En todo caso hay que tener en cuenta que cuanto más alta sea la resolución de partida más trabajo a hacer al haber más bloques que tratar.
  2. El segundo paso es crear bloques de 4 x 4 píxeles, los cuales vienen del búfer de imagen. En un principio me pregunte a qué se debe este tamaño, pero mi conclusión es simple. Los ROPS generan la imagen primero sobre la caché L2 por la forma en la que funcionan las GPU actuales. Así pues tenemos 16 ROPS escribiendo 16 o 4 x 4 píxeles sobre la L2 de la GPU para que sean más fáciles de recuperar. El otro motivo es que cada partición de la RAM puede transmitir hasta 64 Bytes, a 4 Bytes por píxel esto son 16 píxeles.
  3. El tercer paso es convertir ese bloque en uno que es 8 x 8 píxeles, pero en este caso hay un reescalado, pero no por IA sino por una función tipo Lanczos o bicúbica en el que el valor del color de los nuevos píxeles es calculado.
  4. El cuarto paso consiste en generar otras tres matrices de 8 x 8 píxeles, las cuales se forman a través de los componentes de color (RGB) y por tanto son de 8 bits cada una. Estas tres matrices se colocan dentro de una matriz de 16 x 16, obviamente no ocupan todos los espacios, así que los que quedan se rellenan con 0.

Todo este proceso no es el escalado de resolución en sí mismo, sino la preparación de los datos, al final tenemos una matriz de 16 x 16, de la cual se tomaran los datos de cada una de sus columnas como columna de entrada de la red neuronal para el reescalado, mientras que la fila de datos y sus datos son proveídos por el programa. Así pues cada la matriz de 16 x 16 requiere 16 arrays sistólicos de 16 x 16 para calcularse.

Y aquí llegamos a lo interesante, la patente deja muy claro que a cada bloque de 16 x 16 se le asigna a nivel de hardware 4 arrays sistólicos de 16 x 16 y 8 bits de precisión. Y es aquí donde tenemos que empezar a observar como se mapea esto en la arquitectura de NVIDIA.

  • Cada Tensor Core se puede ver como un tensor de 4 x 4 x 4 o una matriz de 8 x 8. En total tenemos 2 Tensor Core por subcore y 4 subcores por SM.
  • La precisión de los Tensor Cores es FP16, lo que se traduce en 512 ALU en FP16.
  • Soportan SIMD sobre registro por lo que tienen el doble de potencia en precisión de 8 bits. Si hacéis el cálculo entonces tendréis un total de 1024 ALU, lo cual equivale a una muy grande de 32 x 32 o 4 de 16 x 16.

Pues bien, la gran diferencia entre NVIDIA Volta, en la que se basa el Tegra Xavier, y NVIDIA Ampere en la que se basara Orin, es que en el segundo caso la cantidad de ALU es la misma, pero los Tensor en cada subcore están unificados, lo que hace posible ejecutar nuestros arrays sistólicos de 16 x 16 sin problemas.

La conclusión cada bloque de 4 x 4 píxeles es transmitido a un SM para que haga el proceso de reescalado y lo convierta en un bloque de 8 x 8 píxeles. Dicho proceso va a tardar n ciclos de reloj a terminarse, es por ello que es necesario poder tener disponibles el resto de los SM a mano para que se encarguen de los bloques de 4 x 4 píxeles.

No olvidemos que gracias al Tiled Caching de NVIDIA esos bloques de 4 x 4 píxeles no salen de la caché L2 al escribirse y por tanto no tocan memoria, por lo que una vez terminados cada uno de ellos desde la L2 vuelve a los SM para convertirse en un bloque de 8 x 8 píxeles.