Perché la pipeline programmabile (GLSL) è più veloce della pipeline fissa?


27

Quindi mi sto insegnando GLSL e sto cercando di capire perché si suppone che sia più veloce della pipeline a funzione fissa.

Il motivo per cui sto avendo un problema è che dalla mia comprensione, gli shader che crei stanno sostituendo sezioni della pipeline che erano lì prima. Quindi, come sta semplicemente fornendo la tua versione per velocizzare le cose?

L'unica cosa che posso pensare è che se hai provato a fornire la tua equazione di illuminazione prima, dovresti fare il calcolo sulla CPU, ma ora puoi fare i calcoli sulla GPU che saranno più veloci.

Lo capisco correttamente?


Stai chiedendo se è più veloce creare le tue versioni delle funzioni esistenti o se è più veloce scaricare le funzioni che stavi calcolando sulla CPU?
MichaelHouse

Ho trovato un post su gamedev.net che risponde alle mie domande.
Joey Green,

2
Vedo. Dovresti pubblicare una risposta al riguardo qui, in modo che altri possano trarne beneficio. Forse chiarendo la tua domanda nel processo.
MichaelHouse

@ joey-green, per favore, collega il gamedev.net qui. Sarei utile per le persone che si imbatteranno in questa domanda.
Quazi Irfan,

1
Per confondere di più le cose, nei miei test la pipeline fissa potrebbe effettivamente essere più veloce degli shader, almeno in casi semplici; vedi sol.gfxile.net/instancing.html
Jari Komppa il

Risposte:


27

Gli shader che crei non saranno la tua versione della pipeline a funzione fissa (FFP), ma operazioni personalizzate di manipolazione dei vertici e dei pixel per ottenere qualcosa di interessante e complesso.

Molte cose che fai tramite pipeline programmabile (PP) funzioneranno più velocemente delle loro possibili implementazioni FFP, perché PP riduce il numero di passaggi o la quantità di magia combinatore e cubemap richiesta per rendere queste cose ipotetiche in FFP.

Immagina di implementare una cosa così comune come l'illuminazione per pixel in FFP con solo i dati di vertice interpolati e la trama del campione nelle tue mani. Non è nemmeno possibile farlo "onestamente", solo hack per casi speciali che dipendono da cubemap fedeli precalcolate e da alcune miscele serie. Con PP diventa una questione di colorazione di un prodotto punto tra direzione della luce e vertice normale.

Tutto sommato, PP diventa lento e impossibile in veloce e possibile. Ma se decidi di scrivere uno shader per implementare gli stessi algoritmi utilizzati in FFP, scoprirai che FFP sarà leggermente più veloce perché è molto ottimizzato dall'hardware.


1
Bella risposta ... +1.
Amir Zadeh,

@Verde Non ne sono sicuro. Manca il punto in qualche modo. La risposta di Kylotan è molto più appropriata per la vera domanda.
Chris dice Reinstate Monica il

14

In termini teorici la pipeline programmabile è più lenta della pipeline a funzione fissa. Nessun processore generico può competere con un case processor speciale. La pipeline a funzione fissa originale era poco più di un gruppo di porte logiche in una linea che è il più veloce possibile teoricamente.

Tuttavia, in questi giorni la pipeline programmabile è la norma. Quindi l'hardware è invece orientato verso la pipeline programmabile. Avendo perso le efficienze iniziali di avere un circuito creato appositamente per un determinato flusso di dati, deve accogliere il caso più comune, che è l'approccio basato sullo shader. Tuttavia, per le opzioni di retrocompatibilità, la pipeline delle funzioni fisse è ancora disponibile, ma il costo è che le vecchie funzioni fisse devono essere trasferite in shader, il che potrebbe comportare un costo. Questo spiegherebbe la differenza di prestazioni.


1

Il motivo principale che mi viene in mente è una fase della pipeline fissa, che il tuo programma non ne ha bisogno. ad esempio immagina un gioco in cui tutte le luci sono statiche, puoi facilmente implementare uno shader che non prova nemmeno a calcolare la luce dinamica. in questo caso lo shader corre più veloce di uno shader precompilato che sta controllando alcune equazioni per la luce dinamica (uno shader generico). ci sono anche altri esempi, puoi facilmente pensare a molti aspetti che dovrebbero essere considerati per una pipeline fissa ma puoi ignorare l'implementazione nei tuoi codici GLSL.


1

Esatto, i tuoi shader stanno sostituendo parti della pipeline. Ma spesso i tuoi shader sono specializzati verso un effetto specifico che desideri ottenere e non gestiscono tutte le possibili funzioni speciali che potrebbero essere attivate, quindi sono più semplici di uno shader che emula l'intera pipeline a funzione fissa. Considerando che il percorso delle funzioni fisse deve prendere in considerazione molte cose e funzionalità OpenGL che potresti non voler usare (o di cui non hai nemmeno sentito parlare).

E i giorni in cui è stata eseguita la funzione fissa in hardware speciale (opposto a un hardware completamente programmabile) sono finiti, ciò che probabilmente accade quando si utilizza la pipeline a funzione fissa è che il driver carica solo i propri shader speciali che implementano il percorsi a funzione fissa. Ma questi potrebbero essere molto complessi, per fornire ogni caratteristica offerta dalla pipeline a funzione fissa.


"ciò che probabilmente accade quando si utilizza la pipeline a funzione fissa è che il driver carica solo i propri shader speciali che implementano i percorsi a funzione fissa." ..Sei sicuro di questo? Potete per favore fornire qualche risorsa affidabile? Grazie.
Quazi Irfan,

@iamcreasy Non ho una fonte affidabile (quindi probabilmente), devo ammetterlo. Ma dubito fortemente che le schede grafiche di oggi (che sono solo un mucchio di molti piccoli processori), abbiano ancora hardware dedicato per l'illuminazione informatica o i calcoli della nebbia. Invece è più probabile che caricino solo programmi precompilati per questo nelle specifiche fasi dello shader (se questi provengono dal driver o da una memoria ROM, non lo so).
Chris dice di reintegrare Monica il

@iamcreasy secondo nouveau wiki nouveau.freedesktop.org/wiki/CodeNames , la pipeline fissa è stata rimossa in GeForce 6xxx.
DirtY iCE,

"ciò che probabilmente accade quando si utilizza la pipeline a funzione fissa è che il driver carica solo i propri shader speciali che implementano i percorsi a funzione fissa." Vero. "Ma questi potrebbero essere molto complessi, per fornire ogni caratteristica offerta dalla pipeline a funzione fissa." Un buon driver genererà shader solo per la funzionalità che hai abilitato.
Chris,
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.