Uncategorized

Manías mías con las RTX 40

Sobre lo que os voy a contar no puedo escribir en otros lugares y no voy a hablar de los motivos que me impiden hacerlo. Al menos tengo este pequeño lugar para poder decir lo que pienso en algo, que aunque es banal para mucha gente, en mi neurodivergente cerebro es un mundo que me apasiona. Es más, el nivel al que os voy a comentar ahora no me dejan hacerlo por partida doble. ¿La otra razón? Sí que la puedo decir, demasiado técnico.

La presentación de las NVIDIA RTX 40 ha sido cuanto menos de las cosas más de mearse en la cara y escupirle al consumidor que he visto, con mentiras descaradas y el objetivo de mentir al espectador de la misma con un montaje lleno de embustes y de medias verdades. Lo primero que me llamo la atención es que se marcaron su propio Killzone 2005, lo hicieron a través de Racer RTX, algo que según ellos funciona en una sola GPU y que no deja de ser la clásica demo visual totalmente encriptada, sin nada de interactividad y en el que la información visual de cada frame, pese a que se genere a tiempo real no se tiene que recalcular por el cambio de la cámara.

El motivo por el cual muestran esto es sencillo, según NVIDIA cuando presento hace cuatro años las RTX 20 veríamos el primer juego que requiriese tarjetas gráficas con Ray Tracing para funcionar en 2023. Dicho juego no está ni en desarrollo. No han conseguido que apareciese algo como Doom 3 en su día que hizo que todo el mundo se comprase una GeForce para disfrutarlo. No hay nada, y no por el hecho que el Ray Tracing no sea una buena idea para solventar una gran cantidad de problemas gráficos.

Entonces, ¿qué es lo que ocurre? El gran problema es que la evolución de los RT Cores y todo el hardware de apoyo para el trazado de rayos realmente no ha evolucionado, simplemente han hecho que vaya más rápido.

Las generaciones del Ray Tracing

Para su implementación general, el Ray Tracing requiere seguir una evolución y desgraciadamente llevamos años estancados en la misma sin evolucionar para nada. Es por ello que las RTX 40 son tan decepcionantes. La idea de las generaciones o niveles del trazado de rayos la trajo Imagination, que fueron los primeros en aplicarlo a tiempo real modificando una GPU convencional.

  1. Renderizar por software en la CPU.
  2. Usar los shaders para ejecutar el Ray Tracing.
  3. Unidades especializadas en calcular la intersección rayo-caja, rajo-triángulo.
  4. Recorrido del BVH por hardware.
  5. Ray Tracing coherente.
  6. Ray Tracing coherente con generación de la estructura de datos de la escena por hardware.

Lo decepcionante de NVIDIA es que ellos, teniendo decenas de recursos más grandes, han decidido no evolucionar la arquitectura de los núcleos de la GPU y se ha quedado en el punto 4 desde hace cuatro años. Eso sí, ahora se pueden realizar el cuádruple de intersecciones rayo-triángulo que hace cuatro años, pero la evolución en cuanto a arquitectura es nula. Por lo que la siguiente evolución era el Ray Tracing Coherente, lo cual no es una técnica para que se viese mejor, sino un cambio en la arquitectura para aumentar su rendimiento.

¿Ray Tracing coherente?

En el Ray Tracing puro, sin estar mezclado con la rasterización, les llamamos rayos coherentes a los también rayos primarios, los que salen de la cámara y hacia la escena. Debido a que son los que generan la iluminación directa y está en el Ray Tracing no se considera como ventajosa respecto a la rasterización no se usan en el renderizado híbrido. Es decir, son aquellos que no se han generado por el impacto de un rayo sobre un objeto. En cambio, los rayos incoherentes son los que se generan cuando uno de los rayos impacta sobre un objeto con el objetivo de generar iluminación indirecta.

Ahora bien, las GPU están pensadas para potenciar la localidad de los datos, tú puedes saber a qué parte de la pantalla va a parar un rayo coherente o primario, pero no un incoherente o secundario. Más que nada por el hecho que los primeros los puedes asociar a una parte de la pantalla. El problema es que su uso es una ruptura total con la compatibilidad con todos los juegos, los cuales se basan en la rasterización.

Sin embargo, es un paso importante hacia la adopción del Ray Tracing como algoritmo de renderizado de cara al futuro. Y no nos olvidemos que en 2023 tenía que salir al mercado ese juego que hiciera que tuviésemos que comprar una RTX. Lo más seguro y como es habitual, la más potente del momento.

¿Cómo funciona?

El problema es que, pese a que el trazado de rayos es mucho mejor a la hora de renderizar la parte incoherente de una escena que la rasterización, existe el problema que los rayos incoherentes tienen un rendimiento mucho menor que calculando los rayos coherentes de la escena.

