¿Usar muchos mapas de textura es malo para el almacenamiento en caché?

10

Si tengo muchas texturas (digamos 5+ mapas) unidas a la misma unidad de textura, ¿funciona peor para el caché que si tuviera solo 2 o 3 texturas?

Felipe Lira
fuente

Respuestas:

16

Solo agregando a la respuesta de imallett , es cierto que aumentar el número de accesos a diferentes datos de textura en un sombreador aumentará la presión sobre el caché de la GPU, pero hay varios otros factores que pueden influir significativamente en el efecto. También es posiblemente complicado por el hecho de que, al igual que los cachés de CPU, puede haber varias capas de caché en una GPU, es decir. Unidad de textura <= L0 <= L1 <= .. Memoria

Evite los alias -> Use mapas MIP

Si tiene una escena que tiene minificación de datos de textura, ya sea debido a la perspectiva o al escalado simple y no está utilizando el mapeo MIP, obtendrá un alias. Esto no solo va a producir artefactos visuales; Es muy probable que sea un problema de rendimiento.

Tan pronto como obtenga un alias, los accesos de dirección a la textura se volverán incoherentes, lo que no solo terminará agotando los cachés, sino que introducirá muchos "saltos de página" de DRAM (más correctamente, saltos de fila) que pueden ser costosos. El mapeo MIP ayuda a reducir la incoherencia.

Compresión de la textura

Tal vez sea una opción un poco obvia, pero si puede usar la compresión de textura (por ejemplo, DXTn | ETC * | PVRTC * | etc.) apuntando desde 8 bpp hasta, digamos, 2 bpp, puede aumentar en gran medida la eficacia del ancho de banda / caché de memoria factores de 4x a 16x. Ahora no puedo hablar para todas las GPU, pero algunos esquemas de compresión de texturas (por ejemplo, los enumerados anteriormente) son tan simples de decodificar en hardware que los datos podrían permanecer comprimidos en toda la jerarquía de caché y solo descomprimirse en la unidad de texturas, por lo tanto multiplicando efectivamente el tamaño de esos cachés.

Tamaño de datos

Obviamente, algunos datos, por ejemplo, los objetivos de representación utilizados como datos de textura en representaciones posteriores, no pueden emplear la compresión de textura. Siempre que pueda, use el formato de píxel más pequeño que haga el trabajo, es decir, si lo hace 32 / 16bpp (A) RGB, ¡no use formatos flotantes de 4x32!

Acceso escaso

Esto está algo relacionado con el ejemplo de aliasing anterior, pero hemos visto casos en los que se crean grandes objetivos de renderizado, pero luego se muestrean muy escasamente. Las líneas de caché, ya sea en CPU o GPU, son bastante largas, por lo que si solo usa un píxel en cada línea de caché, desperdiciará las transferencias.

Además, las texturas comprimidas WRT, estas logran la compresión al compartir efectivamente los datos entre una región local de texels. Si no tiene acceso coherente, entonces, aparte de la reducción de la huella de memoria, la compresión probablemente no ayudará.

Lecturas de textura dependientes

No es tanto un problema de caché (bueno, a menos que los accesos computados sean bastante incoherentes), pero los accesos de textura que no están directamente definidos por las coordenadas UV suministradas con vértices pueden ser más lentos que los que están directamente definidos.

Mosaico / Morton VS texturas estriadas

Aunque sospecho que la mayoría de las texturas en estos días se almacenarán en un orden de mosaico o similar a Morton (también conocido como Twiddled / Swizzled) (o incluso una combinación de ambos), algunas texturas aún pueden estar en el orden de la línea de escaneo, lo que significa que la rotación de es probable que la textura conduzca a un número significativo de errores de caché / saltos de página. Desafortunadamente, realmente no sé cómo detectar si un formato particular está organizado de esa manera.

(Para leer en segundo plano, pruebe The Truth About Texture Mapping de Blinn. FWIW, dando algunos pasos más, condujo al uso de texturas de orden Twiddled (es decir, orden de Morton) en al menos algunos de los primeros equipos de PC ).

Simon F
fuente
8

La respuesta depende de lo que quieras decir. El hardware moderno (p. Ej., Con texturas sin enlaces) realmente no le importa demasiado cuántas texturas están "unidas". La verdadera pregunta es cuántos usas .

Las texturas generalmente almacenan datos de una manera amigable para el caché (una curva de Morton, creo). Si usa más texturas, obtendrá más errores de caché, ya que ahora las texturas compiten entre sí por el espacio.

Esto realmente se reduce a la conocida heurística de programación de sombreadores antiguos: los toques de textura son lentos; No uses demasiados.

imallett
fuente