Spesso in serata, dopo la classica giornata di lavoro, mi piace dedicare parte del mio tempo a chattare con amici che condividono con me la passione per l’informatica e la sua evoluzione tecnologica e nel corso di una delle più recenti chattate con il caro amico Gabriele (alias ATi7500) è emerso un argomento che reputo molto interessante. Il mio breve intervento di oggi, quindi, ha lo scopo di stimolare una riflessione sul fenomeno che vede il confine tra elaborazione hardware e software assottigliarsi. Innanzitutto direi che è il caso di definire cosa si intende per elaborazione hardware e software.
Quando uscirono le prime schede dedicate alla grafica tridimensionale in ambito consumer, parliamo dei primi anni 90, si iniziò ad utilizzare diffusamente la frase “grafica accelerata in hardware”. Ma cosa significavano esattamente queste tre parole?
Essenzialmente si parla di accelerazione in hardware quando si demanda ad un hardware specifico un’elaborazione che, altrimenti, avrebbe dovuto compiere il processore. Restando sempre nell’ambito della grafica tridimensionale, inizialmente i primi motori grafici 3D visualizzavano modelli a tre dimensioni facendo eseguire tutti i calcoli geometrici direttamente alla CPU di sistema.
Questo è possibile perché le CPU dei personal computer hanno un instruction set, cioè un set di istruzioni, ed un’architettura general purpose, in grado di eseguire un esteso numero di operazioni. La generalità delle CPU e la loro flessibilità consentono ad un programmatore software di scrivere tutte le istruzioni richieste per i fini più disparati, compresa l’elaborazione della grafica tridimensionale.
Al contrario un’operazione si definisce accelerata in hardware quando la sua elaborazione non è stata eseguita dalla CPU, ma da un hardware specificatamente sviluppato e progettato per assolvere ad un compito. Questo, tuttavia, non deve far intendere che nel caso dell’elaborazione in hardware chi sviluppa il software abbia meno lavoro da compiere.
In realtà dipendentemente dai casi, accade in maniera più o meno marcata che da un lato determinate funzionalità sono demandate all’hardware attraverso delle specifiche API di programmazione, mentre dall’altro deve essere fatta una programmazione specifica con quell’API, meno generale e, conseguentemente, più limitata.
L’evoluzione dell’informatica e, in particolare, delle sue applicazioni a vocazione multimediale (elaborazione della grafica tridimensionale, decodifica video, fisica, audio, ecc…) ha subito nel corso della sua evoluzione un percorso di generalizzazione da parte dei processori grafici e, seppur in maniera più lieve, di specializzazione da parte dei microprocessori.
Nel primo caso, infatti, le GPU a partire dall’introduzione dei vertex e pixel shader con le DirectX 8, hanno smesso di essere pezzi di silicio che eseguono solo poche e ben delineate operazioni, per diventare chip programmabili. Nel secondo caso, invece, fin dall’introduzione delle istruzioni multimediali MMX, proseguendo con i successivi set di istruzioni SIMD (Single Instruction Multiple Data), si è tentato di migliorare le prestazioni dei processori nei calcoli vettoriali, proprio quelli più comunemente eseguiti dai processori grafici.
Le strade intraprese sembrano essere destinate ad un incrocio se osserviamo attentamente diversi fattori. La programmabilità dei processori grafici è divenuta tale che ATI ed NVIDIA rispettivamente con le tecnologie Stream e CUDA, propongono modelli di programmazioni atti a sfruttare le GPU anche per compiti diversi dal calcolo della grafica tridimensionale.
I primi frutti in questa direzione si stanno già raccogliendo con applicazioni in vari ambiti (ricerca scientifica, transcodifica video, montaggio video, ritocco fotografico, ecc…) che già sono accelerate in hardware. Sempre a tal proposito la finalizzazione nel mese di Dicembre dello scorso anno di OpenCL 1.0, un’API per lo sviluppo di applicazioni orientate all’elaborazione, non potrà che favorire ulteriormente questo trend.
E per quanto riguarda le CPU? Intel non è rimasta di certo che le mani in mano e con il suo progetto Larrabee, basato su molteplici core simil-Pentium in parallelo, intende sfruttare l’attuale diffusione della programmazione su instruction set x86 per presentare un prodotto che, in teoria, sarà utilizzabile dalle applicazioni senza variare il modello di sviluppo software, a tutto vantaggio della rapidità di adozione.
A questo punto vi lancio un quesito: a fronte della strada tracciata da AMD, NVIDIA ed Intel, per quanto tempo ancora avrà senso distinguere l’elaborazione hardware da quella software?