2014-04-10 23 views
7

Ho una semplice domanda sulla quale non sono riuscito a trovare fatti concreti sul comportamento delle GPU in caso di 3 vertici aventi lo stesso output variabile da vertex shader. La GPU nota che caso o tenta di interpolare quando non è nemmeno necessario?Un triangolo con 3 varianti dello stesso valore .. GPU interpola/spreca prestazioni?

Questo potrebbe essere interessante in quanto vi sono alcuni casi in cui si desidera una variazione costante disponibile in framment shader per triangolo. Per favore non limitarti a indovinare, prova a far apparire riferimenti o almeno ragioni per cui pensi che sia in un modo o nell'altro.

+6

Dato che il numero di variazioni è fisso e praticamente tutto l'hardware sarà stato implementato per calcolare il valore successivo in un ciclo, sicuramente non ci sarebbe alcun vantaggio nell'ingegnerizzazione di un ulteriore percorso speciale del caso? Non ho riferimenti, questa è solo una supposizione. Quindi non è una risposta. – Tommy

+0

Sarebbe interessante sapere se l'interpolazione è ancora una funzione fissa o anche una funzione implementata dall'hardware. Potrei immaginare che implementerebbero un assegno PRIMA di generare qualche migliaio di lavori di interpolazione dei frammenti. In quel posto potrebbe essere un po 'economico con enormi guadagni per quel caso.Tuttavia, se il suo hardware dedicato eseguisse l'interpolazione, potrebbe semplicemente dire "avvitarlo, non c'è nulla di male nell'usare una risorsa altrimenti inutilizzata". È una domanda interessante per me. –

+2

@ManuelArwedSchmidt: esiste un hardware di interpolatore dell'attributo dedicato. AMD li chiama SPI (Shader Processor Interpolators), e nel modello di shader DX11 lo shader di pixel (frammenti) è in grado di richiedere il lavoro di interpolazione su richiesta piuttosto che averlo fatto prima che lo shader inizi a funzionare. I compilatori shader realmente intelligenti potrebbero, quindi, evitare di interpolare alcuni parametri tranne durante l'esecuzione in tempo di esecuzione di rami di codice non frequenti su hardware che supporta il "pull-model". –

risposta

2

La GPU esegue l'interpolazione, indipendentemente dal fatto che sia necessaria o meno.

La ragione è molto semplice: verifica se la variabile variabile è già stato cambiato è molto costoso.


Shader sono piccoli programmi, che vengono eseguiti contemporaneamente su diversi nuclei GPU. Quindi, se si desidera evitare che due core diversi stiano calcolando lo stesso valore, si dovrebbe "prenotare" la variabile di output. Quindi hai bisogno di una struttura dati aggiuntiva (come un flag o mutex) che ogni core possa leggere. Nel tuo caso questo significherebbe che tre core diversi devono leggere lo stesso flag, e il primo deve prenotarlo se non è già prenotato.

Questo deve accadere atomicamente, il che significa che il nucleo riservando deve essere l'unico che sta impostando il flag alla volta. Per fare ciò tutti gli altri core sarebbero, ad es. deve essere fermato per un segno di spunta. Poiché non si conoscono i nuclei che stanno calcolando il vertex shader, si dovrebbero arrestare TUTTI gli altri core (su un GTX Titan questo sarebbe 2687 altri).

Inoltre, quando la variabile è impostata e un nuovo telaio è reso, tutte le bandiere dovrebbero essere ripristinato, quindi la gara per la bandiera può ricominciare.

Per concludere: è necessario hardware aggiuntivo nella GPU, che è costoso e rallenta la pipeline di rendering.


è il lavoro dei programmatori per evitare che più shader stanno producendo la stessa uscita. Quindi se stai facendo il tuo lavoro, questo non succede o sai, che evitarlo (sulla CPU) costerebbe di più che ignorarlo.

Un esempio potrebbe essere la stiching per diversi livelli di dettaglio (come su una mappa di altezza), dove la maggior parte dei metodi crea alcuni frammenti due volte. Questo è un impatto molto piccolo sulle prestazioni di rendering ma richiederebbe molto tempo di CPU da evitare.

0

Se il comportamento non è obbligatorio nella specifica OpenGL, la risposta è che dipende dall'implementazione.

I commenti e altre risposte sono quasi certamente azzeccati sul fatto che non esiste un percorso di ottimizzazione per valori identici perché non ci sarebbe molto o nessun vantaggio dalla complessità aggiunta per rendere tale percorso.