GPGPU

Da Wikipedia, l'enciclopedia libera.
Schema interno di una GPU (nVidia GeForce 6800). Notare l'elevato numero di unità parallele

La GPGPU, sigla di general-purpose computing on graphics processing units (letteralmente "calcolo a scopo generale su unità di elaborazione grafiche") è un settore della ricerca informatica che ha come scopo l'utilizzo del processore della scheda grafica, vale a dire la GPU, per scopi diversi dalla tradizionale creazione di un'immagine tridimensionale; in tale ambito di utilizzo la GPU viene impiegata per elaborazioni estremamente esigenti in termini di potenza di elaborazione, e per le quali le tradizionali architetture di CPU non hanno una capacità di elaborazione sufficiente.

Tale tipo di elaborazioni sono, per loro natura, di tipo altamente parallelo, e in grado quindi di beneficiare ampiamente dell'architettura tipica delle GPU; a tale caratteristica intrinseca, a partire dal 2007 si è aggiunta l'estrema programmabilità offerta dalle ultime soluzioni commerciali, che al succedersi delle generazioni aumentano non solo la propria potenza elaborativa ma anche la propria versatilità. Tale evoluzione delle architetture video si sta gradualmente attuando anche perché la stessa grafica 3D dei videogiochi più recenti si è enormemente trasformata nel tempo; un tempo essi erano basati su un insieme di istruzioni fisse e predefinite, ma progressivamente si sta sviluppando un approccio nel quale le GPU vengono completamente programmate utilizzando gli shader, caratteristica che apre di conseguenza anche nuovi scenari di utilizzo a questo tipo di soluzioni hardware. Tale programmabilità ha preso appunto il nome di Shader model.

Scenari tipici di elaborazione GPGPU[modifica | modifica sorgente]

È evidente che le applicazioni che sono in grado di avvantaggiarsi significativamente della potenza di calcolo delle moderne GPU sono solo una ristretta parte dell'intero panorama software, in quanto per sfruttare le caratteristiche di tali architetture è necessaria un'elevata parallelizzazione del codice, una caratteristica tipica di alcuni problemi scientifici ma non tutti; tra questi si possono citare innanzitutto l'elaborazione di immagini in genere, come per esempio quelle mediche, o di ricerca geologica tra cui la ricerca di giacimenti petroliferi e di fonti naturali, oltre che l'analisi di modelli di rischio finanziari.

Altre categorie di applicazioni sono invece caratterizzate dalla necessità di un'elevata logica di controllo del processo di calcolo e tale funzione è svolta egregiamente dalle tradizionali CPU ma in maniera altamente inefficiente dalle architetture delle GPU. Tra queste tipologie di applicazioni si possono ricordare i database, la compressione dei dati e i generici algoritmi ricorsivi.

Principali benefici dell'elaborazione GPGPU[modifica | modifica sorgente]

I benefici dell'utilizzo di una GPU per svolgere elaborazioni di tipo diverso dall'ambito grafico, sono molteplici e tra questi si possono ricordare i seguenti:

Vantaggi prestazionali[modifica | modifica sorgente]

La caratteristica più eclatante di questo tipo di utilizzo delle GPU è, come detto, l'enorme potenza teorica offerta da tali soluzioni, e di conseguenza il ridotto tempo di elaborazione, quando confrontato con analoghe elaborazioni svolte dalle CPU. Va detto comunque che il passaggio dell'elaborazione del codice verso la GPU richiede l'ottimizzazione delle applicazioni stesse al fine di integrare il supporto alle caratteristiche peculiari di tali architetture; si tratta spesso di una riscrittura totale di intere parti di codice e ovviamente gli sviluppatori devono tenere conto di tali fattori in fase di sviluppo per ovvie politiche commerciali, ma dal punto di vista puramente prestazionale si possono ottenere incrementi anche di 100 volte rispetto a quanto offerto dalle tradizionali CPU. Non si tratta quindi di incrementi del 20 o 30%, e nemmeno di un raddoppio della potenza, ma addirittura di una "centuplicazione" della potenza elaborativa, e di conseguenza i tempi di calcolo si riducono di 100 volte.

Costo d'acquisto[modifica | modifica sorgente]

Il costo di una qualunque GPU è allineato a quello di una CPU appartenente alla stessa fascia di mercato, quindi una GPU di fascia alta può venire a costare circa 600 euro, al pari di una CPU di pari fascia. Considerando che, allo stesso prezzo, una GPU è in grado di offrire prestazioni teoriche di gran lunga superiori, appare chiaro come ottimizzare i software per il corretto sfruttamento di queste architetture consenta di contenere efficacemente i costi migliorando notevolmente le cosiddette "prestazioni per watt" e di conseguenza l'efficienza dell'elaborazione.

Tasso di aggiornamento tecnologico[modifica | modifica sorgente]

