Come funziona il tutto? Efficienza, Parallelismo e Latenze

Dopo aver fatto una panoramica sulla nuova scheda ATI/AMD HD 2900 XT è giunto il momento di entrare più nel dettaglio con un approfondimento tecnico sull'architettura del chip R600.

Avatar di Andrea Ferrario

a cura di Andrea Ferrario

Editor in Chief

Come funziona il tutto? Efficienza, Parallelismo e Latenze

Perché AMD mette in pista così tanti thread e arbitra tutte le risorse? Perché non eseguire le operazioni passo per passo, sequenzialmente come faremmo noi esseri umani? Il motivo sta nella continua ricerca della riduzione della latenza. Per eseguire un compito o prelevare un dato serve tempo. Se lo shader dice "vai a prelevare una texture", anche se da cache, deve prima eseguire un calcolo "leave of detail" (LOD) sull'indirizzo della texture, fare un controllo di cache, ottenere i dati dalla cache, filtrarli e infine trasferirli. Questo processo può richiedere almeno una dozzina di cicli. Se c'è un cache miss, ovvero il dato non esiste in cache e va caricato da più lenta memoria esterna DRAM, possono passare centinaia di cicli, se non migliaia.

Nella realtà non c'è solo la singola unità dell'esempio in azione, ma anche altre componenti hadware che avviano richieste di memoria in continuazione e contemporaneamente o quasi. Secondo AMD ci possono essere più di 80 client in lettura e ognuno vuole prelevare qualcosa dalla memoria. Fortunatamente l'ampiezza di banda della memoria è aumentata a 105GB/s usando GDDR3 e 160 GB/s con GDDR4.

A fronte di una banda così ampia, però,  c'è una moltitudine di client che ne chiedono ancora di più. Mentre è importante che questi possano continuare a fare richieste, è ancora più importante non rispondere a tutti subito. Le richieste vanno prima organizzate in modo da ottimizzarle per un migliore uso della memoria, cercando per esempio di prelevare tutti i dati possibili su pagine di DRAM già aperte.  Per mantenere livelli di banda elevati bisogna sfruttare quindi la memoria in maniera molto efficiente. Per fare ciò bisogna che le varie componenti del sistema si abituino ad aspettare. Come anticipato è normale che per i dati ci siano attese di dozzine, centinaia e anche migliaia di cicli.

È proprio per camuffare queste latenze che il sistema lavora in parallelo. Quando l'hardware termina un'operazione su un certo dato, lo congela in attesa di poterci eseguire l'operazione successiva. Nel frattempo, l'hardware risveglia o preleva un altro thread e ci lavora, per poi rimetterlo a dormire e via dicendo.

Un processore può lavorare solo pochi thread contemporaneamente, mentre una GPU ne può accomodare a migliaia. ATI adotta un workload di 16 pixel per thread. Se li moltiplichiamo per il numero di thread, scopriamo che in ogni momento ci sono negli shader decine di migliaia di pixel. Con questa grossa mole di lavoro in parallelo, non dovrebbero esserci problemi a mascherare le latenze.

Leggi altri articoli