As GPUs modernas têm muitas unidades de sombreamento paralelas. Gostaria de saber como o cache de textura é gerenciado nesse cenário.
No nível superior, uma GPU é subdividida em vários núcleos de shader. Uma pequena GPU em um notebook ou tablet pode ter apenas alguns núcleos, enquanto uma GPU de desktop de ponta pode ter dezenas.
Além dos núcleos de shader, também existem unidades de textura. Eles podem ser agrupados com uma unidade de textura por núcleo de shader ou uma unidade de textura compartilhada entre dois ou três núcleos de shader, dependendo da GPU.
O chip inteiro compartilha um único cache L2, mas as diferentes unidades terão caches L1 individuais. As unidades de textura têm caches de textura, e as unidades de shader têm caches de instruções e constantes / uniformes, e talvez um cache separado para dados do buffer, dependendo se as cargas de buffer são um caminho separado das cargas de textura ou não (varia de acordo com a arquitetura da GPU).
As unidades de textura operam de forma independente e assíncrona a partir de núcleos de shader. Quando um shader executa uma leitura de textura, ele envia uma solicitação para a unidade de textura através de um pequeno barramento entre eles; o shader pode continuar executando, se possível, ou pode ficar suspenso e permitir que outros threads do shader sejam executados enquanto aguarda a conclusão da leitura da textura.
A unidade de textura agrupa várias solicitações e executa a matemática de endereçamento nelas - selecionando níveis mip e anisotropia, convertendo UVs em coordenadas texel, aplicando modos de fixação / quebra-cabeça etc. hierarquia de cache, da mesma maneira que as leituras de memória funcionam em uma CPU (procure L1 primeiro, se não houver, L2 e DRAM). Se todas as solicitações de textura pendentes quiserem o mesmo texels ou nas proximidades (como costumam fazer), você terá muita eficiência aqui, pois poderá satisfazer muitas solicitações pendentes com apenas algumas transações de memória. Todas essas operações são canalizadas, portanto, enquanto a unidade de textura está aguardando memória em um lote, ela pode fazer a matemática de endereçamento para outro lote de solicitações e assim por diante.
Quando os dados retornarem, a unidade de textura decodificará os formatos compactados, fará a conversão e a filtragem de sRGB conforme necessário e retornará os resultados ao núcleo do shader.