View Single Post
Old 25-11-2009, 17:34   #8317
skizzo99999999
Member
 
Iscritto dal: Oct 2006
Messaggi: 102
Quote:
Originariamente inviato da yossarian Guarda i messaggi
finalmente, al termine della vicenda, è venuto fuori dove si trova questo benedetto compilatore
Quello che hai detto è tuto giusto e infatti è quello che avviene. Ma un conto è scrivere codice dicendo:"al posto dell'istruzione x esegui l'istruzione y", un altro è fare in modo che questo avvenga senza hit prestazionali.
Tu hai descritto quello che si fa quando si opera uno shader replacement o anche la semplice sostituzione di un'istruzione, a livello di compilatore. Però il codice che arriva alla gpu non è scritto, nel caso specifico con l'istruzione y ma arriva con l'istruzione x; la gpu si accorge che gli è arrivata l'istruzione x solo dopo che l'ha prelevata, l'ha letta e l'ha decodificata. Finchè non capisce di cosa si tratta non può operare nessun tipo di sostituzione. Però sa che non deve eseguire l'istruzione x, quindi quando legge x la rimpiazza con y e questo deve farlo per tutte le x presenti nel programma. Ora, ragionando terra terra, all'interno di un chip ogni step richiede almeno un ciclo di clock. Quindi se "prelevo l'istruzione x dal registro, e la decodifico" ho impiegato almeno due cicli (uno per prendere l'istruzione e l'atro per leggerla). Se devo mandarla in esecuzione impiegherò almeno un altro ciclo. Se devo sostituirla anche (perchè quello che leggo è x non y e la trasformazione di x in y non è gratuita).
Quindi, un hit prestazionale per effettuare la sostituzione dell'istruzione comunque ci sarà.
Io non dico che la sostituzione non comporti nessun rallentamento nella compilazione, anche se non credo sarà rilevante, ma questo non è il punto. Mettiamo che il rallentamento ci sia e non sia trascurabile. E allora? mica lo fa la GPU durante il rendering della scena, lo fa il driver (o chi per lui all'interno del driver) durante la glCompileShader o glLinkProgram o similari, che non penso esegue la GPU ma la CPU istruita dal driver, ma comunque non farebbe nessuna differenza anche se lo eseguisse la GPU. Una volta che sarà finita questa traduzione, lo shader è compilato, caricato nella vram (o dovunque vengano messi gli shader compilati e pronti per essere usati) con le sue belle FMA invece che MADD.
Ripeto, non ho la presunzione di sapere con certezza se si può fare, ma dire che per farlo SICURAMENTE bisogna farlo fare "al volo" (e quindi ogni volta) alla GPU mi sembra azzardato.
Provo a fare un esempio. Prendiamo un pezzo di codice GLSL

vec4 a;
vec4 b;
a=b+3;

se b è un vettore di 4 float che valgono tutti 50, a diverrà un vettore di 4 float che varrà 53. Penso che qui qualche madd ci sia...
Il codice GLSL non contiene MADD, ma istruzioni ad alto livello. il compilatore del driver lo compilerà UNA VOLTA SOLA e li si che ci saranno le madd. Ora è così difficile che invece che le MADD il compilatore metta le FMA? francamente mi sembra di no. Poi non dico che non ci siano altri impedimenti, ma dire che il compilatore deve per forza tradurre in MADD che poi la GPU al volo dovrà "trasformare" in FMA ogni volta mi sembra contro la logica.
E' proprio questo che non capisco, e penso che sia quello che non capisce nemmeno devAngnew (anche se è difficile interpretare il pensiero altrui).
skizzo99999999 è offline