A maneira mais eficiente de organizar dados de vértices em GPUs modernas


9

Digamos que eu tenha um modelo feito de vértices, cada um com position, normal, tangent, e texcoordatributos, onde triângulos são especificados por triplos índice.

Se focarmos apenas nos atributos do vértice, conheço duas estratégias amplas: a estrutura de matrizes e a matriz de estruturas. Também ouvi dizer que a matriz de estruturas é preferida porque aumenta a localidade da memória (e, portanto, a localidade do cache) dos atributos para um determinado vértice.

É realmente assim que isso melhora o desempenho? A principal maneira de pensar que isso aconteceria é pelos índices de vértices que exigem que o rasterizador adquira dados de vértices que há muito tempo foram despejados do cache. Se o acesso aos dados do vértice for aleatório assim, manter todos os atributos de um vértice na mesma linha de cache certamente tornaria as coisas mais rápidas, mas isso não é um problema que poderia ser atenuado principalmente pela otimização da ordem da especificação do triângulo?

Além disso, entendo que as GPUs modernas podem ser melhores para descompactar vetores longos do mesmo tipo do que vetores de estruturas de vários tipos. Seria possível que um layout de estrutura de matrizes superasse consistentemente um layout de matriz de estruturas dos mesmos dados de vértice, se a ordem do índice fosse otimizada?


4
Você não poderia simplesmente experimentar e ver qual é o mais rápido para o seu caso?
user1118321

Eu pensaria em malhas indexadas que a matriz de estruturas seria mais eficiente, pois o sombreador de vértice será alimentado com todos os atributos de vértice, portanto, agrupá-los na memória será mais amigável para o cache.
PaulHK 11/01/19

Dependendo dos tipos de dados na estrutura, os vec4s e os carros alegóricos são bem organizados, outros tipos não tão bem
PaulHK

2
@ user1118321 Embora experimentos de benchmarking individuais sejam uma prática louvável, certamente há mais valor a longo prazo em uma discussão teórica mais ampla e talvez o estabelecimento resultante de práticas gerais com base em como o hardware de tração de vértices funciona.
Chris diz Reinstate Monica em

Respostas:


2

Desculpas, eu ia adicionar um comentário ao seu tópico de perguntas, mas descobri que acabei elaborando demais. Minha experiência em desenvolvimento é do ponto de vista do DX 11, portanto, parte disso pode não ser válida no OpenGL

A localização da memória dos dados certamente desempenha um papel importante. Mas existem alguns outros itens que contribuem para isso, a largura dos dados, como você conhece. Eu tive algumas GPUs e tive um grande desempenho em algumas baseadas em certos pontos críticos. Esse é o exemplo, no meu antigo AMD r290, se bem me lembro, você poderia basicamente passar até 4 float4s para o buffer de vértice sem custo adicional acima de 1, mas depois que eu publiquei> 4, houve uma queda mensurável (no quadro taxa). Isso é puramente fora da minha lembrança e, portanto, é anedótico da melhor forma. Mas sustenta que a arquitetura da GPU está mudando o tempo todo e que técnicas de nicho que oferecem uma vantagem no desempenho hoje, talvez a desgraça do seu desempenho amanhã. EU'

Dito isto, você fez a pergunta sobre a ordem dos vértices, e certamente isso ajudará marginalmente. O ganho de desempenho é quando você combina isso com buffers de índice, o que permite ao hardware otimizar e armazenar em cache os vértices já calculados. Você certamente pode obter ainda mais ganhos com tiras de triângulo, etc., que foram encomendadas especificamente de acordo com seus pensamentos. A maioria das renderizações de modelos que eu faço são modelos otimizados baseados em índices / vértices com instanciamento, eu uso uma pequena quantidade de pesquisas para efeitos de movimento cíclico (galhos de árvores, por exemplo); nesses casos, todo o galho da árvore procura o mesmo valor. Portanto, o cache também pode ser aproveitado aqui.

Tudo o que posso dizer em resumo de mim mesmo é:

  • Tente não pensar demais na otimização no início, enquanto você ainda está desenvolvendo seu jogo / aplicativo e tente não otimizar prematuramente. Se você precisar voltar e adicionar novos recursos, poderá perder todo o esforço. Você tem o meu hábito talvez> <, adoro tentar obter o melhor desempenho e técnicas
  • As arquiteturas de GPU são variadas e os pontos fortes de um podem refletir pontos fracos em outro. A AMD e a Nvidia são famosas por fazer com que os desenvolvedores otimizem os jogos para sua arquitetura, por um motivo, cada um tem vantagens / desvantagens. Seguir o caminho intermediário do desenvolvimento pode ser o melhor lugar, não use nenhum recurso baseado em fornecedor de hardware (opinião aqui). (adicione a isso, alguns formatos compactados existem apenas na AMD).

Estes são apenas alguns pensamentos e experiências que tive. Existem muitos livros por aí que você deve colocar em suas mãos sobre esses mesmos tópicos. Não vi muitos prescreverem o que você está propondo, mas isso não significa que esteja errado. Boa sorte.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.