Il susseguirsi delle generazioni delle architetture di GPU è decisamente più veloce rispetto alle evoluzioni disponibili nel campo delle CPU. Le architetture delle CPU, spesso durano quasi immutate per anni (l'architettura NetBurst di Intel è durata ben 6 anni) e solo dal 2005 la tendenza sta diventando quella di presentare nuove architetture ogni 2 anni (cfr. Intel Tick-Tock), mentre le architetture relative alle GPU in genere durano dai 12 ai 18 mesi massimo (in passato si sono avuti aggiornamenti di tali architetture anche in soli 6-8 mesi). Inoltre, mentre le nuove architetture di processore in genere aumentano le prestazioni, a parità di clock, del 20-30% massimo, per quanto riguarda le GPU, da anni si assiste al raddoppio puro della potenza elaborativa ad ogni nuova generazione.

Consumo/prestazioni[modifica | modifica sorgente]

Sebbene nel corso degli ultimi anni i produttori di CPU si siano impegnati molto sul fronte dell'efficienza energetica e del contenimento dei consumi massimi, i produttori di GPU sembrano aver finora ignorato tale aspetto nella progettazione delle nuove soluzioni. Tuttavia, l'enorme potenza elaborativa teorica delle GPU, compensa grandemente l'elevato livello di consumo energetico e di conseguenza il rapporto consumo/prestazioni delle diverse soluzioni è nettamente a vantaggio delle GPU rispetto alle CPU.

Generazione di un'immagine tridimensionale, attraverso una GPU[modifica | modifica sorgente]

Il processo di creazione di un'immagine tridimensionale consta dei seguenti punti:

  1. definizione dei punti (o triangoli) da disegnare
  2. trasformazione delle coordinate dei punti
  3. interpolazione dei punti per creare una figura
  4. colorazione dei pixel della figura che risultano visibili

Grazie agli shaders è possibile istruire la GPU (Graphics Processing Unit) su come comportarsi nella fase di trasformazione dei punti (Vertex shader) e nella fase di colorazione dei pixel (Pixel shader).

Principi di un'elaborazione GPGPU[modifica | modifica sorgente]

Per poter implementare un motore GPGPU bisogna astrarre una macchina di Turing equivalente dall'architettura della GPU.

Innanzitutto bisogna fare in modo che gli Shaders possano leggere dei dati in input. Per risolvere questo problema si può pensare di scrivere i dati in input in alcune texture e farle campionare dagli shaders.

Ovviamente bisognerà creare delle buone funzioni di indirizzamento in grado di tradurre le coordinate di indirizzamento (solitamente degli interi) nelle coordinate di campionamento delle texture (due valori decimali compresi tra 0 e 1).

Bisognerà poi scrivere un programma che giri sulla scheda grafica in grado di elaborare i dati letti e produrre i risultati desiderati.

Per questa fase si hanno diverse scelte di codifica:

  1. Scrivere del codice in un linguaggio assembler supportato dalle librerie grafiche utilizzate
  2. Scrivere il programma in un linguaggio di alto livello (HLSL, GLSL)

Infine bisognerà eseguire il "rendering" dei dati per produrre i risultati desiderati con l'accortezza di salvare tale output su di una texture reperibile in seguito.

Per realizzare un motore GPGPU attualmente bisogna utilizzare delle librerie grafiche che supportino lo shader model (DirectX, OpenGL). Sono comunque attivi diversi progetti per permettere al programmatore di usare il GPGPU senza dover conoscere tali librerie. I progetti più attivi possono essere trovati sul sito www.gpgpu.org

I migliori progetti[modifica | modifica sorgente]

Entrambi i principali produttori di schede video, ATI Technologies e nVidia, stanno investendo per migliorare la resa delle loro architetture nei calcoli General Purpose:

  • ATI ha introdotto l'architettura CTM (Close to Metal), che permette di utilizzare le GPU, a partire dalla serie Radeon R5xx, come processori vettoriali a virgola mobile a 32bit, con prestazioni superiori alle librerie grafiche (DirectX e OpenGL). Tale caratteristica lo rende uno strumento di calcolo molto potente per certe operazioni tra cui, nelle intenzioni di ATI, la gestione dei motori fisici dei videogiochi.
  • nVidia invece, con le schede GeForce serie 8 ha introdotto CUDA ("Compute Unified Device Architecture"), tecnologia che permette la programmazione delle GPU tramite algoritmi del linguaggio C. A giugno 2007 inoltre ha presentato la tecnologia Tesla che indica un'intera famiglia di soluzioni hardware finalizzate espressamente all'elaborazione GPGPU.

In un secondo tempo, anche Intel entrerà nel mercato delle soluzioni GPGPU, grazie al nuovo progetto Larrabee che dovrebbe essere disponibile nel corso del 2010 e sarà basato su un'architettura totalmente innovativa e differente rispetto a quella delle tradizionali GPU.

Differenze tra l'approccio ATI e quello nVidia[modifica | modifica sorgente]

L'approccio di nVidia con CUDA è certamente più semplice da acquisire da parte dei programmatori rispetto al CTM di ATI. Malgrado quest'ultimo consenta l'interazione con la GPU ad un livello più potente rispetto a quanto offerto da CUDA, rimane però anche più difficile da implementare dato che viene richiesta la conoscenza di un linguaggio di tipo assembly, in luogo del tradizionale C++ previsto dalla soluzione di casa nVidia. CTM inoltre, proprio perché basato su un linguaggio di programmazione di più basso livello, è specifico per una precisa famiglia di GPU, mentre CUDA ha dalla sua la flessibilità di poter spostare applicazioni sviluppate in qualsiasi momento, anche su future generazioni di GPU nVidia.

Voci correlate[modifica | modifica sorgente]

Collegamenti esterni[modifica | modifica sorgente]

Informatica Portale Informatica: accedi alle voci di Wikipedia che trattano di Informatica