Así cambiarán las gráficas de NVIDIA y AMD, ¿más simples o complejas?

¿Es posible que en el futuro los RT Cores desaparezcan de las futuras GPUs de NVIDIA, Intel y/o AMD?, ¿pueden las unidades Shader con su enorme potencia de cálculo llegar a crecer lo suficiente hasta el punto de hacer completamente prescindible la inclusión de este tipo de unidades?

Los RT Cores, Ray Accelerator Units o unidades de intersección son unidades especializadas que se encargan de una sola tarea en las GPUs y que llegaron por primera vez de la mano de las primeras NVIDIA RTX.

En este artículo no os explicaremos para que sirven, para ello os recomendamos buscar el artículo en HardZone titulado ¿Qué son y cómo funcionan los RT Cores para Ray Tracing? en el que os explicamos de manera simple pero detallada el funcionamiento de este tipo de unidades.

¿Qué son los RT Cores o unidades de intersección?

RT Cores NVIDIA

Los RT Cores en NVIDIA o  Ray Accelerator Units en AMD son unidades encargadas de calcular la intersección entre los rayos y los diferentes elementos de la escena, para entender cual es la necesidad de este tipo de unidad en el hardware de las nuevas tarjetas gráficas hemos de entender como funciona la versión más simple del algoritmo del trazado de rayos:

Por cada pixel u objeto en el que se encuentre el pixel, si el rayo hace intersección con dicho objeto: cambia el valor de color de ese pixel en pantalla.

Esto es realizado de manera continua y repetitiva en todos y cada uno de los fotogramas que renderiza la GPU que se generan utilizando el algoritmo de trazado de rayos o una de sus variantes, ya sea de manera parcial para solventar los problemas de iluminación indirecta que la rasterización no puede solucionar por si misma.

El algoritmo Möller–Trumbore para la intersección entre rayos y triángulos

Intersección Rayo Triangulo RT Cores

Las unidades de intersección de rayos son unidades de función fija que realizan el algoritmo Moller-Trumbore. Se ha de tener en cuenta que las unidades de función fija lo que hacen es aplicar siempre el mismo programa a partir de unos datos de entrada, dicho programa esta micro-cableado, por lo que los transistores que forman dicha unidad están colocados de tal manera que solo pueden ejecutar ese programa y no otro.

La ventaja de las unidades de función fija es que necesitan una menor cantidad de transistores que las unidades programables que son mucho más complejas, pero una unidad de función fija solo tiene sentido en un hardware donde dominan las unidades programables si puede realizar su tarea a una velocidad que a nivel de coste y velocidad no puede ser igualado por la parte programable.

Obviamente como todo algoritmo es posible ejecutarlo en las unidades shader, pero para que esto fuese posible sería necesario que dichas unidades fuesen lo suficientemente rápidas como para prescindir de las unidades de función fija.

El coste del algoritmo Möller–Trumbore

Algoritmo Moller-Trumbore RT Cores

Pese a que existen más algoritmos, este es el más famoso y utilizado, es por ello que hemos decidido colocarlo como ejemplo y creedme que su coste no es directamente barato ya que en total son 27 operaciones en coma flotante por pixel. Pero, en algunas arquitecturas debido a que la que la división es más compleja de implementar en los shaders no es realizada por las unidades SIMD convencionales sino por las SFU, la cuales pueden realizar operaciones aritméticas mucho más complejas pero con una menor velocidad que las sumas y las multiplicaciones.

Dicho de otra manera, necesitaríamos 27 FLOPS no por pixel sino por pixel e intersección, ahora pensad en la cantidad de intersecciones y píxeles en una escena y os haréis una idea aproximada de porque las unidades de intersección o RT Cores son tan necesarias.

El tipo de programa shader que reemplaza los RT Cores

Etapas DXR

En las especificaciones de las APIs para Ray Tracing a tiempo real, tanto en DXR dentro de DX12 Ultimate como en las extensiones Ray Tracing para Vulkan, existe un tipo de shader que ha acabado en desuso que es el Intersection Shader, el cual reemplaza por completo a las unidades de intersección en el hardware en el que estas no están presentes.

Hay que tener en cuenta que un shader no es más que un programa y el hecho que los programadores tengan que realizar juego por juego su propia unidad de intersección puede ser un tedio, por eso ambas APIs incluyen shaders de intersección de ejemplo. ¿La contrapartida de esto? Muchos desarrolladores pueden ver el algoritmo de intersección incluido en las APIs así como las unidades de función fija como no adecuado.

Diseño Circuitos Papel

En diseño de hardware no es habitual eliminar las unidades de función fija que funcionan como aceleradores, sino que lo habitual es ampliar las capacidades de dichas unidades e incluso hacer estas unidades programables, por lo que el siguiente paso en la evolución de las unidades de intersección, si no se ha hecho ya, es que se trate de un propósito de dominio específico con código micro-programado que se puede actualizar.

Por lo que si que es posible que veamos la creación de nuevos algoritmos de intersección con mejor rendimiento, los cuales acaben escritos en la memoria interna de cada una de las unidades con una actualización de firmware.

Las unidades de función fija no se han eliminado nunca de una GPU

NVIDIA GPU

Una GPU tiene una serie de unidades de función fija para renderizar gráficos en 3D, estas unidades al igual que las unidades de intersección se encargan de realizar tareas repetitivas y reiterativas en cada fotograma. Nos referimos a unidades como las unidades de texturas, las encargadas de rasterizar la geometría, etc.

Estas unidades nunca han sido eliminadas por el hecho que sus tareas las puedan realizar una unidad shader, es más, si cogiesemos una una GPU sin dichas unidades fijas y les hiciéramos renderizar una escena en 3D serían una orden de magnitud más ineficientes que una GPU con menos unidades shader pero con dichas unidades incluidas.

La tendencia es siempre que aparece una parte que es reiterativa y repetitiva en cada fotograma, la cual ocuparía buena parte del tiempo y recursos de las unidades que ejecutan los shaders, pues se acaba creando un tipo de unidad especializada que no solo descargue de dicha tarea a esas unidades sino que la haga de manera más rápida y por una porción del coste.