Nel frattempo

CUDA, il nuovo linguaggio di programmazione per le GPU Nvidia, promette grandi risultati e mostra le schede video sotto una nuova luce. Cerchiamo di capire un po' di più cosa ci riserva CUDA.

Avatar di Andrea Ferrario

a cura di Andrea Ferrario

Editor in Chief

Nel frattempo?

Nel frattempo, mentre i produttori di CPU si strappavano i capelli per trovare una soluzione ai loro problemi, i produttori di GPU continuavano a beneficiare, più di sempre, della legge di Moore.

Perché i problemi riscontrati con le CPU non affliggevano le GPU? La ragione è molto semplice: le CPU sono progettate per offrire le massime prestazioni gestendo un flusso di istruzioni, che operano su dati differenti (come i calcoli integer o floating-point), da accessi random alla memoria, branching, etc. Per gestire questa mole di lavoro i progettisti si orientavano all'esecuzione di più istruzioni in parallelo. La "super scalar execution" dei Pentium rendeva possibile il lancio di due istruzioni per ciclo di clock, sotto certe condizioni. Il Pentium Pro introdusse la "out-of-order execution" (OoOE), per ottimizzare al massimo l'uso delle unità di calcolo. Il problema è che c'è sempre un limite al parallelismo, poiché esiste sempre un unico flusso di istruzioni, e l'incremento del numero di unità di calcolo non risolve il problema, poiché queste rimarrebbero inutilizzate per la maggior parte del tempo.

Diversamente, il metodo operazionale di una GPU è deliziosamente semplice. Il lavoro consiste nel prendere un gruppo di poligoni, da una parte, e di generare un gruppo di pixel, dall'altra. I poligoni e i pixel sono indipendenti gli uni dagli altri, e quindi possono essere elaborati tramite unità parallele. Questo significa che una GPU può dedicare una buona parte del suo die alle unità di calcolo che, diversamente dalle CPU, saranno utilizzate.

Le GPU si differenziano anche per un altro aspetto, vale a dire la coerenza nell'accesso alla memoria: quando un texel viene letto, pochi cicli dopo verrà letto il texel vicino, e quando un pixel viene scritto, pochi cicli dopo verrà scritto il pixel vicino. Organizzando la memoria in maniera intelligente, le prestazioni si avvicineranno molto al bandwidth teorico. Questo significa che una GPU, diversamente da una CPU, non ha bisogno di molta cache, poiché il suo ruolo principale è di accelerare le operazioni di texturing. Pochi kilobyte sono tutto il necessario per contenere alcuni texel usati per i filtri bilineari e trilineari.