La renderización paralela (o renderización distribuida ) es la aplicación de la programación paralela al dominio computacional de los gráficos de computadora . La renderización de gráficos puede requerir recursos computacionales masivos para escenas complejas que surgen en la visualización científica , visualización médica , aplicaciones CAD y realidad virtual . Investigaciones recientes también han sugerido que la renderización paralela se puede aplicar a los juegos móviles para disminuir el consumo de energía y aumentar la fidelidad gráfica. [1] La renderización es una carga de trabajo vergonzosamente paralela en múltiples dominios (por ejemplo, píxeles, objetos, marcos) y, por lo tanto, ha sido objeto de mucha investigación.
Existen dos razones, a menudo contrapuestas, para utilizar la representación paralela. El escalado del rendimiento permite que los fotogramas se representen más rápidamente, mientras que el escalado de datos permite visualizar conjuntos de datos más grandes. Los diferentes métodos de distribución de la carga de trabajo tienden a favorecer un tipo de escalado sobre el otro. También puede haber otras ventajas y desventajas, como problemas de latencia y equilibrio de carga . Las tres opciones principales para que los primitivos distribuyan son fotogramas completos, píxeles u objetos (por ejemplo, mallas triangulares ).
Cada unidad de procesamiento puede renderizar un fotograma completo desde un punto de vista o momento temporal diferente. Los fotogramas renderizados desde diferentes puntos de vista pueden mejorar la calidad de la imagen con anti-aliasing o agregar efectos como profundidad de campo y salida de visualización tridimensional . Este enfoque permite un buen escalamiento del rendimiento, pero no de los datos.
Al renderizar fotogramas secuenciales en paralelo, se producirá un retraso en las sesiones interactivas. El retraso entre la entrada del usuario y la acción que se muestra es proporcional a la cantidad de fotogramas secuenciales que se renderizan en paralelo.
Los conjuntos de píxeles en el espacio de la pantalla se pueden distribuir entre unidades de procesamiento en lo que a menudo se denomina renderizado de clasificación primero. [2]
La distribución de líneas entrelazadas de píxeles proporciona un buen equilibrio de carga, pero hace imposible el escalado de datos. La distribución de mosaicos 2D contiguos de píxeles permite el escalado de datos mediante la selección de datos con el frustum de vista . Sin embargo, existe una sobrecarga de datos debido a que los objetos en los límites del frustum se replican y los datos se deben cargar de forma dinámica a medida que cambia el punto de vista. También se necesita un equilibrio de carga dinámico para mantener el escalado del rendimiento.
La distribución de objetos entre las unidades de procesamiento suele denominarse "clasificación por última representación". [3] Proporciona un buen escalamiento de datos y puede proporcionar un buen escalamiento de rendimiento, pero requiere que las imágenes intermedias de los nodos de procesamiento se compongan alfa para crear la imagen final. A medida que aumenta la resolución de la imagen, también aumenta la sobrecarga de la composición alfa.
También se necesita un esquema de equilibrio de carga para mantener el rendimiento independientemente de las condiciones de visualización. Esto se puede lograr mediante la partición excesiva del espacio de objetos y la asignación de múltiples piezas a cada unidad de procesamiento de manera aleatoria; sin embargo, esto aumenta la cantidad de etapas de composición alfa necesarias para crear la imagen final. Otra opción es asignar un bloque contiguo a cada unidad de procesamiento y actualizarlo de manera dinámica, pero esto requiere una carga de datos dinámica.
Los diferentes tipos de distribuciones se pueden combinar de varias formas. Se pueden renderizar un par de fotogramas secuenciales en paralelo y, al mismo tiempo, renderizar cada uno de esos fotogramas individuales en paralelo utilizando una distribución de píxeles o de objetos. Las distribuciones de objetos pueden intentar minimizar su superposición en el espacio de la pantalla para reducir los costos de composición alfa, o incluso utilizar una distribución de píxeles para renderizar partes del espacio de objetos.
El paquete de software de código abierto Chromium proporciona un mecanismo de renderizado paralelo para las aplicaciones existentes. Intercepta las llamadas OpenGL y las procesa, generalmente para enviarlas a varias unidades de renderizado que controlan una pantalla .
Equalizer es un marco de renderizado de código abierto y un sistema de gestión de recursos para aplicaciones multicanal. Equalizer proporciona una API para escribir aplicaciones de visualización paralelas y escalables que se configuran en tiempo de ejecución mediante un servidor de recursos. [4]
OpenSG es un sistema de gráficos de escena de código abierto que ofrece capacidades de renderizado paralelo, especialmente en clústeres. Oculta la complejidad de las aplicaciones en paralelo multiproceso y en clústeres y admite el renderizado de ordenación en primer lugar y de ordenación en último lugar. [5]
Golem es una aplicación descentralizada de código abierto utilizada para computación paralela que actualmente funciona con renderizado en Blender y tiene planes de incorporar más usos. [6]