Il modo più efficace per organizzare i dati dei vertici su GPU moderne


9

Che ho un modello composto da vertici, ciascuno con position, normal, tangente texcoordgli attributi, in cui i triangoli sono specificati da triple indice.

Se ci concentriamo solo sugli attributi del vertice, sono a conoscenza di due grandi strategie: la struttura delle matrici e la matrice delle strutture. Ho anche sentito che la matrice di strutture è preferita perché aumenta la località di memoria (e quindi la località di cache) degli attributi per un dato vertice.

È davvero così che migliora le prestazioni? Il modo principale in cui potrei pensare che ciò avvenga è attraverso indici di vertici che richiedono al rasterizzatore di acquisire dati di vertici che sono stati da tempo sfrattati dalla cache. Se l'accesso ai dati dei vertici è casuale come questo, quindi mantenere tutti gli attributi di un vertice sulla stessa riga della cache renderebbe sicuramente le cose più veloci, ma questo non è un problema che potrebbe essere mitigato principalmente ottimizzando l'ordine delle specifiche del triangolo?

Inoltre, capisco che le GPU moderne potrebbero essere migliori nel disimballare lunghi vettori dello stesso tipo, rispetto ai vettori di strutture di molti tipi. Sarebbe quindi possibile che un layout di struttura di array superi costantemente un layout di matrice di strutture degli stessi dati di vertice, se l'ordine dell'indice è ottimizzato?


4
Non potresti semplicemente provarlo e vedere quale è il più veloce per il tuo caso?
user1118321

Avrei pensato per le maglie indicizzate che le matrici di strutture sarebbero state più efficienti in quanto lo shader di vertici verrà alimentato con tutti gli attributi di vertice, quindi raggrupparli in memoria sarà più intuitivo per la cache.
PaulHK,

A seconda dei tipi di dati nella struttura, vec4s e float si incastrano bene insieme, altri tipi non così bene
PaulHK

2
@ user1118321 Mentre gli esperimenti di benchmarking individuale sono una pratica encomiabile, c'è sicuramente un valore più a lungo termine in una discussione teorica più ampia e forse la conseguente creazione di pratiche generali basate sul funzionamento dell'hardware di pull dei vertici.
Christian Rau,

Risposte:


2

Mi scuso, stavo per aggiungere un commento al tuo thread di domande, ma ho scoperto che ho finito per elaborare troppo. La mia esperienza di sviluppo è da una prospettiva DX 11, quindi alcuni di questi potrebbero non essere validi in OpenGL

La località di memoria dei dati svolge sicuramente un ruolo importante. Ma ci sono alcuni altri elementi che giocano in questo, la larghezza dei dati come sai. Ho avuto alcune GPU e ho avuto un forte impatto sulle prestazioni in base a determinati punti di non ritorno. Questo è, ad esempio, sul mio vecchio AMD r290 se ricordo che in pratica potevi passare fino a 4 float4s al buffer dei vertici senza costi aggiuntivi oltre 1, ma una volta che ho pubblicato> 4, c'era un calo misurabile (nel frame Vota). Questo è puramente fuori dal mio ricordo e quindi è aneddotico come il migliore. Ma sostiene che l'architettura GPU sta cambiando continuamente, e quali tecniche di nicchia che ti danno un vantaggio prestazionale oggi forse la rovina delle tue prestazioni domani. IO'

Detto questo, hai posto la domanda sull'ordinamento dei vertici, e sicuramente questo aiuterà marginalmente. Il vantaggio in termini di prestazioni è quando lo si combina con buffer di indice che consente all'hardware di ottimizzare e memorizzare nella cache vertici già calcolati. Potresti certamente ottenere ancora più guadagni dalle strisce triangolari ecc. Che sono state ordinate secondo i tuoi pensieri. La maggior parte del rendering del modello che faccio è basato su modelli ottimizzati basati su indice / vertice con instanziamento, utilizzo una piccola quantità di ricerche per effetti di movimento ciclici (ad esempio rami di alberi), in questi casi l'intero ramo dell'albero sta cercando lo stesso valore. Quindi la cache può essere sfruttata anche qui.

Tutto quello che posso dire in sintesi da me è:

  • Cerca di non pensare troppo all'ottimizzazione all'inizio, mentre stai ancora sviluppando il tuo gioco / applicazione cerca di non ottimizzare prematuramente. Se devi tornare e aggiungere nuove funzionalità, potresti perdere tutto lo sforzo. Forse hai la mia abitudine> <, adoro cercare di ottenere le migliori prestazioni e tecniche
  • Le architetture GPU sono varie e i punti di forza di una possono riflettere punti deboli in un'altra. AMD e Nvidia sono famosi per ottenere sviluppatori per ottimizzare i giochi per la loro architettura, per un motivo, ognuno ha vantaggi / svantaggi. Prendere la via di mezzo per lo sviluppo potrebbe essere il posto migliore, non utilizzare alcuna funzionalità basata su fornitori di hardware (opinione qui). (aggiungi a ciò, alcuni formati compressi esistono solo in AMD).

Questi sono solo alcuni dei pensieri e delle esperienze che ho avuto. Ci sono molti libri là fuori su cui dovresti mettere le mani su questi argomenti. Non ho visto molti prescrivere ciò che stai proponendo, ma ciò non significa che sia sbagliato. In bocca al lupo.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.