El motivo de esta disparidad en el rendimiento es debido a que no toda la información de la escena no se encuentra en la caché de la GPU, que es a lo que acceden las unidades de intersección de rayos, con los rayos no coherentes estos no impactan sobre la misma zona de la escena y, por tanto, no afectan al mismo shader, lo que provoca paradas en una cantidad enorme de hilos en la GPU, provocando caídas de rendimiento en picado. Este es un problema que en la industria del cine solucionan a través de algoritmos de reordenación de los rayos, pero lo pueden hacer fácilmente porque conocen de antemano la posición de la cámara y, por tanto, pueden convertir todos los rayos incoherentes de la escena en rayos coherentes a través de un algoritmo de ordenación.

Pero a la hora de renderizar una película tienen todo el tiempo del mundo, no tienen que mostrar una imagen cada pocos milisegundos y los algoritmos de ordenación son más bien para ahorrar tiempo y con ello el coste de sus potentes granjas de renderizado, pero, la situación en los videojuegos es distinta.

Cyberpunk Ray Tracing

Pero en un videojuego donde cada fotograma es único no se puede hacer, es más, se necesitaría un hardware altamente potente para que ordenar los rayos de la escena no afectase la alta tasa de fotogramas de la misma, por lo que es ahora mismo el próximo gran reto a solventar por los fabricantes de GPU y es un elemento crucial si se quiere que el Ray Tracing no se quede estancado en cuanto a rendimiento.

Los procesadores gráficos que utilizamos en nuestros PC se diseñaron para la rasterización, la cual es un algoritmo de renderizado que explota que se beneficia muy bien de la localización espacial y temporal de los accesos de memoria.

Las GPU actuales no están optimizadas para ello

La mayoría de trabajos que tiene que realizar la GPU durante la rasterización tienen la particularidad que a la hora de aplicar un programa shader, especialmente durante el Píxel Shader, que los datos de los píxeles y triángulos que esté procesando se comparten con sus vecinos más cercanos en la escena. Así que hay una gran cantidad de posibilidades que si la GPU accede a los datos para un grupo de triángulos y píxeles y los recoge todos los que son cercanos en memoria hacia las cachés, entonces ya tendrá los datos de los píxeles y triángulos colindantes. Por lo que los cambios han de ir de cara a explotar esa característica común de todas las GPU.

La solución

La idea que existe sobre la mesa consiste en hacer lo que podríamos llamar un Ray Tracing por diferido, es decir, separar lo que es el recorrido de los rayos por la escena de la generación de la misma. Para ello necesitamos tener la estructura de datos de la escena generada, lo cual es necesario para que la comprobación no sea pixel a pixel y se pierda el tiempo comprobando en lugares de la escena donde no hay nada. Este paso ya lo hacen las GPU actuales.

Bajo el nuevo paradigma, los rayos lo que hacen primero es recorrer la escena sin ejecutar ni un solo shader y sin modificarla. Lo único que se tiene en cuenta es el Ray Generation Shader que genera de nuevos y una vez terminado el pre-recorrido se almacenan en un búfer relacionado con el ID Búfer los diferentes rayos que afectan esa parte de la escena. No olvidemos de que pese a que no hay relación directa entre los diferentes rayos de un mismo lugar, si que hay relación espacial, lo que ayuda a explotar la arquitectura común de todas las GPU a la hora de renderizar una escena con rayos no-coherentes. Simplemente, nos interesa conocer por cuáles partes de la escena incidirá cada uno de los rayos.

El problema es que los rayos rebotarían indefinidamente, de ahí que se necesite el Ray Generation Shader o un hardware especializado que se encargue de realizar la generación de los rayos junto al recorrido. Si no se hiciese tendríamos rayos infinitos excepto los que saliesen de escena, por lo que necesitamos tres condiciones adicionales:

  • Una constante que es el número de rebotes que puede hacer un rayo en la escena, una vez realizado esta cantidad de rebotes e independientemente de cuáles sean las otras condiciones, dicho rayo se destruye.
  • Una segunda constante en cada material que es la constante de refracción, el cual va de 0 a 1, con cada intersección el valor de energía del rayo se multiplica por la constante de refracción, cuando un rayo llega a un nivel de energía lo suficientemente bajo se descarta. Este requiere un búfer adicional generado durante el rasterizado que nos informe de las propiedades en ese aspecto de cada objeto de la escena.
  • Una tercera constante que nos indica cuanto puede recorrer un rayo en la escena antes de ser descartado.

Es decir, el concepto es evolucionar los RT Cores para que sean ellos los que a partir de una serie de parámetros simples inicien la generación de los rayos de forma automática y puedan almacenar la información de manera coherente. Luego, cuando llegue el momento de calcular el shader de cada uno, ya se tendrá dicha información. Por lo que se trataba de un cambio sutil.

¿Por qué es importante?

