Me di cuenta de que muchos programas 3D normalmente hacen cálculos de vectores / matrices, así como transformaciones geométricas en la CPU. ¿Alguien ha encontrado una ventaja al mover estos cálculos a sombreadores de vértices en la GPU?
fuente
Me di cuenta de que muchos programas 3D normalmente hacen cálculos de vectores / matrices, así como transformaciones geométricas en la CPU. ¿Alguien ha encontrado una ventaja al mover estos cálculos a sombreadores de vértices en la GPU?
En términos generales: las transformaciones de malla se realizan en la GPU. Envía la matriz de transformación a la GPU y el sombreador la aplica a todas las verticies de la malla.
Usar la GPU para calcular la matriz en sí es una cuestión diferente y en realidad es más lenta en la GPU porque hay tantos valores almacenados que cambian de cuadro a cuadro que son necesarios para ayudar a determinar la matriz de transformación final. Enviar estos datos desde y hacia la CPU: la GPU es lenta. Además, en la CPU, los cálculos se realizan una vez, mientras que en la GPU, se realizarían para cada vértice.
Se pueden hacer muchas transformaciones geométricas en procesadores que no sean GPU, sin embargo, uno debe considerar la plataforma de destino. Su kilometraje variará según la plataforma a la que se dirija y los cuellos de botella de esa plataforma.
Una consideración es el ancho de banda del bus entre el dispositivo que genera la geometría y el dispositivo que representa la geometría.
En un sistema de PC moderno típico, la CPU está en un lado del bus PCIe (http://en.wikipedia.org/wiki/PCI_Express), y la GPU está en el otro. La única forma de transferir datos generados por cuadro de la CPU a la GPU (y viceversa) es a través de este bus. Esto significa que puede estar limitado por la velocidad de transferencia de este bus. Si su plataforma de destino tiene PCIe 2.x con 16 carriles, tiene un ancho de banda de 8GB / s. En la práctica, las transferencias a través de PCIe no son 100% eficientes, ya que parte del ancho de banda se consume para el protocolo durante las transferencias. Dependiendo del tamaño de sus transferencias, podría perder del 5 al 10% de su ancho de banda solo con la sobrecarga por paquete.
p.ej. Dada una plataforma de PC que ejecuta PCIe 2.x con 16 carriles, ¿cuántos datos puede generar por cuadro para alimentar a la GPU? Suponiendo que desea la ejecución a 60 fps, esto se traduce en 8 GB / 60 = 136 MB por cuadro para PCIe 2.x. Multiplicando por un factor de 90% (invitado) para tener en cuenta la sobrecarga de comunicación del controlador y la sobrecarga del protocolo de transferencia PCIe, puede generar alrededor de 120Mb de datos por trama sin estar limitado por el ancho de banda PCIe 2.x.
Otra pregunta que debe responder: ¿será fácil generar la generación de estos 120Mb de datos en 1/60 de segundo en su CPU de destino? Recordando que tienes que realizar una serie de otras tareas del juego en tu CPU, puedes quedarte sin tiempo para generar los datos transformados. En términos de rendimiento de ALU puro, esto puede limitarlo en la CPU. En términos de buses de CPU a sysmem, también puede estar limitado por el ancho de banda (que varía, pero es de alrededor de ~ 8.5GB / s en CPU recientes).
Bien, entonces, ¿qué factores hacen que sea más viable hacerlo en una GPU? Un factor es el ancho de banda de la memoria de la GPU, que es el ancho de banda entre la GPU y su memoria de video local. En las GPU de rango medio contemporáneas, este ancho de banda de memoria de video puede ser tan alto como 200GB / s (sí, es 25 veces el ancho de banda PCIe 2.x). Otro factor es que la GPU es masivamente paralela, tiene cientos de ALU y es capaz de ocultar la latencia de acceso a la memoria ejecutando miles de hilos a la vez.
Todos estos factores pueden contribuir a la ganancia obvia de impulsar más trabajo en la GPU, pero nuevamente YMMV dependiendo de su plataforma de destino.
fuente
¿Qué quieres decir con "transformaciones de malla"? ¿Transformando la geometría por algún conjunto de matrices? La mayoría de los juegos en estos días permitirán que la GPU maneje transformaciones simples, skinning, etc. Y la mayoría de ellos usarán sombreadores de vértices para hacerlo. En algunas plataformas, no tiene sombreadores o hay otras ventajas de hacer estas cosas en la CPU. Por ejemplo, en la PS3 puede quitar algo de carga del RSX al permitir que las SPU manejen el skinning y la transformación. Si está realizando una iluminación de varias pasadas, el pelado en la CPU puede ser ventajoso, ya que solo tiene que hacerlo una vez y enviar los resultados que se dibujarán para cada pasada de renderizado. Así que hay excepciones, pero en general la mayoría de los juegos están haciendo estas cosas en la GPU y en los sombreadores.
¿O quisiste decir algo más elegante, como usar la GPU para matemática vectorial general? En estos días tenemos GPU de propósito general que pueden ejecutar código C bastante genérico a través de sistemas como CUDA. Es posible aprovechar esto para las matemáticas de vectores pesados, y sé que existen programas que hacen esto. Sin embargo, no tengo ninguna experiencia personal.
fuente
Hay situaciones en las que puede tener sentido tener todo encendido en la GPU, pero no puede establecer constantes dentro de un sombreador y realmente no hay otro lugar para configurarlas, excepto en el lado de la CPU antes de una llamada de extracción.
Incluso si pudiera calcular sus constantes, como las matrices de transformación ósea, en la GPU con un programa de inicialización personalizado, probablemente no quiera hacerlo. la GPU es realmente buena en ejecución paralela, pero tiene una velocidad de reloj mucho más lenta.
La transformación de una jerarquía no es trivialmente paralelizable, porque los nodos secundarios dependen de los padres, pero la transformación de todos los vértices en una malla sí, porque los vértices son computacionales independientes entre sí.
La regla general es:
fuente