Se ho molte trame (diciamo 5+ mappe) associate alla stessa unità di trama, funziona peggio per la cache che se avessi solo 2 o 3 trame?
Se ho molte trame (diciamo 5+ mappe) associate alla stessa unità di trama, funziona peggio per la cache che se avessi solo 2 o 3 trame?
Risposte:
Aggiungendo semplicemente la risposta di imallett , è vero che aumentare il numero di accessi a diversi dati di trama in uno shader aumenterà la pressione sulla cache o sulle cache della GPU, ma ci sono molti altri fattori che possono influenzare significativamente l'effetto. È anche forse complicato dal fatto che, come le cache della CPU, ci possono essere diversi livelli di cache in una GPU, ad es. Unità texture <= L0 <= L1 <= .. Memoria
Se si dispone di una scena che presenta una minimizzazione dei dati delle trame, sia essa dovuta alla prospettiva o al semplice ridimensionamento e non si utilizza la mappatura MIP, si otterrà l'aliasing. Questo non produrrà solo artefatti visivi; è molto probabile che sia un problema di prestazioni.
Non appena si ottiene l'alias, l'indirizzo che accede alla trama diventerà incoerente che non solo finirà per schiacciare le cache, ma introdurrà molte "interruzioni di pagina" di DRAM (più correttamente, interruzioni di riga) che possono essere costose. La mappatura MIP aiuta a ridurre l'incoerenza.
Forse un po 'un'opzione ovvia, ma se è possibile utilizzare la compressione delle trame (ad esempio DXTn | ETC * | PVRTC * | ecc.) Con targeting da 8 bpp fino a, diciamo, 2 bpp, è possibile aumentare notevolmente l'efficacia della larghezza di banda / cache della memoria di fattori da 4x a 16x. Ora non posso parlare per tutte le GPU, ma alcuni schemi di compressione delle trame (ad esempio quelli sopra elencati) sono così semplici da decodificare nell'hardware, che i dati potrebbero rimanere compressi nell'intera gerarchia della cache e essere decompressi solo nell'unità delle trame, quindi moltiplicando efficacemente le dimensioni di tali cache.
Ovviamente, alcuni dati, ad esempio i target di rendering utilizzati come dati di trama nei successivi rendering, non possono utilizzare la compressione di trama. Ogni volta che puoi, usa il formato pixel più piccolo che farà il lavoro, cioè, se RGB 32 / 16bpp (A) lo farà, non usare i formati float 4x32!
Questo è in qualche modo correlato all'esempio di aliasing sopra, ma abbiamo visto casi in cui vengono creati target di rendering di grandi dimensioni, ma poi solo molto poco campionati. Le linee della cache, sia nelle CPU che nelle GPU, sono piuttosto lunghe, quindi se si utilizza solo un pixel in ciascuna riga della cache, si sprecheranno i trasferimenti.
Inoltre, le trame compresse WRT, raggiungono la compressione condividendo efficacemente i dati tra una regione locale di texel. Se non si dispone di un accesso coerente, a parte la riduzione dell'impronta di memoria, probabilmente la compressione non sarà di aiuto.
Non è un grosso problema di cache (beh, a meno che gli accessi calcolati non siano abbastanza incoerenti), ma gli accessi alla trama che non sono direttamente definiti dalle coordinate UV fornite con i vertici potrebbero essere più lenti di quelli che sono definiti direttamente.
Anche se sospetto che la maggior parte delle trame in questi giorni saranno archiviate in un ordine piastrellato o simile a Morton (aka Twiddled / Swizzled) (o anche una combinazione di entrambe), alcune trame potrebbero essere ancora in ordine di scansione, il che significa che la rotazione di è probabile che la trama porti a un numero significativo di mancate cache / interruzioni di pagina. Sfortunatamente, non so davvero come individuare se un determinato formato è organizzato in questo modo.
(Per leggere in background, prova La verità sulla mappatura delle trame di Blinn . FWIW, facendo alcuni passi in avanti hai portato all'utilizzo di trame dell'ordine Twiddled (cioè ordine Morton) in almeno alcuni dei primi hardware per PC ).
La risposta dipende da cosa intendi. L'hardware moderno (ad es. Con trame senza associazione) in realtà non importa troppo di quante trame sono "legate". La vera domanda è quanti ne usi .
Le trame generalmente archiviano i dati in un modo compatibile con la cache (una curva di Morton, credo). Se usi più trame, otterrai più mancanze della cache, poiché ora le trame competono l'una con l'altra per lo spazio.
Questo in realtà si riduce alla ben nota, euristica programmazione dei vecchi shader: i trame delle trame sono lenti; non usarne troppi.