Lo normal cuando tenemos una tarea altamente repetitiva es que esta se acabe automatizando, el motivo por el cual hay una unidad de rasterizado, de filtrado de texturas, etcétera, es para que nadie tenga que perder el tiempo en aplicarlas en el código. El hecho de volver coherentes todos los rayos supone un aumento de rendimiento considerable, si no también la oportunidad de que los desarrolladores se ahorren parte del código.

El Shader Execution Reordering

La otra parte con la que me he llevado una decepción es con el engaño del Shader Execution Reordering, lo cual es definido como Jensen Huang como ejecución fuera de orden en las GPU. Esta consiste en que si la unidad que puede ejecutar una instrucción está libre y las otras no lo que se hace es reordenar las instrucciones según el orden de disponibilidad de las unidades, para luego volverlas a ordenar al final.

Shsder execution reordering

Dicha ordenación añade latencia a la hora de ejecutar una instrucción, pero la trampa es que añadir pasos adicionales nos permite al mismo tiempo aumentar la velocidad de reloj. Eso si, la complejidad de cada núcleo aumenta. Ilusionado por el añadido mi parte lógica, no se le ocurrió preguntarse como habían metido 144 núcleos SM con dicha característica en el chip AD102 en la que se basa la RTX 4090, pero sobre ello ya hablaré luego.

Otro de los temas es que las GPU suelen actuar como si sus ALU fuesen unidades SIMD, donde un grupo ejecuta una misma instrucción, pero de un tiempo a esta parte cada unidad es escalar y puede actuar independiente al resto si es necesario, aunque las instrucciones pueden ser SIMD. ¿El problema? Cuando no se usan todas las ALU o núcleos CUDA se pierde potencia. Por lo que lo mejor sería usar las unidades disponibles restantes para otros algoritmos. En todo caso, esto sería lo ideal si no hubiesen presentado una característica de software como si fuese una de hardware.

¿Arquitectura nueva? ¡Y un mojón!

Sin embargo, NVIDIA tiene que ver a chafar el día y después de prometer ejecución fuera de orden en sus GPU, como que no, que esta no existe. Es más, el planteamiento de NVIDIA es que todo lo que han presentado como novedades de la arquitectura se ejecuten a través de software. Es decir, de las unidades shader. Y es ahí donde me he llevado las manos sobre la cabeza.

Esto viene de la sesión de preguntas y respuestas sobre la arquitectura, para mí ha sido suficiente para volcar la mesa, sé que es una tontería para muchos, pero el engaño es indignante.

Pregunta de un periodista: dijiste que hay una extensión en la API de NVIDIA que los desarrolladores pueden usar para optimizar Shader Execution Reordering para sus juegos. ¿Eso significa que SER deberá optimizarse para brindar alguna ventaja de rendimiento, o todavía hay un algoritmo para mejorar ligeramente la reordenación automática de la ejecución de sombreadores también?

SER debe ser habilitado específicamente por el desarrollador. Estos cambios suelen ser bastante modestos, a veces solo unas pocas líneas de código. Esperamos que esta función se adopte fácilmente

¡QUE TE JODAN MUY FUERTEMENTE NVIDIA! NINGUNA OTRA EMPRESA CON EJECUCIÓN FUERA DE ORDEN HACE QUE LOS PROGRAMADORES TENGAN QUE OPTIMIZAR EL CÓDIGO CON SUS API. SIMPLEMENTE, FUNCIONA DE FORMA AUTOMÁTICA. ¡ESA ES LA JUGADA DE NVIDIA, FORZAR A LOS DESARROLLOS A DEPENDER DE SUS LIBRERÍAS PROPIETARIAS!

4.7 3 votes
Article Rating
Subscribe
Notify of
guest

3 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Over
Over
2 months ago

Lo que planteas del raytracing es volcar la mesa como tú dices, y a donde apunta es a una tarjeta aceleradora de raytracing aparte.

Me sorprende que a estas alturas no se haya dividido el sector en tarjetas de IA, 3D y raytracing. Para el doméstico de gama media lo entiendo, pero en el gama alta o muy alta debería haber pasado ya.

Y la de IA también estaría orientada a alto rendimiento de tipo Direct Compute o CUDA u Open CL, por lo que sería la deseada por los mineros, dedicando más área del chip y energía a lo que les interesa, y recortando salida de vídeo para abaratar (al menos en costes para el fabricante).

Jorge Cercadillo
Jorge Cercadillo
2 months ago

Supongo que querias decir escriptada en vez de encriptada en lo de la demo Racer RTX.

Buen articulo !!!!!!

Moisés Berducido
Moisés Berducido
2 months ago

Chaqueta-man vendiendo humo, pero claro, ya que su competencia sigue dándose de cabezazos ante la pared, pues se va a salir con la suya, aunque dudo mucho que vayan a vender el montón.

3
0
Would love your thoughts, please comment.x
()
x