Le GPU moderne hanno molte unità di ombreggiatura parallele. Mi piacerebbe sapere come viene gestita la cache delle trame in quello scenario.
Le GPU moderne hanno molte unità di ombreggiatura parallele. Mi piacerebbe sapere come viene gestita la cache delle trame in quello scenario.
Risposte:
Al livello superiore, una GPU è suddivisa in un numero di shader core. Una piccola GPU in un notebook o tablet può avere solo pochi core mentre una GPU desktop di fascia alta può avere dozzine.
Oltre ai core shader ci sono anche unità di texture. Possono essere raggruppati con un'unità di trama per core shader o un'unità di trama condivisa tra due o tre core shader, a seconda della GPU.
L'intero chip condivide una singola cache L2, ma le diverse unità avranno singole cache L1. Le unità di trama hanno cache di trama e le unità shader hanno cache di istruzioni e costanti / uniformi e forse una cache separata per i dati del buffer a seconda che i carichi di buffer siano o meno un percorso separato dai carichi di trama (varia in base all'architettura GPU).
Le unità texture funzionano in modo indipendente e asincrono dai core shader. Quando uno shader esegue una lettura della trama, invia una richiesta all'unità trama attraverso un piccolo bus tra di loro; lo shader può quindi continuare l'esecuzione, se possibile, oppure può essere sospeso e consentire l'esecuzione di altri thread shader mentre attende che la trama venga letta.
L'unità texture raggruppa un sacco di richieste ed esegue la matematica di indirizzamento su di esse: selezionando i livelli di mip e l'anisotropia, convertendo gli UV in coordinate texel, applicando le modalità clamp / wrap, ecc. Una volta che sa di quali texel ha bisogno, li legge attraverso il gerarchia della cache, allo stesso modo in cui la memoria legge funziona su una CPU (cerca prima in L1, se non lì poi in L2, quindi in DRAM). Se molte richieste di texture in sospeso vogliono tutte lo stesso o vicino texel (come fanno spesso), allora ottieni molta efficienza qui, poiché puoi soddisfare molte richieste in sospeso con solo poche transazioni di memoria. Tutte queste operazioni sono pipeline, quindi mentre l'unità texture è in attesa di memoria su un batch, può fare la matematica di indirizzamento per un altro batch di richieste, e così via.
Una volta che i dati tornano, l'unità texture decodificherà i formati compressi, eseguirà la conversione e il filtro sRGB come necessario, quindi restituirà i risultati al core dello shader.