# Deep Learning Super Sampling

El Supermuestreo de Aprendizaje Profundo (DLSS por sus siglas en inglés Deep Learning Super Sampling) es una tecnología de escalado de imágenes desarrollada por Nvidia y exclusiva de las tarjetas gráficas de Nvidia para uso en tiempo real en videojuegos seleccionados, que utiliza aprendizaje profundo para escalar imágenes de menor resolución a una resolución más alta para visualizarlas en monitores de grandes resoluciones. Nvidia afirma que esta tecnología rescala las imágenes con una calidad similar a la de una imagen en alta resolución, pero con menos cálculo realizado por la tarjeta gráfica, lo que permite configuraciones gráficas y fotogramas por segundo más altos para una resolución determinada.
A partir de diciembre de 2020, esta tecnología está disponible exclusivamente en las GPU de las series GeForce RTX 20 y GeForce RTX 30.
Su competidor de AMD es el FSR.

## Historia

Nvidia anunció DLSS como una característica clave de las GPU de la serie GeForce RTX 20 cuando se lanzaron en septiembre de 2018. En ese momento, los resultados se limitaron a unos pocos videojuegos (por ejemplo, Battlefield V y Metro Exodus ) porque el algoritmo tenía que entrenarse específicamente en cada juego en el que se aplicó y los resultados generalmente no eran tan buenos como el rescalado tradicional.
En 2019, el videojuego Control, fue ofrecido con trazado de rayos y una versión mejorada de DLSS, que no usaba Tensor Cores.
En abril de 2020, Nvidia anunció y lanzó con la versión 445.75 de los controladores una versión mejorada de DLSS llamada DLSS 2.0, que estaba disponible para algunos juegos existentes, incluidos Control y Wolfenstein: Youngblood, y estaría disponible más adelante para próximos juegos. Esta vez, Nvidia dijo que volvió a usar Tensor Cores y que la IA no necesitaba ser entrenada específicamente en cada juego.
Un efecto secundario de DLSS 2.0 es que parece no funcionar muy bien con técnicas anti-aliasing como MSAA o TSAA, el rendimiento se ve afectado negativamente si estas técnicas están habilitadas sobre DLSS.
A partir de abril de 2020, los desarrolladores de juegos deben incluir DLSS 2.0 a todos los juegos.

### Historial de versiones

| Lanzamiento | Fecha de lanzamiento | Destacar |
| 1.0 | Febrero de 2019 | Primera versión, con IA y entrenada específicamente para algunos juegos específicos, incluidos Battlefield V y Metro Exodus |
| 2.0 (primera iteración) | Agosto de 2019 | Primera versión 2.0, también denominada versión 1.9, que utiliza una IA aproximada de la versión 2.0 en los núcleos CUDA y se adapta específicamente para Control |
| 2.0 (segunda iteración) | Abril de 2020 | Segunda versión 2.0, usando Tensor Cores nuevamente y entrenado genéricamente |

## Algoritmo
### DLSS 1.0

Nvidia explicó que DLSS 1.0 funcionaba con imágenes objetivo consideradas "cuadros perfectos" usando el supermuestreo tradicional, luego entrenó la red neuronal en estas imágenes resultantes. En un segundo paso, el modelo se entrenó para reconocer entradas con alias en el resultado inicial.

### DLSS 2.0

DLSS 2.0 funciona de la siguiente manera:
* La red neuronal es entrenada por Nvidia usando imágenes "ideales" de videojuegos con resolución ultra alta en supercomputadoras e imágenes de baja resolución de los mismos juegos. El resultado se almacena en el controlador de la tarjeta de video. Se dice que Nvidia utiliza servidores DGX-1 para realizar el entrenamiento de la red.
* La red neuronal almacenada en el controlador compara la imagen real de baja resolución con la referencia y produce un resultado de alta resolución completa. Las entradas utilizadas por la red neuronal entrenada son las imágenes con solapamiento de baja resolución generadas por el motor del juego, y los vectores de movimiento de baja resolución de las mismas imágenes, también generadas por el motor del juego. Los vectores de movimiento le dicen a la red en qué dirección se mueven los objetos en la escena de un fotograma a otro, para poder estimar cómo se verá el siguiente cuadro.

## Arquitectura

Los Tensor Cores están disponibles desde la microarquitectura de la GPU Nvidia Volta, que se utilizó por primera vez en la línea de productos Tesla V100. Su especificidad es que cada Tensor Core opera en matrices de 4 x 4 de punto flotante de 16 bits, y parece estar diseñado para usarse en el nivel CUDA C++, incluso en el nivel del compilador.
Los Tensor Cores utilizan los CUDA Warp -Level Primitives en 32 subprocesos paralelos para aprovechar su arquitectura. Un Warp es un conjunto de 32 hilos que están configurados para ejecutar la misma instrucción.