La forma más eficaz de organizar datos de vértices en GPU modernas

9

Decir que tengo un modelo formado por los vértices, cada uno con position, normal, tangent, y texcoordatributos, en los triángulos son especificados por los triples de índice.

Si solo nos centramos en los atributos del vértice, conozco dos estrategias generales: la estructura de las matrices y la matriz de estructuras. También escuché que se prefiere la matriz de estructuras porque aumenta la localidad de memoria (y por lo tanto la localidad de caché) de los atributos para un vértice dado.

¿Es realmente el caso que esto mejora el rendimiento? La forma principal en que podría pensar que esto ocurriría es mediante índices de vértices que requieren que el rasterizador adquiera datos de vértices que desde hace mucho tiempo han sido expulsados ​​de la caché. Si el acceso a los datos de vértice es aleatorio como este, entonces mantener todos los atributos para un vértice en la misma línea de caché sin duda agilizaría las cosas, pero ¿no es este un problema que podría mitigarse principalmente al optimizar el orden de la especificación del triángulo?

Además, entiendo que las GPU modernas pueden ser mejores para desempaquetar vectores largos del mismo tipo, que los vectores de estructuras de muchos tipos. ¿Sería posible que un diseño de estructura de matrices supere consistentemente un diseño de matriz de estructuras de los mismos datos de vértice, si el orden del índice está optimizado?

lcmylin
fuente
44
¿No podría simplemente probarlo y ver cuál es el más rápido para su caso?
user1118321
Habría pensado para mallas indexadas que la matriz de estructuras sería más eficiente ya que el sombreador de vértices se alimentaría con todos los atributos de vértice, por lo que tenerlos agrupados en la memoria será más amigable con la memoria caché.
PaulHK
Dependiendo de los tipos de datos en la estructura, vec4s y flotantes se combinan muy bien, otros tipos no tan bien
PaulHK
2
@ user1118321 Si bien los experimentos de evaluación comparativa individuales son una práctica encomiable, ciertamente hay un valor a más largo plazo en una discusión teórica más amplia y tal vez el establecimiento resultante de prácticas generales basadas en cómo funciona el hardware de extracción de vértices.
Chris dice reinstalar a Mónica

Respuestas:

2

Disculpas, iba a agregar un comentario a su hilo de preguntas, pero descubrí que terminé elaborando demasiado. Mi experiencia de desarrollo es desde una perspectiva DX 11, por lo que es posible que parte de esto no se mantenga en OpenGL

La localidad de memoria de los datos ciertamente juega un papel importante. Pero hay algunos otros elementos que juegan en esto, el ancho de los datos como ustedes saben. He tenido algunas GPU y he tenido un gran rendimiento en algunos basado en ciertos puntos de inflexión. Ese es, por ejemplo, en mi viejo AMD r290, si recuerdo, básicamente podría pasar hasta 4 float4s al búfer de vértices sin costo adicional por encima de 1, pero una vez que publiqué> 4, hubo una caída medible (en el marco Velocidad). Esto está puramente fuera de mi recuerdo y también es anecdótico. Pero sostiene que la arquitectura de la GPU está cambiando todo el tiempo, y qué técnicas de nicho que le brindan una ventaja de rendimiento hoy pueden ser la ruina de su rendimiento mañana. YO'

Dicho esto, ha formulado la pregunta sobre el orden de los vértices, y ciertamente eso ayudará marginalmente. La ganancia de rendimiento es cuando se combina esto con buffers de índice que luego permiten al hardware optimizar y almacenar en caché los vértices ya calculados. Ciertamente, puede obtener aún más ganancias de las tiras triangulares, etc., que se ordenaron específicamente según sus pensamientos. La mayoría de las representaciones de modelos que hago son modelos optimizados basados ​​en índices / vértices con instancias, utilizo una pequeña cantidad de búsquedas de efectos de movimiento cíclicos (ramas de árbol, por ejemplo), en estos casos, toda la rama del árbol está buscando el mismo valor. Por lo tanto, el almacenamiento en caché se puede aprovechar aquí también.

Todo lo que puedo decir en resumen de mí mismo es:

  • Intenta no pensar demasiado en la optimización al principio, mientras sigues desarrollando tu juego / aplicación, trata de no optimizarlo prematuramente. Si necesita regresar y agregar nuevas capacidades, puede perder todo el esfuerzo. Tienes mi hábito tal vez> <, me encanta tratar de obtener el mejor rendimiento y técnicas
  • Las arquitecturas de GPU son variadas, y las fortalezas de uno pueden reflejar debilidades en otro. AMD y Nvidia son famosos por hacer que los desarrolladores optimicen los juegos a su arquitectura, por una razón, cada uno tiene ventajas / desventajas. Tomar el camino intermedio en el desarrollo podría ser el mejor lugar, no use ninguna función basada en proveedores de hardware (opinión aquí). (Además, algunos formatos empaquetados solo existen en AMD).

Estos son solo algunos pensamientos y experiencias que he tenido. Hay muchos libros por ahí en los que debería tener acceso a estos temas. No he visto a muchos prescribir lo que está proponiendo, pero eso no significa que esté mal. Buena suerte.

ErnieDingo
fuente