¿Cómo funciona Texture Cache considerando múltiples unidades de sombreado?

11

Las GPU modernas tienen muchas unidades de sombreado paralelas. Me gustaría saber cómo se gestiona el caché de texturas en ese escenario.

Felipe Lira
fuente

Respuestas:

14

En el nivel superior, una GPU se subdivide en varios núcleos de sombreadores. Una GPU pequeña en una computadora portátil o tableta puede tener solo unos pocos núcleos, mientras que una GPU de escritorio de gama alta puede tener docenas.

Además de los núcleos de sombreado, también hay unidades de textura. Se pueden agrupar con una unidad de textura por núcleo de sombreador, o una unidad de textura compartida entre dos o tres núcleos de sombreador, dependiendo de la GPU.

Todo el chip comparte un solo caché L2, pero las diferentes unidades tendrán cachés L1 individuales. Las unidades de textura tienen cachés de textura, y las unidades de sombreado tienen cachés para instrucciones y constantes / uniformes, y tal vez un caché separado para datos de buffer dependiendo de si las cargas de buffer son una ruta separada de las cargas de textura o no (varía según la arquitectura de la GPU).

Las unidades de textura funcionan de forma independiente y asíncrona desde los núcleos de sombreado. Cuando un sombreador realiza una lectura de textura, envía una solicitud a la unidad de textura a través de un pequeño bus entre ellos; el sombreador puede continuar ejecutándose si es posible, o puede suspenderse y permitir que se ejecuten otros hilos del sombreador mientras espera que termine la lectura de textura.

La unidad de textura agrupa un montón de solicitudes y realiza los cálculos matemáticos de direccionamiento en ellas: seleccionando niveles de mip y anisotropía, convirtiendo los UV en coordenadas de texel, aplicando modos de sujeción / envoltura, etc. Una vez que sabe qué texels necesita, los lee a través del jerarquía de caché, de la misma manera que las lecturas de memoria funcionan en una CPU (mire primero en L1, si no está allí, luego L2, luego DRAM). Si muchas solicitudes de texturas pendientes quieren todos los texels iguales o cercanos (como a menudo lo hacen), entonces obtiene mucha eficiencia aquí, ya que puede satisfacer muchas solicitudes pendientes con solo unas pocas transacciones de memoria. Todas estas operaciones están canalizadas, por lo tanto, mientras la unidad de textura está esperando memoria en un lote, puede estar haciendo los cálculos de direccionamiento para otro lote de solicitudes, y así sucesivamente.

Una vez que los datos vuelven, la unidad de textura decodificará los formatos comprimidos, realizará la conversión y el filtrado sRGB según sea necesario, y luego devolverá los resultados al núcleo del sombreador.

Nathan Reed
fuente
1
¡Gracias! Eso fue realmente útil. Regadiendo las constantes / caché uniforme. ¿Son algunos consejos además de la precisión (mediump, lowp) que podría usar para mejorar la proporción de aciertos de caché de uniformes? ¿El orden en que declaro los uniformes hace alguna diferencia (en cuanto al embalaje más apretado)?
Felipe Lira
2
@PhilLira Packing puede marcar la diferencia, sí. El compilador insertará relleno para evitar que los vectores se dividan en límites de 16 bytes, así que trate de evitarlo. No creo que mediump / lowp realmente haga algo en uniformes, al menos en GPU de escritorio (tal vez lo hace en dispositivos móviles). Sin embargo, no me preocuparía demasiado por la proporción uniforme de aciertos de caché. Eso es extremadamente raro, si alguna vez, un cuello de botella.
Nathan Reed