Elaborazione su GPU
Questo termine indica l'utilizzo di una GPU (unità di elaborazione grafica) per l'esecuzione generale dei calcoli scientifici e tecnici.
Normalmente si utilizzano una CPU e una GPU insieme per ottenere un modello di elaborazione eterogeneo. La parte sequenziale dell'applicazione viene eseguita sulla CPU, mentre la parte a maggiore densità di calcolo viene eseguita sulla GPU. Dal punto di vista dell'utente, l'esecuzione dell'applicazione risulta più rapida perché l'alta velocità della GPU viene sfruttata per migliorare le prestazioni.

Lo sviluppatore deve modificare l'applicazione per mappare i kernel ad alta densità di calcolo per l'elaborazione sulla GPU. La parte restante dell'applicazione rimane sulla CPU. Per mappare una funzione sulla GPU, è necessario riscriverla per esporre il parallelismo della funzione e aggiungere le parole chiave “C” appropriate per spostare i dati da e verso la GPU.
L'elaborazione su GPU è possibile grazie all'architettura massivamente parallela delle GPU NVIDIA, la cosiddetta architettura CUDA. L'architettura CUDA consiste di centinaia di core di elaborazione che operano insieme per “macinare” il set di dati nell'applicazione.
La serie di GPU Tesla 10 rappresenta l'architettura CUDA di seconda generazione, dotata di funzioni ottimizzate per le applicazioni scientifiche quali il supporto di componenti hardware in virgola mobile a doppia precisione secondo lo standard IEEE, cache di dati locali in forma di memoria condivisa distribuita nell'intera GPU, coalescenza degli accessi alla memoria e così via.
Prof. Jack Dongarra
Direttore dell'Innovative Computing Laboratory
University of Tennessee
Storia dell'elaborazione su GPU
I chip grafici sono nati originariamente come pipeline grafiche a funzione fissa. Nel corso degli anni, questi chip grafici sono diventati sempre più programmabili, fino a quando NVIDIA ha presentato la prima vera e propria GPU (Graphics Processing Unit). Negli anni 1999-2000, gli studiosi di informatica e alcuni ricercatori specializzati nell'acquisizione di immagini medicali e nell'elettromagnetismo hanno iniziato a utilizzare le GPU per l'esecuzione di applicazioni di calcolo generiche. Hanno così osservato che le eccellenti prestazioni in virgola mobile delle GPU permettevano di migliorare le prestazioni di varie applicazioni scientifiche. È nato così il movimento denominato GPGPU (General Purpose computing on GPUs).
Il problema dell'elaborazione GPGPU era la necessità di utilizzare linguaggi di programmazione grafici come OpenGL e Cg per programmare la GPU. Gli sviluppatori dovevano perciò rendere le applicazioni scientifiche simili ad applicazioni grafiche, mappandole in problemi traducibili in triangoli e poligoni. Questo requisito limitava la possibilità di sfruttare le potenti prestazioni delle GPU per scopi scientifici.
NVIDIA ha reso possibile l'applicazione di questo enorme potenziale di prestazioni a vantaggio dell'intera comunità scientifica e ha deciso di investire per modificare la GPU, in modo da renderla interamente programmabile per le applicazioni scientifiche e aggiungendovi il supporto per linguaggi ad alto livello come C e C++. Da questa iniziativa è nata l'architettura CUDA per la GPU.
Architettura parallela e modello di programmazione parallelo CUDA
L'architettura hardware parallela CUDA è accompagnata dal modello di programmazione parallelo CUDA, basato su un insieme di astrazioni che permettono di esprimere sia i dati “fine-grained” che quelli “coarse-grained” e il parallelismo dei task. Il programmatore può scegliere di esprimere tale parallelismo in linguaggi ad alto livello come C, C++, Fortran o in API per driver come OpenCL™ e DirectX™-11 Compute.

Il primo linguaggio supportato da NVIDIA è stato il linguaggio C. Un insieme di strumenti di sviluppo software in C per CUDA permette di programmare la GPU utilizzando il linguaggio C con un set minimo di parole chiave o estensioni. Prossimamente verrà reso disponibile il supporto per Fortran, OpenCL e altri linguaggi.
Il modello di programmazione parallela CUDA permette ai programmatori di suddividere il problema in unità secondarie meno complesse, che possono essere risolte una per una parallelamente. Il parallelismo fine-grained dei sotto-problemi viene quindi espresso, in modo che ogni sotto-problema possa essere risolto in modo collaborativo in parallelo.
OpenCL è un marchio di Apple Inc. utilizzato su licenza da Khronos Group Inc.
DirectX è un marchio registrato di Microsoft Corporation.