diciembre 4, 2020

BVH: Generación, Recorrido y Hardware Asociado

Esta es la tercera parte de una serie compuesta por las siguientes entradas:

En esta voy a hablar de una tercera posibilidad acerca del supuesto chip de apoyo que habría en las GeForce Ampere y digo supuesto porque puede ser que esto se quede en nada de nada.

Si miramos la documentación de la propia Nvidia lo que tenemos es lo siguiente respecto a la creación del BVH que es la estructura de datos indispensable para que el RT Core pueda funcionar.

El driver maneja funciones como la construcción y el reacondicionamiento del BVH, y la aplicación gestiona la generación de rayos y los shaders de estos a través de nuevos tipos de shaders.

Esto significa que es el driver, el cual se ejecuta en la CPU el encargado de crear el BVH y no hay ningún elemento de hardware relacionado con ello dentro de la GPU relacionado con ello si hemos de creer a Nvidia sobre su propio hardware, cosa que obviamente vamos a hacer.

Pues bien, en la arquitectura «PowerVR» Wizard de Imagination si que hay una unidad de función fija que construye la estructura de datos que es necesaria para acelerar la comprobación de la intersección de los rayos que es llamada «Scene Hierarchy Generator».

Sobre el Scene Hierarchy Generator, la propia Imagination dice lo siguiente:

El PowerVR Scene Hierarchy Generator divide la escena en un arbol jerarquico de cajas delimitantes (Bounding Boxes). Esencialmente una gran caja contiene la escena que es dividida jerarquicamente en cajas aún más pequeñas hasta llegar al último nivel que solo contiene los triangulos. Este planteamiento de jerarquia recorta el número de tests recorta la cantidad de tests comprobando las intersecciones del rayo con cada caja y va profundizando más y más hasta que se llega al triangulo correcto.

Mientras que tanto los núcleos de Nvidia e Imagination contienen hardware de intersección via hardware y ambos utilizan la jerarquiía de cajas delimitantes (Bounding Volume Hierarchy) como estructura de datos solo Imagination tiene el Generador de la Jerarquía de la Escena/Scene Hierarchy Generator (SGH) por hardware, lo que significa que puede soportar geometria dinamica (por ejemplo personajes animados en un juego) de manera más eficiente.

Para entender la generación del árbol BVH vamos a jugar al clásico juego de los barcos.

Imaginad que cada barquito es un objeto en pantalla y nuestro cañón es una cámara que dispara rayos en cada tile del la malla.

Si miramos el algoritmo del trazado de rayos clásico lo que hará la cámara será disparar a cada cuadrante de la malla para ver si encuentra un barco de manera recursiva, esto significa que en nuestra malla de de 8×8 cuadrantes donde solo hay 9 cuadrantes ocupados en total pues el test fallará unas 55 veces. ¿Tiene sentido? No, por eso es necesario algo que ordene la escena de antemano y evite que la cámara dispare a los cuadrantes que no son.

Nivel#0 (20 nodos)

Tenemos un solo cuadrante que delimita toda la escena, hay barcos en todo el espacio.

Nivel#1 (21 nodos)

Dividimos en 2 mitades iguales el espacio, en el nivel 1 hay barcos en las dos mitades.

Nivel #2 (22 nodos)

Uno de los cuadrantes no contiene nada, lo marcamos para posterior poda.

Tiles Descartados: 16

Nivel#3 (23 nodos)

Eliminamos por completo el cuadrante donde no hay nada porque no vamos a encontrar nada de nada por lo que no es necesario profundizar. Subdividimos entre 2 de nuevo los cuadrantes y marcamos de nuevo aquellos donde solo hay agua para la posterior poda.

Tiles Descartados: 16

Este proceso lo iremos haciendo en cada nivel hasta que todos los cuadrantes que nos queden sean ocupado al 100% por un rbol y hayamos descartado donde hay agua.

Nivel#4 (24 nodos)

Tiles Descartados: 16

Nivel#5 (25 nodos)

Tiles Descartados: 8

Con esto hemos llegado al final, nuestro árbol final queda de la siguiente manera:

Total de Tiles Descartados: 56

La unidad de intersección recorrerá el árbol para saber en que cuadrantes hay barcos y en cuales hay agua, gracias al uso del árbol lo que hacemos es reducir enormemente la cantidad de veces que la cámara envía un rayo hacía ese Tile pero el arbol ha de ser construido por algo y si, se que es un ejemplo ultrasimplificado pero lo necesito para que todo el mundo entienda la funcionalidad de lo que es un BVH y porque se le llama estructura de aceleración para el trazado de rayos.

