Como o cache de textura funciona na GPU de renderização baseada em bloco

9

Como o cache funciona com a renderização baseada em bloco?

Existem dicas sobre como melhorar a taxa de acertos do cache? (por exemplo, se os blocos são processados ​​horizontalmente e eu tenho segmentos verticais de triângulos com a mesma textura, isso funciona pior para o cache do que se eu tivesse o layout dos triângulos horizontalmente?)

Felipe Lira
fonte
11
O que você quer dizer com layout vertical versus horizontal de triângulos?
Mokosha 28/08/2015
@Mokosha desculpe, isso de alguma forma passou despercebido para mim. Acabei de ver agora. Esta é mais uma questão teórica do que prática e nem sei se isso faz sentido agora. Enfim, o que eu quis dizer foi, digamos que um triângulo cruze blocos (x, y) e (x + 1, y) e que esses dois blocos sejam processados ​​um após o outro. Isso seria melhor para o cache de textura do que se eu tivesse um triângulo cruzando (x, y) e (x, y + 1)? (Uma vez que um dos pixels de fronteira e o esquema de triângulos não ser no mesmo sentido as telhas de processamento é)
Felipe Lira

Respostas:

19

Se é uma GPU baseada em bloco ou não, não afeta realmente a arquitetura do cache de textura. O layout da textura da memória será semelhante a algum tipo de ordem de Morton ou curva de Hilbert em todas as GPUs.

Como resultado, é mais eficiente renderizar triângulos próximos de triângulos equilaterais porque o sistema de memória GPU busca linhas de texels em cache.

Então, obviamente, nas bordas dos blocos, pode acontecer que você precise buscar texels duas vezes. Isso tem um custo pequeno, já que as bordas dos blocos são apenas "poucos" pixels.

Indiscutivelmente, as GPUs de desktop se comportam de forma idêntica às GPUs baseadas em blocos, conforme demonstram as experiências a seguir: http://www.g-truc.net/post-0597.html

O tamanho dos blocos diferem, mas ambas as arquiteturas processam fragmentos em uma hierarquia de blocos de tamanhos diferentes.

Ao codificar para GPUs baseadas em blocos, minha recomendação é sempre ter em mente:

  1. Não troque objetos de buffer de estrutura a menos que você realmente precise.
  2. Ao vincular um novo objeto buffer de estrutura, se você não precisar salvar o conteúdo do buffer de moldura atual, descarte-o. Se não desejar carregar o conteúdo do novo buffer de estrutura, limpe-o.
Christophe
fonte
Atualizei o segundo item, pois a edição não era o que eu queria dizer. Caso contrário, parece ótimo!
Christophe
Oi Christophe, você quis dizer triângulos "equilaterais" em vez de "isósceles"? Em vez de "Hilbert", eu teria dito a ordem "Morton", pois o endereçamento é muito mais fácil no hardware.
Simon F
@Christophe thanks! Isso é realmente útil. Então, para os pixels da borda, o cache de textura não importa? Era isso que eu estava pensando. Então, se eu tiver um triângulo que cruze blocos (x, y) e (x + 1, y) e a GPU apenas rasterize o bloco (x, y). Supondo que o bloco (x + 1, y) será o próximo, mesmo que uma Unidade de Execução diferente o processe, não vou me beneficiar do cache de textura ao amostrar texels para esse triângulo?
Felipe Lira
Além disso, fiquei curioso sobre o padrão de Hilbert. Sempre presumi que isso fosse verdade para texturas compactadas em bloco. Isso é verdade para todas as texturas? PS: Eu também não segui o último parágrafo.
Felipe Lira
PVRTC codifica blocos textura em uma ordem Morton
ashleysmithgpu