Trasformazioni geometriche su CPU vs GPU


9

Ho notato che molti programmi 3d normalmente eseguono calcoli vettoriali / a matrice e trasformazioni geometriche sulla CPU. Qualcuno ha trovato un vantaggio nello spostare questi calcoli in shader di vertici sulla GPU?

Risposte:


3

In generale: le trasformazioni della mesh vengono eseguite sulla GPU. Si invia la matrice di trasformazione alla GPU e lo shader lo applica a tutti i vertici della mesh.

L'uso della GPU per calcolare la matrice stessa è una questione diversa ed è effettivamente più lento sulla GPU perché ci sono così tanti valori memorizzati che cambiano da frame a frame necessari per aiutare a determinare la matrice di trasformazione finale. Invio di questi dati da e verso la CPU - La GPU è lenta. Inoltre, sulla CPU, i calcoli vengono eseguiti una volta, mentre sulla GPU vengono eseguiti per ciascun vertice.


Ha scritto la parte "attualmente più lenta su GPU"; questa è una dichiarazione molto ampia. Se stai parlando di costruire la matrice per ciascun vertice su GPU, le tue prestazioni dipenderanno dai tuoi colli di bottiglia. Otterrai prestazioni più lente solo se sei associato a ALU / registro sulla GPU, il che non è necessariamente il caso. Fare esattamente la stessa cosa su una CPU sarebbe anche più lento in questi scenari di collo di bottiglia. Un esempio in cui questo è comunemente fatto su GPU: shader di vertici costruiscono al volo matrici spaziali tangenti di vertici per salvare la larghezza di banda di recupero dei vertici. Ancora una volta, a seconda dei colli di bottiglia, quindi YMMV.
jpaver,

Non posso sottovalutare, ma questa risposta dovrebbe essere sottovalutata. È molto sbagliato dire "in realtà più lento sulla GPU".
Adam,

3

Molte trasformazioni geometriche possono essere eseguite su processori non GPU, tuttavia è necessario considerare la piattaforma di destinazione. Il chilometraggio varia in base alla piattaforma target e ai colli di bottiglia di tale piattaforma.

Una considerazione è la larghezza di banda del bus tra il dispositivo che genera la geometria e il dispositivo che esegue il rendering della geometria.

In un tipico sistema PC moderno, la CPU si trova su un lato del bus PCIe (http://en.wikipedia.org/wiki/PCI_Express) e la GPU sull'altro. L'unico modo in cui è possibile trasferire i dati generati per frame dalla CPU alla GPU (e viceversa) è tramite questo bus. Ciò significa che puoi essere limitato dalla velocità di trasferimento di questo bus. Se la tua piattaforma di destinazione ha PCIe 2.x con 16 corsie, hai una larghezza di banda di 8 GB / s. In pratica, i trasferimenti attraverso PCIe non sono efficienti al 100%, poiché parte della larghezza di banda viene consumata per il protocollo durante i trasferimenti. A seconda delle dimensioni dei tuoi trasferimenti, potresti perdere il 5-10% della larghezza di banda solo per le spese generali per pacchetto.

per esempio. Data una piattaforma PC che esegue PCIe 2.x con 16 corsie, quanti dati è possibile generare per frame per l'alimentazione della GPU? Supponendo che si desideri eseguire la corsa a 60 fps, ciò si traduce in 8 GB / 60 = 136 MB per frame per PCIe 2.x. Moltiplicando per un fattore (guestimated) del 90% per tenere conto dell'overhead di comunicazione del driver e dell'overhead del protocollo di trasferimento PCIe, è possibile generare circa 120 Mb di dati per frame senza essere limitato dalla larghezza di banda PCIe 2.x.

Un'altra domanda a cui devi rispondere: la generazione di questi 120 Mb di dati sarà facilmente raggiungibile in 1/60 di secondo sulla CPU di destinazione? Ricordando che è necessario eseguire una serie di altre attività di gioco sulla CPU, è possibile che si verifichi una mancanza di tempo per generare i dati trasformati. In termini di puro throughput ALU, questo può limitarti sulla CPU. In termini di CPU ai bus di sistema, puoi anche essere limitato dalla larghezza di banda (che varia, ma è circa ~ 8,5 GB / s sulle CPU recenti).

Bene, quindi quali fattori rendono più praticabile fare su una GPU allora? Un fattore è la larghezza di banda della memoria GPU, che è la larghezza di banda tra la GPU e la sua memoria video locale. Nelle moderne GPU di fascia media questa larghezza di banda della memoria video può arrivare a 200 GB / s (sì, è 25x la larghezza di banda PCIe 2.x). Un altro fattore è che la GPU è enormemente parallela, ha centinaia di ALU ed è in grado di nascondere la latenza dell'accesso alla memoria eseguendo migliaia di thread alla volta.

Tutti questi fattori possono contribuire all'ovvia vittoria di spingere più lavoro sulla GPU, ma di nuovo YMMV a seconda della piattaforma di destinazione.


1

Cosa intendi con "trasformazioni di mesh"? Trasformare la geometria con una serie di matrici? La maggior parte dei giochi in questi giorni consentirà alla GPU di gestire semplici trasformazioni, skinning, ecc. E la maggior parte di loro utilizzerà shader di vertici per farlo. Su alcune piattaforme o non hai shader o ci sono altri vantaggi nel fare queste cose sulla CPU. Ad esempio, su PS3 puoi togliere un po 'di carico dall'RSX lasciando che le SPU gestiscano lo skinning e la trasformazione. Se stai eseguendo l'illuminazione multi-pass, lo skinning sulla CPU può essere vantaggioso, dal momento che devi farlo solo una volta e inviare i risultati da disegnare per ogni passaggio di rendering. Quindi ci sono eccezioni, ma in generale la maggior parte dei giochi sta facendo queste cose sulla GPU e negli shader.

O intendevi qualcosa di più elaborato, come usare la GPU per la matematica vettoriale generale? In questi giorni abbiamo GPU generiche che possono eseguire codice C abbastanza generico tramite sistemi come CUDA. È possibile approfittare di questo per la matematica vettoriale pesante, e so che ci sono programmi là fuori che lo fanno. Tuttavia, non ho alcuna esperienza personale.


ha cambiato la "trasformazione mesh" in "trasformazione geometrica" ​​per aiutare a chiarire la domanda. sto anche aspettando l'apertura, che potrebbe essere disponibile già dal prossimo anno.
zmdat,

0

Ci sono situazioni in cui avere tutto sotto rendering sulla GPU potrebbe avere senso, ma non è possibile impostare costanti all'interno di uno shader e non c'è davvero nessun altro posto dove impostarle se non sul lato CPU prima di una chiamata di disegno.

Anche se potessi calcolare le tue costanti, come le matrici di trasformazione ossea, sulla GPU con un programma di inizializzazione personalizzato, probabilmente non vorrai farlo. la GPU è davvero brava nell'esecuzione parallela, ma ha una velocità di clock molto più lenta.

Trasformare una gerarchia non è banalmente parallelizzabile, perché i nodi figlio dipendono dai genitori, ma trasformare tutti i vertici in una mesh lo è, perché i vertici sono indipendenti dal punto di vista computazionale.

La regola generale è:

  • Elaborazione seriale: CPU
  • Elaborazione parallela: GPU
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.