NVIDIA Tesla: GPU G80 per elaborazioni GPGPU

NVIDIA Tesla: GPU G80 per elaborazioni GPGPU

Tesla è la nuova famiglia di prodotti NVIDIA specificamente sviluppati per elaborazioni GPGPU, dove il chip video viene utilizzato per eseguire calcoli tipicamente di competenza della CPU, ma molto più velocemente di quest'ultima. Scopriamo quali siano le caratteristiche di questi prodotti, e come una GPU possa essere utilizzata per calcoli paralleli

di pubblicato il nel canale Schede Video
NVIDIATesla
 

Perché usare le GPU per calcoli general purpose?

Gli appassionati di grafica 3D hanno potuto osservare, in questi ultimi anni, come le architetture video abbiano subito un processo di continua trasformazione che ha portato verso da una parte un realismo sempre più elevato delle scene 3D, dall'altra ad un aumento della complessità architetturale e del numero di transistor integrati all'interno delle GPU. La potenza elaborativa di un processore può essere indicata in vari modi, tra i quali uno dei più semplici ed utilizzati è indubbiamente la misura dei FLOPS, FLoating point Operations Per Second, cioè quante operazioni in virgola mobile una determinata architettura sia in grado di elaborare al secondo.

Ogni nuova architettura di processore mette a disposizione degli utenti valori crescenti di FLOPS per le elaborazioni; ad incrementi della frequenza di clock, a parità di arcitettura, conseguono ovviamente altri incrementi della potenza di elaborazione massima. La misura dei FLOPS è in genere un valore massimo teorico che prevede l'utilizzo contemporaneo e al massimo delle potenzialità di tutte le unità di elaborazione presenti in una specifica architettura; resta poi da stabilire in che misura una specifica applicazione possa sfruttare tale potenza elaborativa, o sia in qualche misura limitata nell'esecuzione pratica dal tipo di calcoli effettuati.

gpu_vs_cpu.jpg (26068 bytes)

Il grafico qui esposto evidenzia le differenze, in termini di potenza elaborativa espressa in GigaFLOPS, tra processori Intel Pentium 4 prima e Core 2 Duo poi, rispetto a quanto registrato dalle più recenti soluzioni NVIDIA partendo dalla serie GeForce FX 5800 del 2003 in avanti. E' evidente come, in termini di pura potenza elaborativa massima teorica, le GPU crescano con un tasso ben superiore alle CPU, giustificando quindi tutta l'attenzione attualmente rivolta al loro utilizzo per elaborazioni di tipo parallelo.

La GPU GeForce FX 5800 era capace di un massimo di 8 GigaFLOPS, passati a 20 con le soluzioni GeForce FX 5900 Ultra alcuni mesi dopo. Le GPU della famiglia NV40, le prime pensate per API DirectX 9 e Shader Model 3.0, hanno raggiunto con le versioni GeForce 6800 Ultra la soglia di 53 GFLOPs. G70, architettura GeForce 7800 GTX, ha portato tale limite attorno ai 200 GigaFLOPS, mentre le soluzioni GeForce 8800 GTX hanno superato i 350 GigaFLOPS.

Potenza di elaborazione in GigaFLOPS più elevata equivale a prestazioni sempre superiori? No, e per due ordini di motivi. Il primo è legato al fatto che questi sono dati massimi teorici, ottenibili in situazioni limite e quindi con software che possa sfruttare completamente tutte le unità di elaborazione presenti in una GPU o in una CPU; questo è molto difficile che accada all'atto pratico con applicazioni disponibili in commercio, se non con software sviluppati di fatto su misura per questo tipo di misurazione. L'efficienza dell'applicazione, detto in altro modo, è fondamentale per poter sfruttare le potenzialità teoriche di un'architettura hardware.

Il secondo, ben più importante, è legato alle differenze architetturali proprie tra GPU e CPU. Nelle GPU la maggior parte della circuiteria è dedicata al data processing, mentre nelle CPU buona parte è legata al flow control e al data caching: di conseguenza le CPU non sono soluzioni ideali nell'elaborazione di processi che possono essere divisi in piccoli elementi e processati in parallelo, ambito di elaborazione nel quale invece le GPU possono eccellere in quanto si tratta, per loro natura, del tipico pacchetto di dati elaborati in un'applicazione grafica 3D.

cpu_gpu_schema.gif (9271 bytes)

Confrontando le strutture di base di CPU e GPU si evidenzia chiaramente come la maggior parte dei transistor implementati all'interno di una GPU siano dedicati alle execution unit, mentre in una cpu la parte di circuiteria dedicata sia al controllo che alla cache è ben più importante. Del resto, un processore deve eseguire un singolo task il più velocemente possibile, mentre una GPU deve cercare di eseguire il maggior numero di processi in parallelo, minimizzando per ciascuno il tempo di esecuzione e massimizzando il quantitativo di dati analizzati nell'unità di tempo.

Tutte le applicazioni che sono basate su set di dati molto ampi, per le quali si richiede l'esecuzione di un elevato numero di operazioni aritmetiche, possono beneficiare dell'utilizzo di una GPU in modo massiccio: in questo scenario, infatti, uno stesso programma può essere ripetuto su vari pacchetti di dati in parallelo, con un elevato rapporto di operazioni aritmetiche eseguite rispetto a quelle sulla memoria. In un tradizionale approccio di elaborazione con CPU si utilizza un programma singolo che viene riprocessato sui dati da elaborare in modo sequenziale, risultando quindi essere più dipendente dalla memoria sia di sistema che cache interna al processore.

 
^