Como o Cache de textura funciona, considerando várias unidades de sombreamento

11

As GPUs modernas têm muitas unidades de sombreamento paralelas. Gostaria de saber como o cache de textura é gerenciado nesse cenário.

Felipe Lira
fonte

Respostas:

14

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.

Nathan Reed
fonte
1
Obrigado! Isso foi realmente útil. Regenerando as constantes / cache uniforme. Existem outras dicas além da precisão (média, baixa) que eu poderia usar para melhorar a taxa de acertos do cache de uniformes? A ordem na qual eu declaro uniformes faz alguma diferença (quanto à embalagem mais rigorosa)?
Felipe Lira
2
A @PhilLira Packing pode fazer a diferença, sim. O compilador inserirá preenchimento para impedir que os vetores sejam divididos entre os limites de 16 bytes, portanto, tente evitar isso. Eu não acho que o midp / lowp realmente faz algo em uniformes, pelo menos em GPUs de desktop (talvez faça no celular). Eu não me preocuparia muito com a taxa de acertos de cache uniforme. Isso é extremamente raro, se é que existe, um gargalo.
22615 Nathan Reed