Matrici Single Instruction Multiple Data

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

Matrici Single Instruction Multiple Data

Come menzionato in precedenza, ATI ha usato nelle sue matrici delle very large instruction Words (VLIW), con lunghezza di 64 o 128 bit.  La società ha scelto questo approccio siccome ogni matrice è composta da un certo numero di stream processor (80 per la HD 2900 XT). Ogni stream processor ha a sua volta 5 processori shader superscalari, un'unità di branch execution e dei registri a scopo generico (GPR) dove immagazzinare dati d'input, valori temporanei e dati d'output.

In  tutto ci sono approssimativamente 6 TB/s di ampiezza di banda per tutti gli stream processor. Ogni operazione di lettura/scrittura agisce su 32 bit, che possono essere combinati per giungere a 64 o 128 bit.

Per rendere il tutto efficiente, ogni unità deve lavorare in maniera indipendente da ciascun altra in modo super scalare. L'arbitraggio delle SIMD e i prelievi dalle cache sono eseguiti contemporaneamente alle istruzioni durante ogni singolo ciclo.

SIMD Arrays

ATI ha diviso la vector unit in quattro unità scalari. Dal precedente progetto, ATI ha preso le cinque ALU per gestire un Vec4+1 o vettore più scalare. L'azienda ha utilizzato proprio la stessa sistemazione ma l'ha resa superscalare e indipendente. Non è più in un formato vettoriale. Ci sono cinque unità scalari, ognuna in grado di gestire operazioni floating point MADD e integer.

L'unità più grande effettua alcune funzionalità aggiuntive che ATI non ha voluto distribuire su tutte le unità disponibili. Alcune di queste operazioni sono, per esempio, la conversione float-to-fixed o altre operazioni trascendentali come il sin, cos, log, square root, e, pi, e altri calcoli. Questa assomiglia molto all'unità specializzata presente all'interno del chip G80 di Nvidia. Questi calcoli "speciali" sono fatti meno frequentemente rispetto altre istruzioni fondamentali, quindi ATI ha pensato che una sola unità su cinque sia sufficiente. Operazioni di tipo MADD sono più popolari per quanto riguarda i vertex, mentre per i pixel non è così. In questo caso operazioni trascendentali sono necessarie, per esempio, per la normalizzazione che può impattare notevolmente sulle prestazioni. Al momento, tuttavia, ATI afferma che tali operazioni non sono un problema, e non lo saranno nemmeno per prossimo futuro.

Ancora una volta ATI utilizza un'unità di branch execution poiché ci sono due tipi di branch. Uno molto pesante, che necessità che l'intero SIMD lavori a un'intera nuova parte di codice. Questo è gestito da sequencer, arbitri e ultra dispatch processor (controller). In altri casi, ha invece più senso gestire il codice tramite "predizione", saltando una o due istruzioni anziché effettuare istruzioni semplici. Questa "predizione" può essere gestita direttamente dall'ALU.

Collegata alle ALU c'è un'ampia fetta di memoria per l'archiviazione dati. Stiamo parlando dei GPR, cioè General Purpose Register. In questi registri vengono immagazzinati tutte le variabili dei thread dormienti, come i risultati di vari calcoli o i dati necessari per altri calcoli.

Con gli shader unificati le risorse a disposizione sono le stesse per ogni tipo di calcolo. Non dovrebbe esserci nessun vantaggio per vertex, pixel o gemoetry shader poiché si tratta solo di istruzioni che devono essere eseguite, qualsiasi sia lo shading.

Un nuovo hardware è accompagnato da nuove idee su come utilizzarlo. Gli sviluppatori hanno un approccio diverso rispetto a quanto accadeva in passato. Un esempio che abbiamo visto è la tesselizzazione da una displacement map per creare un ambiente geometricamente molto complesso, come succede con la demo di Ruby.