Hace solo unos días, el grupo Khronos anunciaba la disponibilidad de la nueva versión de su API de bajo nivel Vulkan, la cual dará el pistoletazo de salida al Ray Tracing para todas las plataformas. Esto es importante puesto que DXR está patentado por Microsoft con sus correspondientes restricciones, pero ahora Vulkan no solo se pone a la altura, sino que viene con un as en la manga que los de Redmond no permiten: cálculos de trazado de rayos en tiempo real mediante CPU.
La nueva extensión de Vulkan para Ray Tracing tiene por nombre VK_KHR_ray_tracing y agrega una las siguientes funcionalidades:
- Funcionalidad para la construcción y gestión de estructuras de aceleración.
- Soporte para etapas y pipelines de los shaders del trazado de rayos.
- Consulta intrínseca de rayos para todas las etapas del shader.
Las características de esta extensión son bastante extensas, pero entre ellas hemos encontrado una que reza de la siguiente manera:
- rayTracingHostAccelerationStructureCommands indica soporte para compilaciones de estructura de aceleración basadas en CPU.
Lo que unido a otra extensión adicional deja un escenario no visto hasta ahora por la dupla NVIDIA / Microsoft.
Ray Tracing por CPU gracias a Vulkan: cuando las GPUs no son suficiente
Todos sabemos que la arquitectura Turing ha supuesto un antes y un después en el mundo de las GPU y de los motores de desarrollo, no en vano NVIDIA la cobra a precio de oro. Pero también hemos visto que su implementación para el cálculo de los algoritmos BVH se realiza de forma híbrida y no pura e independiente, como un proceso totalmente externo al Shading tradicional.
La falta de potencia de las GPU y sus unidades específicas limitan el rendimiento que se puede conseguir con esta técnica, ya que se necesita una potencia de cálculo muy alta para lograr un trazado de rayos alto y en tiempo real.
Pero, ¿y si la CPU echase una mano a dicho cálculo? Los usuarios que dispongan de procesadores rápidos y con bastantes núcleos habrán visto que los motores actuales raramente cargan todos los hilos más allá de un 20-50% en el peor de los casos, donde con seis núcleos es más que suficiente para jugar.
Khronos ha pensado en esto y ha habilitado una extensión exclusiva para Vulkan que permite precisamente cargar la CPU con cálculos directos para Ray Tracing.
Las CPU vuelven a ser relevantes para apoyar a las GPU
La extensión en concreto es definida como VK_KHR_deferred_host_operations y permite que la API descargue costosas operaciones de los drivers a un grupo específico de subprocesos de la CPU, los cuales estarán administrados por la aplicación.
Con esto se permite el trabajo en varios subprocesos en segundo plano e incluso en paralelo y en múltiples núcleos. Esto es útil para la compilación de las pipelines de Ray Tracing o para la construcción de estructuras de aceleración basadas en la CPU con mismos fines.
Las operaciones de host diferidas están diseñadas en torno a un principio de «división del trabajo» y bajo él la aplicación es responsable de:
- La configuración de comandos y solicitudes de ejecución diferida.
- Asignación de subprocesos de trabajo para ejecutar comandos diferidos.
- Establecer prioridades y budgets de CPU como mejor le parezca, eligiendo qué tareas ejecutar y cuándo ejecutarlas.
El driver también es responsable de una parte fundamental de esto, realizando:
- Seguimiento del estado de ejecución de un comando diferido.
- Implementación de ejecución distribuida, cualesquiera sean las construcciones paralelas que sean más apropiadas para la carga de trabajo (tareas, bucles paralelos, gráficos de dependencia, colas de trabajo y similares).
De esta manera, la aplicación controla la asignación y la priorización del trabajo, pero el driver gestiona los detalles de bajo nivel de la API.
La batalla está servida, ¿será esto uno de los reclamos para que los desarrolladores opten por Vulkan antes que por DXR? ¿copiará Microsoft la implementación de Vulkan antes de que siquiera estos se lo planteen? La guerra por la optimización está servida.