2015-03-17 13 views
8

Quando si utilizza GLSL su GPU moderne (GL3.3 +), qual è il probabile costo di diramazione su un'uniforme?Costo della ramificazione su uniformi su GPU moderne

Nel mio motore sto arrivando al punto in cui ho un sacco di shader. E ho molti preset di qualità diversi per molti di quelli. Così com'è, sto usando uniformi con if() negli shader per scegliere diversi preset di qualità. Sono comunque preoccupato che potrei ottenere prestazioni migliori ricompilando gli shader e usando #ifdef. Il problema con questo è la necessità di preoccuparsi di monitorare e resettare altre uniformi quando ricompilare uno shader.

Fondamentalmente quello che voglio sapere è se le mie paure sono infondate. La ramificazione su un'uniforme economica sulle moderne GPU? Ho fatto alcuni test personalmente e ho trovato poche differenze in entrambi i modi, ma ho provato solo su nVidia 680.

+0

Il guidatore è libero di ricompilare lo shader con uniformi inline se stesso se vede che il costo della ramificazione sarebbe troppo grande. –

+0

La divergenza del thread, in cui le invocazioni parallele di uno shader prendono percorsi di controllo diversi, è un problema importante nelle GPU moderne. Le uniformi sono applicate a tutte le invocazioni in un programma, tuttavia, quindi questo non è un problema. Evitare la ramificazione sugli attributi dei vertici o altrimenti i dati dinamici è un uso migliore del tuo tempo. –

+0

Ok, quindi nella pratica, è improbabile che una GPU moderna sia più lenta della ricompilazione con le costanti, perché i rami sono leggermente diversi da quelli di una CPU, o perché il compilatore ricompilerà automaticamente lo shader. Ho capito bene? – Jagoly

risposta

5

Ammetto che non sono un esperto, ma forse la mia speculazione è meglio di niente.

Penserei che ramificarsi sulle uniformi sia davvero abbastanza economico. È chiaramente molto diverso da ramificazioni su dati di texture o attributi, dal momento che tutte le ALU nel SIMD seguiranno lo stesso percorso di codice dallo shader, quindi è un ramo "reale" piuttosto che una maschera di esecuzione. Non sono molto sicuro di come i processori shader soffrono di bolle di ramo nella loro pipeline, ma la pipeline è sicuramente destinata ad essere più superficiale rispetto alle CPU generiche (in particolare date le velocità di clock molto più basse in cui solitamente funzionano).

Vorrei poter essere più utile e apprezzerei anche se qualcun altro può rispondere più autorevolmente. Io, per esempio, non mi preoccuperei troppo di ramificarmi sulle uniformi, comunque. Ma come sempre, se ne hai la possibilità, fai il profilo del tuo shader e vedi se fa una differenza evidente.