Pe… pero Urian… Esto es demasiado simple…

Si, si queréis transformamos esto en una clase de matemáticas de Universidad y hacemos que todo el mundo termine en modo…

Dejando esto a un lado, como inciso, el hecho que sea genere un árbol Es por ello que el RT Core/Unidad de Intersección es llamado TTU en las patentes de Nvidia por ejemplo ya que viene de Tree Traversal Unit.

¿Y como atraviesa el TTU/RT Core el arbol? Bueno, en el fondo el RT Core es una especie de array sistólico en función fija que le permite recorrer todos los caminos de golpe para encontrar la geometría.

Recorrido del Arbol por la TTU/RT Core/Unidad de Intersección.

He numerado el arbol del ejemplo de más arriba para que lo podáis ver, de nuevo es una ultrasimplificación del concepto para ilustrar. Lo que hace es leer cada nodo y enviar como datos de salida el contenido de los dos nodos hijo hacía las ALUs a las que esta conectado. El BVH no nos dice la geometría que hay en cada nodo, si no que nos dice solamente si hay geometría o no para que a la hora de calcular la intersección de los rayos con la escena no se hagán demasiados tests.

Pues bien, el Scene Hierarchy Generator lo que hace es crear el arbol BVH a partir de la información de la geometría de la escena. Tanto Nvidia como AMD adoptaron el Tile Caching y con ello el ordenamiento de la escena antes del rasterizado, esto significa ordena la geometría según su posición antes del proceso de rasterizado.

Pero en los Tile Renderers ha sido siempre un elemento indispensable para el funcionamiento, el hecho de ordenar la geometría de la escena por tiles antes del rasterizado y esa funcionalidad es aprovechada por el Scene Hierarchy Generator para leer la geometría de la escena y crear el BVH, elemento que no se encuentra en las Nvidia Turing ya que de ello se encarga la CPU a través del driver.

Pero supongamos que queremos implementar uno en el hardware de Nvidia, obviamente debido a que tiene que tener acceso a toda la RAM entonces tiene que ser otro cliente de la RAM de video por lo que tenemos dos posibilidades:

  • Un Co-Procesador Adicional en la misma GPU.
  • Un chip aparte de la GPU.

En el renderizado híbrido no necesitamos el BVH hasta después de haber realizado la primera etapa de renderizado con el rasterizado por lo que nuestro Generador de la Jerarquía de la Escena puede tomar los datos de la geometria de la misma si es un chip aparte y copiarlos en su RAM para devolver en una etapa posterior el arbol BVH.

En realidad es una tontería ir copiando los datos fuera de la GDDR6 para otro dispositivo, el problema viene por el hecho de que nuestro SHG al ser una unidad de función fija estaría limitado en cuanto a la cantidad de datos que puede ordenar y el tamaño del árbol que puede crear en consecuencia por lo que esta unidad no tiene porque ser pequeña precisamente, por lo que dependiendo de la cantidad de procesamiento que tenga que realizar quizás si que resulta conveniente colocarla fuera de la GPU como un co-procesador de esta, no sería el Traversal Engine pero si que sería un elemento adicional que en conjunción con el Traversal Engine aceleraría el trazado de rayos al acelerar la construcción del BVH que es parte indispensable y no es algo que podamos considerar de ciencia ficción e imposible desde el momento en que se ha probado ya anteriormente.

Debido a la ingente cantidad de polígonos con los que tendría que trabajar hace que el SHG a nivel de las GPUs de PC requiera de un SHG mucho mayor en tamaño que el de Imagination. El SHG en el PowerVR Wizard esta diseñado con el rendimiento del hardware a la hora de interseccionar los rayos que es de unas 300 millones de intersecciones a 600 Mhz, lo que es una intersección cada 2 ciclos de reloj. En Cambio Turing puede realizar varias intersecciones por ciclo de reloj por lo que necesita un SHG mucho más rápido y es posible que Nvidia se lo planteé de colocar en un chip aparte ya que el cuello actual para el trazado de rayos en estos momentos es la generación del BVH por parte de la CPU.

Esto es todo, tenéis los comentarios de esta misma entrada para comentar y no olvidéis que tenemos Discord.

0 0 vote
Article Rating
1 Comment
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Set

Interesante y exelente explicacion de BVH, yo pensaba que eran lo shaders de la GPU quien creaba el BVH en Turing, pero si es el CPU.

Tambien sera de ver si la creación de BVH por CPU es el cuello no.