Hola.
Es un malentendido común pensar que los motores de renderizado por GPU calculan menos rayos secundarios que los de CPU. La realidad es que, en la mayoría de los casos, tanto los motores modernos de GPU como los de CPU están diseñados para calcular un número de rayos secundarios lo más bajo posible para lograr la calidad deseada en el menor tiempo. La diferencia principal no está en el número de rayos, sino en la forma en que el hardware y el software los gestionan para optimizar el rendimiento.
Las GPU modernas con aceleración por hardware pueden calcular path tracing exponencialmente más rápido que las CPU, abordan la tarea de forma diferente debido a sus diferentes arquitecturas.
Una CPU está diseñada para ser flexible y procesar tareas secuenciales de manera eficiente. Cuenta con unos pocos núcleos potentes que pueden manejar una amplia variedad de instrucciones de forma rápida.
- Flexibilidad: Cada núcleo de la CPU puede ejecutar el código de path tracing de forma independiente, manejando la lógica compleja y la divergencia en el camino de cada rayo de luz.
- Acceso a la memoria: Las CPU tienen una gran cantidad de memoria caché que les permite acceder rápidamente a los datos, y su acceso a la memoria RAM es flexible.
- Desventaja: Su naturaleza secuencial y el menor número de núcleos hacen que sean mucho más lentas para tareas masivamente paralelas, como el path tracing, en comparación con las GPU.
Una GPU está diseñada para realizar una gran cantidad de cálculos simples de forma simultánea. Cuenta con miles de núcleos más pequeños y menos potentes que trabajan en paralelo.
- Velocidad bruta: Gracias a su masiva arquitectura paralela, las GPU pueden trazar una inmensa cantidad de rayos al mismo tiempo. Las GPU modernas incluyen núcleos dedicados (como los núcleos RT de NVIDIA) que aceleran las intersecciones de rayos y la construcción de la jerarquía de la escena.
- Limitaciones: La arquitectura de la GPU tiene debilidades que la obligan a usar trucos en el path tracing:
- Incoherencia del rayo: En el path tracing, cada rayo de luz puede rebotar en una dirección diferente e interactuar con objetos y materiales distintos. Esta divergencia es incoherente para la arquitectura paralela de la GPU y puede reducir su rendimiento, ya que no todos los núcleos pueden seguir las mismas instrucciones.
- Latencia de la memoria: La memoria de la GPU (VRAM) es rápida, pero tiene una latencia más alta que la de la CPU. Para ocultar esta latencia, la GPU necesita tener muchos hilos esperando. Cuando los hilos se vuelven inconsistentes, la capacidad de la GPU para ocultar la latencia de memoria disminuye.
- Memoria limitada: La VRAM es más limitada que la RAM del sistema. Cuando una escena es muy compleja o requiere muchas texturas de alta resolución, la GPU puede quedarse sin memoria, lo que reduce drásticamente el rendimiento.
Rayos coherentes vs. Incoherentes:
• Rayos primarios (coherentes): Los rayos que parten de la cámara hacia la escena son muy similares en su dirección y origen. Esto se debe a que se proyectan de forma ordenada a través del encuadre de la cámara. Este alto grado de coherencia permite a las GPU procesar estos rayos en lotes (paquetes) de forma muy eficiente, aprovechando la caché y el paralelismo.
• Rayos secundarios (incoherentes): Los rayos que rebotan después de chocar con una superficie (para calcular reflejos, refracciones e iluminación indirecta) se dispersan en direcciones aleatorias o casi aleatorias. Por ejemplo, en una superficie difusa, el rayo puede rebotar en cualquier dirección dentro del hemisferio. Esta aleatoriedad hace que los rayos posteriores sigan caminos muy diferentes, se dirijan a distintas partes de la escena y accedan a datos no contiguos en la memoria.
Gestión de la incoherencia en la CPU: Para mitigar este problema, los motores de renderizado más avanzados no procesan los rayos secundarios de forma inmediata. En su lugar, los recogen y los agrupan con otros rayos que tienen orígenes y direcciones similares. Una vez que se ha recogido un número suficiente de rayos incoherentes, se reordenan y se procesan en lotes más eficientes.
En resumen, la CPU maneja los rayos incoherentes utilizando una combinación de paralelismo, vectorización y técnicas de reordenamiento para agrupar los rayos y maximizar la eficiencia de la caché, aunque el rendimiento nunca será tan alto como el de los rayos coherentes.
Gestión de la incoherencia en la GPU: Las GPU manejan los rayos incoherentes combinando hardware especializado (RT Cores) para acelerar la intersección, técnicas de software (reordenación de rayos) para agrupar rayos incoherentes en lotes más eficientes, y enfoques de procesamiento (Wavefront) para gestionar el flujo de trabajo de manera más adaptativa.
La diferencia en los algoritmos:
Para superar estas limitaciones, los motores de renderizado deben usar algoritmos diferentes para las GPU y las CPU:
- GPU (path tracing híbrido): A menudo se combina el path tracing con otras técnicas (como la rasterización y el denoising basado en IA) para lograr un equilibrio entre velocidad y calidad visual en tiempo real. Esta combinación puede introducir imperfecciones.
- CPU (path tracing puro): Un renderizado de alta calidad con CPU usa algoritmos que no necesitan compromisos, lo que da como resultado una iluminación más precisa, aunque mucho más lenta.
En resumen, mientras que una GPU puede calcular path tracing mucho más rápido que una CPU, su arquitectura especializada la obliga a utilizar algoritmos optimizados y sacrificios (especialmente en tiempo
real). La CPU, con su arquitectura flexible, no tiene las mismas limitaciones y puede ejecutar un path tracing más preciso, aunque a una velocidad mucho menor.
Llevo tiempo estudiando las diferencias entre las Gpu y las Cpu y este tema lo considero crítico para entenderlas.
Un saludo.